简介:redis
一、code。经过请求微信的一个接口获取的,用于获取微信access_token及openId的必要参数。每一个code只能使用一次,若是用户5分钟内未使用这个code,这个code会被清除。数据库
二、openId。微信公众号中,每个微信用户对应一个微信公众号,都有一个惟一的openId。作微信登陆的时候,能够将这个openId做为识别用户的惟一标识。json
三、UnionId。若是用户有公众号及开放平台帐号,而且这俩帐号是相互关联的,每个用户针对这些具备关联关系的帐号又一个惟一的UnionId。也能够做为识别用户的惟一标识。api
四、access_token。经过code获取的,用于请求微信其余接口的权限标识。如请求userInfo等。浏览器
五、SCOPE参数。scope参数能够有多种类型。若是scope参数为snsapi_base时,不会弹出受权页面,开发者能够直接获取到code并作处理,可是开发者经过此code只能获取到用户的openId;若是scope参数为snsapi_userInfo时,须要用户点击受权按钮,开发者能够获取到用户的头像,昵称,性别,所在地等信息(即使用户未关注此公众号)。这俩参数是微信公众平台(http://mp.weixin.qq.com)上的,要调用网页受权,须要微信公众号经过认证(微信认证,相信各位作微信平台开发都有所了解,就不作介绍了)。若是用户是在微信开放平台中调用,还有一种参数类型snsapi_login。这个是用做微信扫码登陆的。暂时还没用到,以后用到的时候再作详细说明。缓存
六、redirect_uri。请求code成功以后的回调地址(须要将这个地址作Unicode编码以后拼接到参数中)。开发者须要在这个请求内部处理请求到的code。code请求成功以后,微信会将code做为这个请求的参数拼接到连接中。若是回调地址中没有参数,则请求code成功以后,微信请求的地址为redirect_uri?code=*********&state=STATE;若是回调地址中有连接型的参数,则回调地址须要作处理,须要将回调地址中的连接参数的值作一次Unicode编码。以后微信请求的地址为redirect_uri?param=****&code=****&state=STATE。以下图所示:微信
<img class="alignnone size-full wp-image-87" src="http://blog.yangjian.shop/wp-content/uploads/2017/08/15032843951.png" alt="" width="1093" height="23" />session
实战:app
我的理解,因为作微信登陆,是要用户在全局都须要登陆状态,若是开发中使用的是session登陆的话,若用户长时间未进行操做,可能形成session断开的状况,因此在个人项目中,将微信登陆作到了全局。在全局去判断session中有没有用户信息,若没有则去请求,而后登陆。微信公众平台
一、code请求地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
将appId,redirect_uri,scope三个参数换成对应的本身公众号的参数。
二、经过以上地址请求以后,能够获取到code,而后使用获取到的code作其余请求。如请求access_token。
access_token请求地址https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
这一步是要在后台进行的,由于这个请求中包含一些私密信息,如secret。这里须要将appId,secret,code换成对应的参数。并且,这些参数都为必填参数,其中grant_type不须要作修改。
请求的返回值为json格式的数据。
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
access_token具备较短的有效期,为2个小时。可是refresh_token有效期较长,为30天。当access_token失效时,能够经过refresh_token去从新获取,当access_token未失效,能够经过refresh_token刷新access_token。因此,这一步请求可使用如redis之类的缓存。将这一步请求到的数据放到缓存中,再次使用的时候,能够直接获取,而不须要再次从微信请求。此外,微信这个接口以前是有比较严格的限制的,可是如今这个接口限制比之前来讲更人性化了,access_token每分钟能够请求1万次。若是没有特别大的访问量的话(1分钟1万次,这个请求量,能够说是特别大的公司才会有的了吧,大公司的人也不会看我这文档了估计),能够不用放缓存,这个对于新手开发者来讲,能够省去一步。
若是错误时,返回值将会不一样,如{"errcode":40029,"errmsg":"invalid code"} ,这个是code参数有误时的返回。
三、刷新access_token(若是须要)
请求地址:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
这个是刷新access_token的请求及返回结果。若是访问量达不到以前说的量级,能够先不作。
若是错误时,返回值将会不一样,如{"errcode":40029,"errmsg":"invalid code"} ,这个是code参数有误时的返回。
四、获取用户信息
请求地址
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
当第一步请求code时,SCOPE参数为snsapi_userInfo,这里才能调用这个接口去获取用户信息。
access_token及openid替换为第二步中获取的值,能够请求到微信的一些基本信息。返回值以下:
{ "openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
其中,只有当前公众平台绑定到开发平台是,才会出现最后一个unionid字段,不然不会。
<img class="alignnone wp-image-89" src="http://blog.yangjian.shop/wp-content/uploads/2017/08/微信我的信息参数说明.png" alt="" width="755" height="368" />
当请求失败时会有对应的提示,如当openid参数有问题时,会有以下提示:
{"errcode":40003,"errmsg":" invalid openid "}
五、获取到这些信息以后还须要作什么
当获取到用户我的信息的时候,还差登陆没作呢,只是单纯的获取到了信息。接下来还须要作的事情是:
5.一、第一次获取用户信息时,将获取到的微信信息做为一条用户数据插入到你的数据库中,以后再调用这个请求时,能够去查询数据库,有没有此微信用户对应的信息。
5.二、将查询到的用户信息,或者新插入的用户信息,经过session或者token等其余登陆方式,在浏览器和服务端之间创建链接。
5.三、有的开发者在作完微信登陆后还须要作手机绑定,若是没有老用户数据的话,直接在微信登陆以后作一个拦截就行了,去判断这个用户有没有绑定手机号,若是没有,在登陆以后直接跳转到绑定页面,若是绑定了则不做处理。
5.四、若是在微信登陆功能发布以前,有一部分其余方式注册的老用户,就须要作用户合并了,若是没有,那么恭喜你,用户合并是一个让人头大的东西,你成功的避开了一个坑,你的微信登陆已经搞完了。
这篇文档,核心内容仍是微信官方的文档,本身写的内容不多,都是本身理解的内容,可是,若是你没时间本身研究,彻底能够参考,由于我就是这么作的,并且也没发现问题,至于老用户合并的事,我也作了,暂时还没发现有什么比较严重的问题,由于我在网上没有见过老用户合并的文档,说明那么作的人并无不少,最好在用户登陆的时候直接拦截去作绑定,别像咱们同样,若是不绑定,就是微信用户一套信息,手机用户另外一套信息,完了用户须要的时候又作绑定,很恶心的。等在运行一段时间,若是没问题了,有时间我会再整理一篇文档的。