一,介绍
现在有很多微信项目开发,希望在登录的时候,自动使用微信号登录,在这篇文章进行介绍一下。
二、微信官网-微信网页授权
- 引导用户进入授权页面同意授权,获取code
- 通过code换取网页授权access_token(与基础支持中的access_token不同)
- 如果需要,开发者可以刷新网页授权access_token,避免过期
- 通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
三、开发思路
- 获取code
- 通过code获取网页授权access_token
- 拉取用户信息
四、配置类参数封装
把所有的Api和微信登录用到的参数(下面是需要准备的参数)封装成配置类,方便使用,
wxopen.appid=wxa3915224f507b2
wxopen.appsecret=82380d12143533d86b0b775123b9
wxopen.redirect_url=http://xxxxx.cn/api/v1/wechat/user/callback
第一步:用户同意授权,获取code
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,审核通过获得 |
redirect_uri | 是 | 回调地址,用户扫码完成之后 微信会将code作为参数传到这个地址上(注意这里回调地址需要urlEncode处理) |
response_type | 是 | 填code |
scope | 是 | 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |
用户扫码访问拼装好的二维码链接并授权后,微信平台会回调 我们在上面设置的回调地址并且会携带code
临时凭证,接下来我们就用code去获取access_token
/**
* 拼装微信扫一扫登录Url
* @return
*/
@GetMapping("/login_url")
public JsonData loginUrl(
@RequestParam(value = "access_page", required = true) String accessPage) throws UnsupportedEncodingException {
String redirectUrl = weChatConfig.getOpenRedirectUrl(); //获取开放平台重定向地址
String callbackUrl = URLEncoder.encode(redirectUrl, "GBK"); //进行编码
String qrcodeUrl = String.format(weChatConfig.getOpenQrCodeUrl(), weChatConfig.getOpenAppid(), callbackUrl, accessPage);
return JsonData.buildSuccess(qrcodeUrl);
}
第二步:code换取access_token
第一步用户扫码授权完成后,微信会回调我们设置的回调地址(redirect_uri)并且会携带code值,我们拿到code就可以搞事情了
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 |
是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
secret | 是 | 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填authorization_code |
第三步:获取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用凭证 |
openid | 是 | 普通用户的标识,对当前开发者帐号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |