要处理微信第三方登陆,已是很正常的需求,读微信公开的文档,感受仍是有一些坑,本身写一个随笔好记录一下。nginx
大概两年前,初次接触微信第三方登陆的需求是一个网页应用,大概就是在微信开放平台申请一个开放平台权限,而后建立一个app,在app里面配置一个回调域名,当用户点击微信登陆时,把用户带到微信那边的二维码,而后用户扫码,微信那边经过以后,带着某些信息,redirect到咱们的一个action,而后,咱们经过读取这个action中的token拿到用户的profile,经过用户profile能够找到对应的用户userid,而后受权登陆。这种方式试用与没有微信公众号的企业,仅仅把微信当作了方便用户去登陆的渠道。服务器
此次咱们要说的是另一种登陆方式,就是经过微信公众号来实现第三方登陆。微信
前期准备工做,首先须要一个公众号。以管理者的方式登陆微信号以后,在左下方能够找到关于开发的菜单:app
咱们在公众号的首先就会有APPID和APPSecret,咱们须要配置服务器,这里配置服务器时特别要注意,也是与第一种登陆方式不同的地方,这里设置的不是一个hostname,而是一个具体的request。分布式
文档里面没有过多地作说明,可是其实这里配置的URL有两个意思。post
1.微信会对这个地址调用get请求,会传入几个参数,而后你得按照他的要求返回,这样就能经过这个配置。url
2.这也是文档里面没有说明的一个点,就是,当以后用户经过二维码扫描进来时,微信会对这个url发送一个post请求,这个post请求会传入scene相关信息。scene其实就是让开发者来传递的参数。spa
post格式文档里面有:3d
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> </xml>
你还须要对这个post请求作相应的响应,给你的直观感觉就是当你扫描二维码进入微信的提示。通常会是欢迎 XXX 登陆什么系统。代理
在微信的说明文档上,没有说明这个返回值。其实返回值是
<xml>
<ToUserName>xxxxxxxx</ToUserName>
<FromUserName>xxxxxxxx</FromUserName>
<CreateTime>1573190078536</CreateTime>
<MsgType>text</MsgType>
<Content>绑定超时或失败,请再次绑定!</Content>
</xml>
而后再一个,当你是一台电脑作服务器,分布式时,须要在你的nginx里作一个反向代理,大概的意思就是把 /xxx 映射到 xxxx:port/wx
由于设置微信URL时,不能填写端口,因此只能是80端口或者443端口。
location /wx {
proxy_pass http://localhost:8082/wx/checkSignature; }