微信小程序实现获取用户手机号

  1. 配置 app.json

在项目根目录的 app.json 文件中,配置需要的权限:

{
  "pages": [
    "pages/index/index"
  ],
  "permission": {
    "scope.userInfo": {
      "desc": "用于获取您的手机号"
    }
  }
}
  1. 在页面中添加获取手机号按钮

在 pages/index/index.wxml 文件中,添加获取手机号的按钮:

<view class="container">
  <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
</view>
  1. 编写获取手机号的逻辑

在 pages/index/index.js 文件中,编写获取手机号的逻辑:

Page({
  data: {},

  getPhoneNumber(e) {
    if (e.detail.errMsg === "getPhoneNumber:ok") {
      // 用户同意获取手机号
      const { encryptedData, iv } = e.detail;
      wx.login({
        success(res) {
          if (res.code) {
            // 发起网络请求,将 encryptedData, iv 和 res.code 发送给后台
            wx.request({
              url: '你的后台服务地址',
              method: 'POST',
              data: {
                code: res.code,
                encryptedData: encryptedData,
                iv: iv
              },
              success(response) {
                if (response.data.success) {
                  console.log("手机号获取成功", response.data.phoneNumber);
                } else {
                  console.log("手机号获取失败", response.data.message);
                }
              },
              fail(error) {
                console.log("网络请求失败", error);
              }
            });
          } else {
            console.log('登录失败!' + res.errMsg);
          }
        }
      });
    } else {
      console.log('用户拒绝授权获取手机号');
    }
  }
});

四、后端解密用户手机号

在后端,需要解密微信返回的 encryptedData 和 iv,获取用户的手机号。以下是一个使用 Node.js 和 wechat-miniprogram SDK 的示例:

const crypto = require('crypto');
const request = require('request');

const appId = 'yourAppId';
const appSecret = 'yourAppSecret';

function getSessionKey(code) {
  return new Promise((resolve, reject) => {
    request({
      url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`,
      method: 'GET',
      json: true
    }, (error, response, body) => {
      if (!error && response.statusCode === 200) {
        resolve(body.session_key);
      } else {
        reject(error || body);
      }
    });
  });
}

function decryptData(sessionKey, encryptedData, iv) {
  let decoded;
  try {
    const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64'));
    decipher.setAutoPadding(true);
    decoded = Buffer.concat([decipher.update(Buffer.from(encryptedData, 'base64')), decipher.final()]);
    decoded = JSON.parse(decoded.toString());
  } catch (err) {
    throw new Error('解密失败');
  }

  if (decoded.watermark.appid !== appId) {
    throw new Error('AppID 不匹配');
  }

  return decoded;
}

// 假设这是你的 API 处理函数
async function handleGetPhoneNumber(req, res) {
  const { code, encryptedData, iv } = req.body;
  try {
    const sessionKey = await getSessionKey(code);
    const phoneData = decryptData(sessionKey, encryptedData, iv);
    res.json({ success: true, phoneNumber: phoneData.phoneNumber });
  } catch (error) {
    res.json({ success: false, message: error.message });
  }
}

差不多流程就是这样,可根据实际开发需求情况改变代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值