微信公共号的开发和传统的web项目开发的主要区别是用户登录授权,而且用户和第三方服务器的交互都经过了微信服务器。
详细说明就是,用户发送请求,微信服务器接收请求,然后转发给第三方服务器,第三方服务器处理请求,将相应数据发给微信服务器,微信服务器将数据转发给用户。
需要说明的是,这个流程是针对用户与公众号进行交互时的流程。一般场景下,微信扫描二维码打开链接,或者用户分享链接,用微信打开时,都是启动了微信自带的浏览器,这个时候微信服务器会对访问的网址进行检测,但是并没有对网站的内容进行处理,原封不动的展示给用户了(目前是这样的)。
首先有几个比较重要的概念:
- 公众号的appID和
- 公众号的全局唯一接口调用凭据access_token:这个可以理解为第三方服务器和微信服务器交互的凭据,通俗的说就是门禁卡(有过期时间,过期后需要重新申请)。这个的好处是可以避免每次和微信服务器交互时发送appID和appsecret而造成风险。
- 用户的openid:这个某个微信用户唯一标识,但是仅仅针对对当前公众号。一个微信用户有无数个openid,对每一个公众号都有一个openid。
目前碰到的比较复杂的问题是获取用户的基本信息。如果获取微信用户的基本信息呢?
- 开发者到公众平台官网中“开发-接口权限-网页服务-网页账号-网页授权获取用户基本信息”的配置选项中,修改授权回调域名配置(即下面请求中的redirect_uri的域名)。这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头。
- 获取code,引导用户打开如下页面https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect ,其中scope有两个值snsapi_base(静默授权用户无感知,只能获取用户的openid)和snsapi_userinfo(弹出窗口让用户确认,如果用户已经关注,也是静默授权)。用户点击同意,页面将跳转至的redirect_uri回调域名,同时携带参数code。
- 获取access_token和用户的openid,这个access_token和之前说的 全局唯一接口调用凭据access_token 不是一个,只是恰好参数名相同而已。需要发送请求至https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,这样就可以获取到access_token和openid。
- 获取用户信息,发送请求至https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,这样就可以获取到用户信息。
这样就可以获取用户信息了。
假如已经获取到了用户的openid,那么通过下面的请求可以直接获取到用户的基本信息:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
注意这个access_token是公众号的全局唯一接口调用凭据。
项目地址如下:https://gitee.com/colin220/weixin_public_platform.git
公司的项目也是一个微信公众号项目,在用户访问首页时候就会获取用户信息。在本地调试的时候,授权回调域名是一个问题,如何跳到本地localhost:8080是个问题,因此做了一个公用的回调页面,将这个页面放在测试服务器,在这个回调页面上再一次跳转,跳转到localhost:8080/index的页面。
在获取code的那个步骤中,其实有一个state参数,可以通过这个参数将本地的ip传进去,然后再跳转到本地ip上。
参考文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432