解决微信获取用户授权手机号code码失效问题

废话不多说,直接上干货

问题产生:

开发小程序时,需要获取用户授权一键登录。
使用 wx.login 返回的code码,加上获取用户授权的手机号等加密信息,传参给后台解密时,一直报错code码失效。

官方说明:

从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级

因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。

官方示例:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>

解决:

亲测 tap 事件比获取授权方法触发优先级更高,即:如果在上述官方示例中绑定单击事件,则会先触发单击事件,再调取用户授权事件。

我是用的 uView 这个UI框架写的,所以写法和微信原生写法稍有不同:

<u-button
	open-type="getPhoneNumber"
	@getphonenumber="getPhoneNumber"
	@click="beforeGet"
>
	一键登录
</u-button>

data中声明暂存code的变量:

data() {
	return {
		wxCode: '',
	};
},

重点来了,methods中事件操作:

// 获取登录code
beforeGet() {
	wx.login({
		success: res => {
			if (res.code) {
				this.wxCode = res.code;
			} else {
				console.log('登录失败!' + res.errMsg);
			}
		}
	});
},

// 获取用户授权
getPhoneNumber(e) {
	if (e.detail.code) {
		console.log('用户授权成功', e);
		// 这里用上面取到的 this.wxCode 请求接口
	} else {
		console.log('用户拒绝授权');
	}
},

上述方法亲测有效!感觉比其他方法例如:调用两次 wx.login 什么的要巧妙的多,赶快用起来吧!!!

<think>好的,我现在需要帮用户解决如何在微信小程序中获取用户绑定的手机号问题。首先,用户已经提供了一个参考引用,里面提到了使用按钮的open-type属性和bindgetphonenumber事件。我记得微信小程序的文档中有相关部分,可能需要查阅一下。 首先,用户在小程序里获取手机号需要前端和后端的配合。前端部分应该是一个按钮,设置open-type为getPhoneNumber,并且绑定一个事件处理函数,比如getPhoneNumber。当用户点击授权后,这个事件会返回加密的数据,包括encryptedData和iv。这两个参数需要传递给后端服务器,用session_key解密才能拿到手机号。 然后,我需要确认步骤是否正确。第一步,用户点击按钮触发授权前端获取到加密数据。第二步,前端将加密数据和iv发送到服务器。第三步,服务器用之前获取的session_key解密数据,得到手机号。第四步,服务器返回手机号前端显示。 接下来要考虑的是权限问题。小程序必须已经通过认证,而且需要用户主动点击按钮才能触发,不能自动获取。此外,后端解密时需要session_key,这个session_key是通过用户code换取的,所以需要确保后端保存了当前的session_key,并且没有过期。因为session_key可能会失效,比如用户重新登录,这时候需要重新获取。 然后,代示例部分。前端WXML需要一个按钮,绑定事件。JS里定义getPhoneNumber函数,处理返回的参数,发送请求到后端。后端需要用微信的API解密数据,这里可能需要用到crypto模块,比如在Node.js中。需要注意的是,解密时的算法应该是AES-128-CBC,使用session_key作为密钥,iv作为初始向量。 还可能遇到哪些问题呢?比如,用户拒绝授权的情况,这时候需要处理fail回调,给出提示。另外,session_key过期的情况,这时候需要重新登录获取新的session_key。还要注意敏感接口的调用频率限制,避免被封禁。 最后,应该生成相关问题,比如如何解密encryptedData,如何处理用户拒绝授权,或者如何获取session_key。这些可以帮助用户进一步理解整个流程的细节。</think>### 微信小程序获取用户手机号实现方式 #### 1. 前端实现步骤 1. **按钮声明**:使用微信开放能力按钮,必须设置 `open-type="getPhoneNumber"` ```wxml <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> 授权获取手机号 </button> ``` 2. **事件处理**:在页面JS中定义事件处理函数 ```javascript Page({ getPhoneNumber(e) { if (e.detail.code) { // 将code发送到服务器 wx.request({ url: 'https://your.domain.com/getPhone', method: 'POST', data: { code: e.detail.code }, success: (res) => { console.log('手机号:', res.data.phoneNumber) } }) } else { console.log('用户拒绝授权') } } }) ``` #### 2. 后端解密流程 1. **获取session_key** ```javascript // 使用wx.login的code换取session_key const { code } = req.body; const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code`; ``` 2. **解密加密数据**(Node.js示例) ```javascript const crypto = require('crypto'); function decryptData(encryptedData, iv, sessionKey) { const decipher = crypto.createDecipheriv( 'aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64') ); let decoded = decipher.update(encryptedData, 'base64', 'utf8'); decoded += decipher.final('utf8'); return JSON.parse(decoded); } ``` #### 3. 注意事项 - 需小程序已通过微信认证 - 每个`code`只能使用一次 - `session_key`有效期约30分钟 - 必须使用HTTPS接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值