微信小程序获取用户手机号及解密

要获取用户手机号,首先需要用户同意授权其手机号给小程序。可以使用wx.login()获取用户的code,然后调用wx.request()向微信服务器发起请求,获取到session_key和encryptedData等信息,再进行解密。

获取流程如下:

  1. 先调用wx.login()获取用户的code。

  2. 在小程序后台配置开发者服务器域名,在小程序中使用wx.request()向服务器发起请求,获取session_key和encryptedData等信息。

  3. 在服务器端进行解密,可以使用第三方库crypto-js来解密。

  4. 解密后即可获取用户手机号。

示例代码:

在前端调用:

wx.login({
  success: res => {
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    wx.request({
      url: 'https://example.com/api/wechat/decodePhoneNumber',
      data: {
        code: res.code,
        encryptedData: res.encryptedData,
        iv: res.iv
      },
      success: function (res) {
        console.log(res.data.phoneNumber);
      }
    })
  }
})

在后端解密:

const crypto = require('crypto-js');

function decodePhoneNumber(sessionKey, encryptedData, iv) {
  const sessionKeyBuffer = new Buffer(sessionKey, 'base64');
  const encryptedDataBuffer = new Buffer(encryptedData, 'base64');
  const ivBuffer = new Buffer(iv, 'base64');

  const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKeyBuffer, ivBuffer);
  decipher.setAutoPadding(true);

  let decoded = decipher.update(encryptedDataBuffer, 'binary', 'utf8');
  decoded += decipher.final('utf8');

  decoded = JSON.parse(decoded);

  if (decoded.watermark.appid !== APPID) {
    throw new Error('Invalid appId');
  }

  return decoded;
}

你可能感兴趣的:(1024程序员节)