返回

小程序获取用户手机号:一文读懂授权、加密、解密全过程

前端

小程序获取用户手机号:从授权到解密

授权用户手机号

获取用户手机号的第一步是授权用户手机号。可以通过调用 wx.login() 方法来获取用户的登录凭证(code),该凭证用于向后端交换用户的手机号。

wx.login({
  success: function (res) {
    if (res.code) {
      // 将code发送给后端,用于获取用户手机号
    }
  }
});

加密用户手机号

后端收到 code 后,需要向微信服务器发送 code,并使用微信服务器返回的 session_key 对用户的手机号进行加密。加密后的手机号称为 encryptedData

// 后端代码示例

const axios = require('axios');

const APPID = 'wxXXXXXXXXXXXXXXXXXXXXXXXXX';
const APPSECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';

const code = '用户登录凭证';

const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${APPSECRET}&js_code=${code}&grant_type=authorization_code`;

axios.get(url).then(res => {
  const { session_key } = res.data;

  // 使用session_key对用户的手机号进行加密
  const encryptedData = encrypt(phoneNumber, session_key);

  // 将encryptedData发送给小程序前端
});

解密用户手机号

小程序前端收到 encryptedData 后,需要将其发送给后端,并使用后端返回的解密密钥(iv)对 encryptedData 进行解密。

// 小程序前端代码示例

const wx = require('@/utils/wx');

const encryptedData = '加密后的手机号';
const iv = '解密密钥';

wx.request({
  url: '/api/decrypt',
  data: {
    encryptedData,
    iv
  },
  success: function (res) {
    const phoneNumber = res.data.phoneNumber;

    // 获取到用户的手机号,可以做进一步处理
  }
});

示例代码

// 后端代码示例

const crypto = require('crypto');

function encrypt(phoneNumber, sessionKey) {
  const iv = crypto.randomBytes(16);

  const cipher = crypto.createCipheriv('aes-128-cbc', sessionKey, iv);
  const encryptedData = cipher.update(phoneNumber, 'utf8', 'base64');
  encryptedData += cipher.final('base64');

  return {
    encryptedData,
    iv: iv.toString('base64')
  };
}

// 小程序前端代码示例

const wx = require('@/utils/wx');

const encryptedData = '加密后的手机号';
const iv = '解密密钥';

wx.request({
  url: '/api/decrypt',
  data: {
    encryptedData,
    iv
  },
  success: function (res) {
    const phoneNumber = res.data.phoneNumber;

    // 获取到用户的手机号,可以做进一步处理
  }
});

常见问题解答

  1. 为什么要授权用户手机号?
    授权用户手机号是为了获取用户的身份信息,以便为其提供更好的服务,如下单、登录等。

  2. 如何使用加密后的手机号?
    解密后的手机号可以用于多种目的,如发送短信验证码、注册账户等。

  3. 解密密钥 iv 是什么?
    iv 是初始化向量,用于防止相同明文在加密后得到相同的密文,从而增强安全性。

  4. 解密密钥 iv 是否需要保存?
    不需要保存 iv,因为在解密过程中会使用 iv 进行解密。

  5. 如何确保解密密钥 iv 的安全性?
    iv 由后端随机生成,并且不会存储在客户端,从而保证了安全性。