记录一下使用node对接微信支付签名的问题

微信支付签名验证

目标要求

  • 使用node调用微信小程序支付api获取支付参数
  • 熟悉支付签名认证流程和加密过程
  • 拉起微信支付,并成功支付
    首先贴上官方文档
    微信支付官方文档
    微信商户号官网
    在这里插入图片描述
    需要准备的
  • 商户号
  • 序列号
  • API证书
  • 小程序APPID
  • OpenId
    本人多次使用md5自己构造签名提示签名有误,请稍后重试
    通过搜索发现有专门的库用来处理微信支付签名…
npm i wechatpay-node-v3

文档地址

const WxPay = require('wechatpay-node-v3')
const pay = new WxPay({
    appid: APPID_MAP.db.appid,
    mchid: MCHID,
    // publicKey: fs.readFileSync(PUBLIC_KEY_PATH, 'utf8'),
    // privateKey: privateKey
    publicKey: PUBLIC_KEY_PATH,
    privateKey: PRIVATE_KEY_PATH
})
 const params = {
        description: '小楠老师的支付描述', // 订单描述
        out_trade_no: randomNumber(), // 订单号,一般每次发起支付都要不一样,可使用随机数生成
        notify_url: `支付回调地址`,
        amount: {
            total: 1, // 支付金额,单位为分
        },
        payer: {
            openid: 'openid', // 微信小程序用户的openid,一般需要前端发送过来
        },
        scene_info: {
            payer_client_ip: 'ip', // 
        },
    };
     const data = await pay.transactions_jsapi(params)
        return res.jsonp({
            code: code.success,
            data: data.data,
            message: '请求成功',
            success: true
        });

通过postman调用获取支付参数
在这里插入图片描述
再到小程序中调用
在这里插入图片描述

在这里插入图片描述
才发现自己的小程序还是个人账户 不具备支付能力
在这里插入图片描述

目前正在申请中 后续接入微信支付了在来回补
回顾一下之前自己构造签名的失败经历
用来各种签名方法,md5,crypto都失败了 等后续有时间了在排查问题
在这里插入图片描述
这里贴上部分实现构造签名的代码

const getWxPay = app.post(`${API}/wx/pay`, async (req, res) => {
    // 请求时间戳
    const timestamp = dayjs().valueOf() + '';
    // 随机字符串
    // const nonce_str = Math.random().toString(36).substring(2, 34);
    const nonce_str = randomString();
    // 假设当前时间为下单时间,这里只是示例,实际应用中获取真实下单时间
    const orderPlacedTime = dayjs();

    // 计算支付结束时间,这里设置为下单时间1小时后,你可根据业务调整
    const timeExpire = orderPlacedTime.add(1, 'hour');

    // 格式化为符合 RFC3339 标准的格式
    const formattedTimeExpire = timeExpire.format('YYYY-MM-DDTHH:mm:ss+08:00');
    // 请求参数
    let params = JSON.stringify({
        appid: APPID_MAP.db.appid || APPID,
        mchid: MCHID,
        description: '商品下单购买',
        out_trade_no: 'ljasljdkka',
        time_expire: formattedTimeExpire,
        amount: {
            total: 1,
            currency: 'CNY'
        },
        payer: {
            openid: '13'
        },
        notify_url: '回调地址'
    });
    console.log(timestamp, nonce_str)
    // 构造待签名串
    const message = [method, url, timestamp, nonce_str, params].join('\n');

    // 计算签名
    const sign = crypto.createSign('SHA256').update(message).sign(privatekey, 'base64');

    // 生成Authorization
    const authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${MCHID}",nonce_str="${nonce_str}",signature="${sign}",timestamp="${timestamp}",serial_no="${SERIAL_NO}"`;

    // console.log('privatekey:', privatekey);
    console.log('authorization:', authorization);
    // 请求头
    const headers = {
        'Accept': 'application/json',
        'Authorization': authorization,
        'Content-Type': 'application/json'
    };

    try {
        // 发送请求
        let data = await axios.post('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi', params, {
            headers: headers
        });
        console.log(data)
        return res.jsonp({
            code: code.success,
            data: data.data,
            message: '请求成功',
            success: true
        });
    } catch (error) {
        console.error('Error:', error.response.data);
        return res.jsonp({
            code: code.fail,
            message: '请求失败',
            data: error.response.data,
            success: false
        });
    }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值