最近在做微信的公众号的开发。之前是在一个认证过的微信服务号上开发一些相应的功能。
比如说 对认证过的微信服务好进行 自定义菜单的开发,模板消息的回复以及关键词回复的功能。
但是目前新接了这样一个需求:要为一个微信的订阅号做一个类似于推广的活动,这样就需要获取登录这个活动的用户的信息,从而判断该用户有没有关注过改订阅号之类的功能。这样就需要让该微信订阅号获取到该用户的个人信息。
这个功能其实我们已经在微信的服务号上实现了,这里来回顾一下具体是如何实现的。
我们先来看微信公众号开发的文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 之微信网页授权章节。
如果我们要在微信中打开一个第三方的网页,公众号可以通过微信网页授权机制,来获取用户的基本信息,进而实现业务逻辑。这是文档中的原话。通俗的讲,微信也可以认为是一个浏览器,我们发给某个人一个链接,一点这个链接,微信会打开相关的页面。但是如何让微信知道是哪个用户打开了这个页面呢,这样就需要获取到一个用户的信息,当然及时微信获取了用户的信息,也不是所有的信息都能获取到,仅仅能获取到用户的昵称,所在城市,性别等信息,获取不到微信号的,当然是可以获取一个openid,也就是微信号的一个编码,通过openid来区分用户。
我们再来看看文档,文档中写到,微信公众号请求用户网页授权之前,得先获取网页授权的接口,也就是说需要到开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。
1.需要获取该接口权限
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";
}
%>
但是这个认证过的服务好实现的办法,订阅号可以吗?
我试了下,将上述的 地址中的appId换成是订阅号的appId ,但是结果发现不行,一点链接告我“Scope 参数错误或没有Scope权限”。
这是为什么呢,因为发现订阅中没有获取到微信网页授权接口的权限,即如图:
订阅号无法获得该接口权限。然而后面的事情就比较尴尬了,订阅号没有此接口,就无法获取到用户的信息。但是怎么办呢,通过各种查网上的信息,发现订阅号是可以获得微信的openId 的 ,那就是在微信开放平台 将一个订阅号和服务号做绑定,然后让订阅号借用服务号的接口 。但是这种方法还没有验证。但是已经有例子了:
在方倍工作室的网站上有这样的需求
但是前提条件是先到微信开放平台做绑定,那今天就先到这儿,写的比较啰嗦,主要想把过程记录下来。