实现微信小程序手机号一键登录的全流程,主要分为以下几个步骤:前端(uni-app)收集用户授权、后端(Python)接收数据并处理登录逻辑、与微信服务器交互验证手机号、生成会话等。下面将详细介绍每一步,并提供简化的示例代码。
1. 前端(uni-app)部分
目标
- 请求用户授权获取手机号码。
- 将授权获得的手机号发送到后端。
步骤
-
安装微信SDK:在uni-app项目中,你需要使用微信SDK来请求用户的手机号。确保你的项目已经配置了微信小程序的开发环境。
-
请求用户授权:在需要获取手机号的页面,调用微信的
wx.login
和wx.getSetting
、wx.authorize
或wx.openSetting
接口来请求用户授权获取手机号。 -
获取手机号:使用
wx.getPhoneNumber
获取加密的手机号码,并通过wx.request
发送到后端服务器。
示例代码
// 在页面的onLoad或按钮点击事件中
uni.login({
success: (loginRes) => {
uni.getSetting({
success: (settingRes) => {
if (!settingRes.authSetting['scope.address']) {
uni.authorize({
scope: 'scope.address',
success: () => {
// 用户已授权,再次调用获取手机号
uni.getPhoneNumber({
success: (phoneNumberRes) => {
const encryptedData = phoneNumberRes.encryptedData;
const iv = phoneNumberRes.iv;
// 发送至后端
uni.request({
url: 'https://your-backend-api.com/login', // 后端API地址
method: 'POST',
data: {
encryptedData,
iv,
loginCode: loginRes.code // 微信登录code,用于后端获取session_key
},
success: (res) => {
console.log('后端返回:', res.data);
},
fail: (err) => {
console.error('请求失败:', err);
}
});
},
fail: (err) => {
console.error('获取手机号失败:', err);
}
});
},
fail: () => {
uni.showModal({
title: '提示',
content: '需要您的授权才能继续',
showCancel: false
});
}
});
}
}
});
},
fail: (err) => {
console.error('登录失败:', err);
}
});
2. 后端(Python Flask)部分
目标
- 接收前端传来的加密数据和微信登录code。
- 使用微信API获取session_key。
- 解密手机号。
- 验证手机号并完成用户登录逻辑。
步骤
-
安装微信SDK:使用如
wechatpy
等库来与微信服务器交互。 -
接收并解密:接收前端发来的数据,调用微信接口获取session_key,然后解密手机号。
-
验证并登录:验证手机号的有效性,创建或查找用户,生成会话信息返回给前端。
示例代码
from flask import Flask, request, jsonify
from wechatpy import WeChatClient
import wechatpy.exceptions
app = Flask(__name__)
# 微信小程序AppID和AppSecret
APP_ID = 'your_app_id'
APP_SECRET = 'your_app_secret'
@app.route('/login', methods=['POST'])
def login():
encrypted_data = request.json.get('encryptedData')
iv = request.json.get('iv')
code = request.json.get('loginCode')
# 使用code换取session_key和openid
try:
client = WeChatClient(APP_ID, APP_SECRET)
session_info = client.mini_program.oauth.code_to_session(code=code)
session_key = session_info['session_key']
except wechatpy.exceptions.WeChatClientException as e:
return jsonify({'error': '获取session_key失败', 'message': str(e)}), 400
# 解密手机号
try:
from wechatpy.crypto import WeChatCrypto
crypto = WeChatCrypto(session_key, '', APP_ID)
phone_number = crypto.decrypt(encrypted_data, iv)
except Exception as e:
return jsonify({'error': '解密失败', 'message': str(e)}), 400
# 这里添加验证手机号并登录的逻辑,例如查询数据库是否存在该手机号的用户
# 假设验证成功,生成token
token = generate_token_for_user(phone_number) # 生成token的函数需自定义
return jsonify({'success': True, 'token': token})
if __name__ == '__main__':
app.run(debug=True)
注意事项
- 以上代码仅为简化示例,实际应用中需要考虑更多安全性问题,如HTTPS、数据校验、异常处理等。
generate_token_for_user
函数是一个占位符,你需要根据自己的认证系统实现生成Token的逻辑。- 确保在后端正确处理微信API调用的异常,如网络错误、参数错误等。
- 请替换
your_app_id
和your_app_secret
为你的实际微信小程序的AppID和AppSecret。 - 代码中未包含数据库操作部分,实际应用中需要连接数据库进行用户信息的存储与查询。