微信公众号开发之订阅号如何获取用户信息(一)

最近在作微信的公众号的开发。以前是在一个认证过的微信服务号上开发一些相应的功能。java

好比说 对认证过的微信服务好进行 自定义菜单的开发,模板消息的回复以及关键词回复的功能。api

可是目前新接了这样一个需求:要为一个微信的订阅号作一个相似于推广的活动,这样就须要获取登陆这个活动的用户的信息,从而判断该用户有没有关注过改订阅号之类的功能。这样就须要让该微信订阅号获取到该用户的我的信息。浏览器

这个功能其实咱们已经在微信的服务号上实现了,这里来回顾一下具体是如何实现的。tomcat

咱们先来看微信公众号开发的文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 之微信网页受权章节。微信

若是咱们要在微信中打开一个第三方的网页,公众号能够经过微信网页受权机制,来获取用户的基本信息,进而实现业务逻辑。这是文档中的原话。通俗的讲,微信也能够认为是一个浏览器,咱们发给某我的一个连接,一点这个连接,微信会打开相关的页面。可是如何让微信知道是哪一个用户打开了这个页面呢,这样就须要获取到一个用户的信息,固然及时微信获取了用户的信息,也不是全部的信息都能获取到,仅仅能获取到用户的昵称,所在城市,性别等信息,获取不到微信号的,固然是能够获取一个openid,也就是微信号的一个编码,经过openid来区分用户。app

咱们再来看看文档,文档中写到,微信公众号请求用户网页受权以前,得先获取网页受权的接口,也就是说须要到开发 - 接口权限 - 网页服务 - 网页账号 - 网页受权获取用户基本信息”的配置选项中,修改受权回调域名。微信公众平台

1.须要获取该接口权限jsp

2.须要填写相关域名。网站

而后用户访问的连接url须要按照微信给的格式进行连接,也就是说你转发给别人的连接或者分享的二维码对应的连接须要按照微信的格式:编码

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect


其中appId是该微信公众号的appId, redirect_uri的值为一个天转到你的页面的地址,这里我说的可能不是太通俗易懂,那么这里借用别人的话:

这个redirect_url 就是 一个项目的映射地址,当用户点击当即体验超连接的时候,会跳转到受权登陆页面,当点击受权登陆以后微信公众平台会回调这个地址,并在这个地址上追加code和state参数值

http://www.example.com/oauth2.do?code=0419p3Cc0YxTtG1nadCc0Ms7Cc09p3C8&state=1 此时咱们在页面的代码中能够获取到code.


那我项目中的一个例子来说:

我访问的 地址: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx40e06c595a46ca58&redirect_uri=http%3A%2F%2Fwww.17cooltech.com%2Fxledu_wx%2Flink%2Fforward.jsp%3FappId%3Dwx40e06c595a46ca58%26linkAction%3D4&response_type=code&scope=snsapi_base&state=789#wechat_redirect 

我这里跳转到我一个tomcat项目中的forward.jsp 页面中了,而在 forward.jsp 中就能够得到code 

<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	String appId = request.getParameter("appId");
	String code = request.getParameter("code");
	System.out.println("appId:"+appId+", code:"+code);
	
	String linkAction = request.getParameter("linkAction");
	if(linkAction==null){
		linkAction = "0";
	}
	String linkValue = request.getParameter("linkValue");
	if(linkValue==null){
		linkValue = "0";
	}
%>

固然得到这个code 以后就能够得到相应的openId  从而就能够区分出用户来了。


可是这个认证过的服务好实现的办法,订阅号能够吗? 

我试了下,将上述的 地址中的appId换成是订阅号的appId ,可是结果发现不行,一点连接告我“Scope 参数错误或没有Scope权限”。

这是为何呢,由于发现订阅中没有获取到微信网页受权接口的权限,即如图:



订阅号没法得到该接口权限。然然后面的事情就比较尴尬了,订阅号没有此接口,就没法获取到用户的信息。可是怎么办呢,经过各类查网上的信息,发现订阅号是能够得到微信的openId 的 ,那就是在微信开放平台 将一个订阅号和服务号作绑定,而后让订阅号借用服务号的接口 。可是这种方法尚未验证。可是已经有例子了:

在方倍工做室的网站上有这样的需求


可是前提条件是先到微信开放平台作绑定,那今天就先到这儿,写的比较啰嗦,主要想把过程记录下来。