实现微信小程序手机号一键登录的流程主要包括前端(uni-app)收集用户授权、获取手机号,后端(Go)验证并处理登录逻辑。下面我将分步骤详细介绍这一过程,并提供简化版的示例代码。
1. 前端准备(uni-app)
1.1 引入微信SDK
在uni-app项目中,需要使用微信的SDK来调用微信接口。这通常通过HBuilderX的插件市场安装微信SDK插件完成。
1.2 获取用户授权
在小程序页面的onLoad生命周期函数中,请求用户的登录授权和获取手机号授权。
// pages/login/index.vue
onLoad() {
uni.login({
provider: 'weixin',
success: (loginRes) => {
// 保存code用于后端换取openid
this.code = loginRes.code;
this.requestPhoneAuth();
},
fail: (err) => {
console.error('登录授权失败', err);
}
});
},
requestPhoneAuth() {
uni.getSetting({
success: (settingRes) => {
if (!settingRes.authSetting['scope.userInfo']) {
uni.showModal({
title: '提示',
content: '需要获取您的授权才能继续',
showCancel: false,
confirmText: '去授权',
success: () => {
uni.openSetting();
}
});
} else {
this.getPhoneNumber();
}
}
});
},
1.3 获取手机号
在用户授权后,调用getPhoneNumber
方法获取加密后的手机号。
getPhoneNumber(e) {
if (e.detail.errMsg === "getPhoneNumber:ok") {
this.iv = e.detail.iv; // 加密算法的初始向量
this.encryptedData = e.detail.encryptedData; // 包含手机号的加密数据
this.loginWithPhone(); // 调用登录接口
} else {
console.error('获取手机号授权失败');
}
},
1.4 发送数据到后端
将收集到的code
、iv
、encryptedData
发送给后端进行处理。
loginWithPhone() {
uni.request({
url: '你的后端接口地址/login/phone',
method: 'POST',
data: {
code: this.code,
encryptedData: this.encryptedData,
iv: this.iv
},
success: (res) => {
if (res.data.success) {
// 登录成功,存储token等信息
uni.setStorageSync('token', res.data.token);
uni.switchTab({
url: '/pages/home/index'
});
} else {
uni.showToast({
title: '登录失败',
icon: 'none'
});
}
},
fail: (err) => {
console.error('请求后端失败', err);
}
});
}
2. 后端处理(Go)
2.1 解密手机号
首先,后端需要使用微信提供的SDK或API来解密手机号。这里假设你已经获取到了微信小程序的AppID和AppSecret,并且能够通过code
换取到用户的session_key
。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func getWXSessionKey(code string) (string, error) {
appid := "你的AppID"
secret := "你的AppSecret"
urlStr := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appid, secret, code)
resp, err := http.Get(urlStr)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
return result["session_key"].(string), nil
}
2.2 实现登录逻辑
接下来,接收前端传来的数据,解密手机号,完成用户登录逻辑。
func phoneLogin(w http.ResponseWriter, r *http.Request) {
var data struct {
Code string `json:"code"`
EncryptedData string `json:"encryptedData"`
Iv string `json:"iv"`
}
err := json.NewDecoder(r.Body).Decode(&data)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sessionKey, err := getWXSessionKey(data.Code)
if err != nil {
http.Error(w, "Failed to get session key", http.StatusInternalServerError)
return
}
// 这里需要使用微信的加密库解密encryptedData为手机号,具体实现较为复杂,需参考微信官方文档
// 假设解密后得到的手机号为phoneNumber
// 之后根据phoneNumber查找或创建用户,生成token等操作...
respData := map[string]string{
"success": "true",
"message": "登录成功",
"token": "生成的token",
}
jsonResp, _ := json.MarshalIndent(respData, "", " ")
w.Header().Set("Content-Type", "application/json")
w.Write(jsonResp)
}
请注意,上述Go代码中的手机号解密步骤是一个简化示意,实际应用中需要使用微信提供的加密库(如wxbizdatacrypt
)来完成,这一步骤较为复杂,涉及到具体的加解密算法实现,这里未展开以保持示例的简洁性。
总结
通过以上步骤,你可以在uni-app构建的小程序中实现手机号一键登录功能,其中涉及到了微信授权、手机号获取、以及后端的数据处理与用户认证。实际开发时,还需考虑错误处理、安全性(如HTTPS、防止重放攻击)等细节。希望这个流程和代码示例对你有所帮助!