Nodejs + express + 微信小程序获取手机号码

本文介绍了一个使用Node.js后端配合微信小程序获取并解密用户手机号的流程。首先,下载并引入WXBizDataCrypt.js用于解密,然后设置微信接口配置参数。当微信小程序用户授权后,通过onLogin接口获取sessionKey,再调用微信API获取加密的用户数据。最后,使用解密算法解密获取到的encryptedData和iv,返回用户的手机号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.下载解密算法WXBizDataCrypt.js文件

二.在nodejs文件下,引入WXBizDataCrypt.js文件

三.node 源码

const express = require('express'); //web服务框架模块
const app = express();
const axios = require('axios'); // 请求api

const hostName = '192.168.1.xxx'; //ip或域名
const port = 3001; //端口

/**
 * [开启跨域便于接口访问]
 */
app.all('*', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*'); //访问控制允许来源:所有
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); //访问控制允许报头 X-Requested-With: xhr请求
    res.header('Access-Control-Allow-Metheds', 'PUT, POST, GET, DELETE, OPTIONS'); //访问控制允许方法
    res.header('X-Powered-By', 'nodejs'); //自定义头信息,表示服务端用nodejs
    res.header('Content-Type', 'application/json;charset=utf-8');
    next();
});

/**
 * [设置验证微信接口配置参数]
 */
const config = {
    AppID: 'xxxx', //对应测试号信息里的appID
    AppSecret: 'xxx', //对应测试号信息里的appsecret
};

// session标识
const authorization_code = 'demo';


// 通过微信小程序开发文档里面的加密解密下载获取
const WXBizDataCrypt = require('./utils/WXBizDataCrypt');


// 返回sessionKey
app.get('/onLogin', (req, res) => {
    const query = req.query;
    const { code } = query;
    var fetchUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${config.AppID}&secret=${config.AppSecret}&js_code=${code}&grant_type=${authorization_code}`;

    axios
        .get(fetchUrl)
        .then((response) => {
            var ret = {
                status: 200,
                data: response.data,
                msg: '成功',
            };
            res.send(ret);
        })
        .catch((err) => {
            console.log('axios occurs ', err);
        });
});

// 返回个人信息
app.get('/wechat/decrypt_data', (req, res) => {
    const { sessionKey, encryptedData, iv } = req.query;
    const bizDataCrypt = new WXBizDataCrypt(config.AppID, sessionKey);
    // res.send({ sessionKey, encryptedData, iv });
    const data = bizDataCrypt.decryptData(encryptedData, iv);
    if (Object.keys(data).length > 0) {
        res.status(200);
        res.send({
            status: 200,
            data,
            msg: '获取手机号码成功',
        });
    } else {
        res.status(400);
        res.send({
            status: 400,
            msg: '获取失败,请重新授权',
        });
    }
});

app.listen(port, hostName, function () {
    console.log(`服务器运行在http://${hostName}:${port}`);
});

微信小程序
做测试可以先关掉校验
在这里插入图片描述
四.微信小程序关键代码
wxml

<view class='padding flex flex-direction'>
 <button class="cu-btn bg-blue margin-tb-xs lg"  open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" >一键获取手机号码</button>
</view>

在这里插入图片描述
js 代码

 wx.login({
        success: res => {
          wx.request({
            url: 'http://192.168.1.xxx:3001/onLogin',
            data:{ code: res.code },
            success:result => {
              this.sessionKey = result.data.data.session_key
            }
          })
        }
      })
getPhoneNumber:function(e) {
    let info = {
      sessionKey:this.sessionKey, 
      encryptedData: e.detail.encryptedData, 
      iv:e.detail.iv
    }
    wx.request({
      url: 'http://192.168.1.xxx:3001/wechat/decrypt_data',
      data:info,
      success:data => {
        console.log(data);
      }
    })
  },

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值