uniapp+python实现微信小程序手机号一键登录全流程(附前后端代码及详细解释)

实现微信小程序手机号一键登录的全流程,主要分为以下几个步骤:前端(uni-app)收集用户授权、后端(Python)接收数据并处理登录逻辑、与微信服务器交互验证手机号、生成会话等。下面将详细介绍每一步,并提供简化的示例代码。

1. 前端(uni-app)部分

目标
  • 请求用户授权获取手机号码。
  • 将授权获得的手机号发送到后端。
步骤
  1. 安装微信SDK:在uni-app项目中,你需要使用微信SDK来请求用户的手机号。确保你的项目已经配置了微信小程序的开发环境。

  2. 请求用户授权:在需要获取手机号的页面,调用微信的wx.loginwx.getSettingwx.authorizewx.openSetting接口来请求用户授权获取手机号。

  3. 获取手机号:使用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。
  • 解密手机号。
  • 验证手机号并完成用户登录逻辑。
步骤
  1. 安装微信SDK:使用如wechatpy等库来与微信服务器交互。

  2. 接收并解密:接收前端发来的数据,调用微信接口获取session_key,然后解密手机号。

  3. 验证并登录:验证手机号的有效性,创建或查找用户,生成会话信息返回给前端。

示例代码
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_idyour_app_secret为你的实际微信小程序的AppID和AppSecret。
  • 代码中未包含数据库操作部分,实际应用中需要连接数据库进行用户信息的存储与查询。

你可能感兴趣的:(uniapp,uni-app,python,微信小程序)