微信小程序获取用户手机号的流程及注意事项(uni-app)

最近公司小程序有个获取用户手机号功能,废话不多说直接上代码。

1.login方法获取code,用code调用后端接口获取sessionKey(即code2sessionAPI)

function getSessionKey() {
	return new Promise((resolve, reject) => {
		uni.login({
			provider: 'weixin',
			success: res => {
				ajax({
					url: `后端获取session_key接口`,
					loading: false,
					data: {
						js_code: res.code
					},
				}).then(resp => {
					if(resp.respCode=='T'&&resp.result.session_key){
						resolve(resp.result.session_key);
					}else{
						console.log('接口error:',resp)
						reject(resp.errorData)
					}
				})
			},fail:res=>{
				console.log('login方法error:',res)
				reject(res)
			}
		});

	})
}

2.拿到sessionKey,结合用户授权成功后得到的iv,encryptedData发送给后端做解密

getPhoneNumber(e) {
				getSessionKey().then(sessionKey => {
					let encryptedData = e.detail.encryptedData;
					let iv = e.detail.iv;
					return new Promise((resolve, reject) => {
						if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
							//用户取消授权
							reject(e.detail.errMsg)
						} else {
							//同意授权
							ajax({
								url: `后端解密接口`,
								loading: false,
								data: {
									sessionKey,
									encryptedData,
									iv
								},
							}).then(resp => {
								if (resp.respCode == 'T') {
									resolve(resp.result.phoneNumber);
								} else {
									reject(resp.errorData)
								}
							})
						}
					})
				}).then(phone => {
                    //此处是绑定用户手机号和id的关联
					ajax({
						url: `绑定手机号接口`,
						loading: false,
						data: {
							user_id: this.userInfo.userid,
							phone
						},
					}).then(resp => {
						if (resp.respCode == 'T') {
							//绑定手机号成功
							uni.showToast({
								title:'授权成功',
								duration:1500
							})
						} else {
							console.log(resp.errorData)
						}
					})
				}).catch(err => {
					console.log(err)
                    reject(err)
				})
			}

 

注意

调用wx.login登录,可能会刷新登录态。此时服务器使用code换取的sessionKey不是加密时使用的sessionKey,导致解密失败。所以要提前进行login。此处不建议checkSession,因为checkSession不准确,在我使用时每次都返回success,但是给到后端同学的sessionKey都提示过期,所以我建议每次获取手机号都拿到最新code来保证sessionKey不会过期。

还有在和后端调试的时候,java后端说每次传给他的encyptedData和iv中的‘+’号会转化为空格,导致解密失败,希望给大家提个醒。解决方案有很多,encode或者replace都可以解决。

 

附上一张小程序登录状态图示:

微信小程序获取用户手机号的流程及注意事项(uni-app)_第1张图片

 

 

你可能感兴趣的:(微信小程序)