实现微信小程序手机号一键登录的流程主要包括前端(uni-app)收集用户授权、获取手机号,后端(Go)验证并处理登录逻辑。下面我将分步骤详细介绍这一过程,并提供简化版的示例代码。
1. 前端准备(uni-app)
1.1 引入微信SDK
在uni-app项目中,需要使用微信的SDK来调用微信接口。这通常通过HBuilderX的插件市场安装微信SDK插件完成。
1.2 获取用户授权
在小程序页面的onLoad生命周期函数中,请求用户的登录授权和获取手机号授权。
// pages/login/index.vueonLoad(){
uni.login({provider:'weixin',success:(loginRes)=>{// 保存code用于后端换取openidthis.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")funcgetWXSessionKey(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 实现登录逻辑
接下来,接收前端传来的数据,解密手机号,完成用户登录逻辑。
funcphoneLogin(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、防止重放攻击)等细节。希望这个流程和代码示例对你有所帮助!
版权归原作者 man2017 所有, 如有侵权,请联系我们删除。