简介:
1、code。通过请求微信的一个接口获取的,用于获取微信access_token及openId的必要参数。每个code只能使用一次,如果用户5分钟内未使用这个code,这个code会被清除。
2、openId。微信公众号中,每一个微信用户对应一个微信公众号,都有一个唯一的openId。做微信登录的时候,可以将这个openId作为识别用户的唯一标识。
3、UnionId。如果用户有公众号及开放平台账号,并且这俩账号是相互关联的,每一个用户针对这些具有关联关系的账号又一个唯一的UnionId。也可以作为识别用户的唯一标识。
4、access_token。通过code获取的,用于请求微信其他接口的权限标识。如请求userInfo等。
5、SCOPE参数。scope参数可以有多种类型。如果scope参数为snsapi_base时,不会弹出授权页面,开发者可以直接获取到code并做处理,但是开发者通过此code只能获取到用户的openId;如果scope参数为snsapi_userInfo时,需要用户点击授权按钮,开发者可以获取到用户的头像,昵称,性别,所在地等信息(即便用户未关注此公众号)。这俩参数是微信公众平台(http://mp.weixin.qq.com)上的,要调用网页授权,需要微信公众号通过认证(微信认证,相信各位做微信平台开发都有所了解,就不做介绍了)。如果用户是在微信开放平台中调用,还有一种参数类型snsapi_login。这个是用作微信扫码登录的。暂时还没用到,之后用到的时候再做详细说明。
6、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登录的话,若用户长时间未进行操作,可能造成session断开的情况,所以在我的项目中,将微信登录做到了全局。在全局去判断session中有没有用户信息,若没有则去请求,然后登录。
1、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三个参数换成对应的自己公众号的参数。
2、通过以上地址请求之后,可以获取到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参数有误时的返回。
3、刷新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参数有误时的返回。
4、获取用户信息
请求地址
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.1、第一次获取用户信息时,将获取到的微信信息作为一条用户数据插入到你的数据库中,之后再调用这个请求时,可以去查询数据库,有没有此微信用户对应的信息。
5.2、将查询到的用户信息,或者新插入的用户信息,通过session或者token等其他登录方式,在浏览器和服务端之间建立连接。
5.3、有的开发者在做完微信登录后还需要做手机绑定,如果没有老用户数据的话,直接在微信登录之后做一个拦截就好了,去判断这个用户有没有绑定手机号,如果没有,在登录之后直接跳转到绑定页面,如果绑定了则不作处理。
5.4、如果在微信登录功能发布之前,有一部分其他方式注册的老用户,就需要做用户合并了,如果没有,那么恭喜你,用户合并是一个让人头大的东西,你成功的避开了一个坑,你的微信登录已经搞完了。
这篇文档,核心内容还是微信官方的文档,自己写的内容很少,都是自己理解的内容,但是,如果你没时间自己研究,完全可以参考,因为我就是这么做的,而且也没发现问题,至于老用户合并的事,我也做了,暂时还没发现有什么比较严重的问题,因为我在网上没有见过老用户合并的文档,说明那么做的人并没有很多,最好在用户登录的时候直接拦截去做绑定,别像我们一样,如果不绑定,就是微信用户一套信息,手机用户另一套信息,完了用户需要的时候又做绑定,很恶心的。等在运行一段时间,如果没问题了,有时间我会再整理一篇文档的。