微信官方文档使用
- 搜索“微信开放平台”
- 点击导航栏的“资源中心”
- 点击“网站应用”下的“微信登录功能”
- 地址
- 微信扫码登录是基于OAuth2的,所以需要第三方应用(就是实现微信扫码登录的应用)成为微信的客户端,获取AppId和AppSecret。
获取AppId和AppSecret
- “微信开发平台”下方的“网站应用开发”
- 点击导航栏的“注册”注册信息,注册地址
- 最好使用企业邮箱注册,填写注册信息进行注册
- 开发者认证:注册成功之后点击登录——>开发者资质认证,这需要填写个人身份信息,企业盖章等,认证一次300元,所以我们只有在真实企业开发中才会去做,平时练习是做不了的。
- 审核成功后就可以创建应用了,同样需要企业签字盖章
- 应用中就可以看到AppId和AppSecret,需要配置回调域(就是应用的域名),供微信回调返回用户的授权结果。
请求code
- 向以下链接发送请求
https://open.weixin.qq.com/connect/qrconnect?appid=你的APPID&redirect_uri=http://你的授权回调域&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect
访问该地址会得到一个微信登录的二维码
- 用户扫了二维码之后会选择是否同意授权,如果授权成功会跳转到如下地址,地址中就包含code。
http://你的授权域/?code=获取的code&state=STATE
- 需要注意的是,如果你的项目域名还没有注册的话,这个地址是访问不了的,我们知道域名解析是先看我们本地的hosts文件(C:\Windows\System32\drivers\etc下),如果hosts中没有的话,会使用DNS(域名解析服务器)进行域名解析后访问,所以我们可以在本地的hosts文件中配置(项目所在地址ip和回调域之间用空格隔开)
获取access_token
- 向以下地址发送请求获得access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的AppId&secret=你的AppSecret&code=上一步获取到的code&grant_type=authorization_code
- 得到的结果格式如下,包含access_token
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
【注意事项】如果发送请求后的结果是{"errcode":40029,"errmsg":"invalid code"}
,那就说明token已经过期。
- access_token默认时间是两小时,如果access_token过期了,需要使用refresh_token进行刷新,可以发送请求到以下地址进行refresh_token。
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=你的APPID&grant_type=refresh_token&refresh_token=获取access_token时的REFRESH_TOKEN
- access_token刷新的两种结果
1)若access_token已超时
,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2)若access_token未超时
,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
【注意】refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
也就是说,不管access_token在是否超时时刷新,都要在refresh_token过期之前,刷新一次,access_token的超时时间都会变成两小时,不同的是,access_token是否还是原来的值。 - refresh_token正确的返回结果示例如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
- 如果是
{"errcode":40030,"errmsg":"invalid refresh_token"}
,说明refresh_token已经过期,需要重新获得access_token和refresh_token。
通过access_token调用用户信息接口
- access_token和用户的openId都在上一步获取到
https://api.weixin.qq.com/sns/userinfo?access_token=你的ACCESS_TOKEN&openid=用户的OPENID
- 获取到的正确结果示例,这些信息其实都可以保存到自己平台的用户注册表中。
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"}
【微信官方提示】如果你有多个应用,并且允许用户在这多个应用中进行数据共享的话,使用的是unionid,unionid是唯一的,也就是一个微信号对应一个unionid,而一个微信号会对应多个openid,openid在不同的应用中是不同的,但是在同一个应用中是相同的(微信通过用户唯一标识,例如微信号和应用id加密后生成openid)。同时,微信提醒,用户在修改头像之后,修改前的url会失效,为了保证url失效后的异常情况,应该保存好微信头像地址。
总结
- 微信登录其实就5步
1)注册企业邮箱,填写信息,获取appid,appscret,绑定回调域
2)通过appid和回调域,请求微信扫码登录界面,用户扫码授权,获取code
3)通过appid,appsecret和code获取access_token和用户的openid
4)通过access_token和用户的openid获取用户信息
5)通过用户信息注册本平台的账号