很多独立开发者在做小程序时,最头疼的一步就是「怎么把微信支付跑通」。本文按真实上线流程,把小程序微信支付的接入步骤拆开讲清楚,代码可直接套用。
一、前置准备:先把资质和配置搞定
在写代码之前,下面几件事必须完成,否则后面一定卡住:
- 注册微信支付商户号(mchid),并完成企业认证;
- 在小程序后台关联该商户号(AppID 与 mchid 绑定);
- 在商户平台配置 APIv3 密钥 和 商户证书(apiclient_cert.pem / apiclient_key.pem);
- 配置支付回调域名(必须是 HTTPS,且已备案)。
注意:小程序支付属于 JSAPI 支付,用户必须在小程序内,openid 必须来自同一个小程序的 AppID。
二、整体链路:一句话理解
小程序端只负责「唤起支付」,真正的下单和签名必须放在自己的服务端。链路是:
- 小程序调用
wx.login拿到 code,后端换 openid; - 后端调用微信「JSAPI 下单」接口,拿到 prepay_id;
- 后端二次签名,返回小程序唤起支付所需参数;
- 小程序调用
wx.requestPayment拉起收银台; - 微信异步回调后端,后端更新订单状态。
三、服务端:调用 JSAPI 下单
以 Node.js 为例,使用官方 SDK 或直接请求 v3 接口。核心是组装参数并签名:
const params = {
appid: APPID,
mchid: MCHID,
description: '测试商品',
out_trade_no: 'ORDER_' + Date.now(),
notify_url: 'https://your.domain/pay/notify',
amount: { total: 1, currency: 'CNY' },
payer: { openid: userOpenid }
};
// 请求 POST https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
// 返回 prepay_id拿到 prepay_id 后,还需要用商户私钥做一次小程序端唤起签名:
const paySign = sign({
appId: APPID,
timeStamp: ts,
nonceStr: nonce,
package: 'prepay_id=' + prepay_id,
signType: 'RSA'
});
return { timeStamp: ts, nonceStr: nonce, package, paySign, signType: 'RSA' };四、小程序端:唤起支付
前端拿到后端返回的参数后,直接调用支付 API:
wx.requestPayment({
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: 'RSA',
paySign: res.paySign,
success: () => { /* 支付成功,跳转结果页 */ },
fail: (err) => { /* 用户取消或失败 */ }
});提醒:success 只代表用户完成了支付动作,不代表订单一定到账,最终状态必须以服务端回调为准。五、支付回调:最容易踩坑的一步
微信会向 notify_url 发送 POST 请求,你需要:
- 验签(用微信平台证书验证请求头签名);
- 解密
resource字段(AES-256-GCM); - 判断
trade_state是否为SUCCESS; - 处理完业务后返回
{ code: 'SUCCESS' },否则微信会重复通知。
// 伪代码
if (decrypted.trade_state === 'SUCCESS') {
await updateOrder(decrypted.out_trade_no);
}
return { code: 'SUCCESS', message: '成功' };六、上线前的检查清单
- 金额单位是分,不是元;
- out_trade_no 全局唯一,避免重复下单;
- 回调接口做幂等处理,防止重复更新;
- 证书和密钥不要写进前端代码或 Git 仓库;
- 正式环境用正式 AppID 和 mchid,测试可用沙箱或 1 分钱订单。
把上面六步走完,小程序微信支付基本就能稳定跑起来了。真正花时间的往往不是接口本身,而是证书、回调验签和幂等这些细节,建议一开始就按生产标准写。
评论 (0)
还没有评论,快来抢沙发吧~