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

实现微信小程序手机号一键登录的流程主要包括前端(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 发送数据到后端

将收集到的codeivencryptedData发送给后端进行处理。

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、防止重放攻击)等细节。希望这个流程和代码示例对你有所帮助!

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,uniapp微信小程序可以通过以下步骤实现手机号一登录: 1.在uniapp项目中安装并引入wx-server-sdk模块,该模块可以用于调用云函数。 2.在云函数中使用wx-server-sdk模块的getPhoneNumber方法获取用户手机号码。 3.在小程序使用wx.login方法获取用户的code。 4.将获取到的code和encryptedData、iv等信息传递给云函数。 5.在云函数中使用code、encryptedData、iv等信息调用微信提供的解密算法,获取用户的手机号码。 6.将获取到的手机号码返回给小程序实现登录功能。 以下是示例代码: 1.云函数代码: ```javascript const cloud = require('wx-server-sdk') cloud.init() const wxContext = cloud.getWXContext() const appid = 'your appid' // 替换成自己的appid const appsecret = 'your appsecret' // 替换成自己的appsecret const wxServerSDK = require('wx-server-sdk') wxServerSDK.init({ env: wxContext.ENV, appid: appid, secret: appsecret }) exports.main = async (event, context) => { const wxContext = cloud.getWXContext() const { code, encryptedData, iv } = event const session = await wxServerSDK.cloud.callFunction({ name: 'login', data: { code: code } }) const sessionKey = session.result.session_key const phone = await wxServerSDK.cloud.callFunction({ name: 'getPhoneNumber', data: { appid: appid, sessionKey: sessionKey, encryptedData: encryptedData, iv: iv } }) return phone.result } ``` 2.小程序代码: ```javascript // 获取用户手机号码 getPhoneNumber: function (e) { wx.cloud.callFunction({ name: 'getPhoneNumber', data: { code: this.globalData.code, encryptedData: e.detail.encryptedData, iv: e.detail.iv }, success: res => { console.log(res.result) // TODO: 处理获取到的手机号码 }, fail: err => { console.error(err) } }) } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值