微信支付签名验证
目标要求
- 使用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
});
}
});

1158

被折叠的 条评论
为什么被折叠?



