一、整体流程概述
实现PC端微信扫码登录并获取用户手机号需要前后端协同工作,主要流程如下:
- PC端生成二维码:后端生成包含微信授权URL的二维码,前端展示
- 用户扫码授权:用户使用微信扫描二维码并确认授权
- 获取授权码:微信回调到后端接口,返回授权码(code)
- 换取访问令牌:后端使用授权码换取access_token和openid
- 获取用户信息:使用access_token获取用户基本信息
- 获取手机号:通过特定接口获取用户手机号(需用户二次授权)
- 完成登录:后端验证用户信息,建立会话,返回登录凭证
二、技术实现细节
1. 准备工作
在微信开放平台(open.weixin.qq.com)完成以下配置:
- 注册开发者账号并通过认证
- 创建"网站应用"获取AppID和AppSecret
- 配置授权回调域名(需备案域名)
- 申请获取用户手机号权限(需额外审核)12
2. 后端实现
2.1 生成微信登录二维码
后端需要提供接口生成微信登录二维码,核心步骤:
-
生成随机state参数(防CSRF攻击)
-
构造微信授权URL:
textCopy Code https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect -
使用qrcode库将URL转为二维码图片34
2.2 处理微信回调
微信授权后会回调到配置的redirect_uri,并携带code和state参数:
javaCopy Code
// 示例Java代码 - 处理回调
@GetMapping("/wechat/callback")
public String callback(@RequestParam String code, @RequestParam String state) {
// 验证state防止CSRF
if(!validateState(state)) {
return "error";
}
// 使用code换取access_token
String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code="+code+"&grant_type=authorization_code";
// 发送HTTP请求获取access_token和openid
// ...
return "redirect:/home";
}
2.3 获取用户手机号
获取手机号需要用户二次授权,后端需提供额外接口:
-
前端将微信返回的code(手机号专用)传给后端
-
后端调用微信接口获取手机号:
textCopy Code POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN请求体包含前端传来的code15
3. 前端实现
3.1 展示二维码
前端使用qrcode.js等库展示后端返回的二维码:
htmlCopy Code
<div id="qrcode"></div>
<script src="qrcode.min.js"></script>
<script>
// 从后端获取微信授权URL
fetch('/api/wechat/qrcode')
.then(res => res.json())
.then(data => {
new QRCode(document.getElementById('qrcode'), {
text: data.url,
width: 200,
height: 200
});
});
</script>
3.2 处理手机号授权
用户扫码后,前端需要处理手机号授权按钮:
htmlCopy Code
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
获取手机号
</button>
<script>
methods: {
getPhoneNumber(e) {
if(e.detail.errMsg === 'getPhoneNumber:ok') {
// 将code发送给后端
fetch('/api/wechat/phone', {
method: 'POST',
body: JSON.stringify({code: e.detail.code}),
headers: {'Content-Type': 'application/json'}
})
.then(res => res.json())
.then(data => {
console.log('手机号:', data.phone);
});
}
}
}
</script>
三、安全注意事项
- state参数:必须使用随机state参数并验证,防止CSRF攻击3
- Token存储:access_token应妥善存储,避免泄露
- 敏感信息:手机号等敏感信息传输需加密
- 权限控制:严格限制获取手机号的接口调用权限6
- 日志记录:记录关键操作日志,便于审计7
四、常见问题解决
- 二维码不显示:检查微信开放平台配置的回调域名是否正确4
- 获取手机号失败:确认已通过微信审核获取手机号的权限2
- 跨域问题:确保前后端域名配置正确,必要时配置CORS
- Token过期:access_token有效期为2小时,需及时刷新3
通过以上步骤,可以实现PC端微信扫码登录并获取用户手机号的功能。实际开发中还需根据具体业务需求调整流程和界面交互。