uniapp jsapi支付如何实现
“在uni-app中如何实现JSAPI支付?我已经按照官方文档接入了微信支付,但在调用JSAPI时一直报错。具体流程应该是怎样的?是否需要额外配置支付目录或授权域名?有没有完整的示例代码可以参考?”
2 回复
在uniapp中实现JSAPI支付,需调用微信支付接口。先通过后端生成预支付订单,获取支付参数,再调用uni.requestPayment发起支付。注意配置支付目录和授权域名。
在 UniApp 中实现 JSAPI 支付(常用于微信小程序或公众号支付),主要步骤如下:
1. 准备工作
- 申请微信支付商户号,并配置支付目录和授权域名。
- 获取 AppID、商户号(mch_id)、API 密钥(key)等参数。
2. 后端生成支付参数
支付需后端生成签名和预支付订单。示例流程(以 Node.js 为例):
// 后端:使用微信支付统一下单 API
const crypto = require('crypto');
const axios = require('axios');
async function createOrder(openid, total_fee, order_id) {
const params = {
appid: '你的AppID',
mch_id: '商户号',
nonce_str: Math.random().toString(36).substr(2),
body: '商品描述',
out_trade_no: order_id,
total_fee: total_fee,
spbill_create_ip: '用户IP',
notify_url: '支付回调URL',
trade_type: 'JSAPI',
openid: openid // 从小程序/公众号获取
};
// 生成签名
const sign = generateSign(params, '你的API密钥');
params.sign = sign;
// 调用统一下单接口
const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder',
`<xml>${Object.keys(params).map(key => `<${key}>${params[key]}</${key}>`).join('')}</xml>`
);
// 解析返回的 prepay_id
const prepay_id = parseXMLResponse(response.data).prepay_id;
return prepay_id;
}
function generateSign(params, key) {
const sortedParams = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&') + `&key=${key}`;
return crypto.createHash('md5').update(sortedParams).digest('hex').toUpperCase();
}
3. UniApp 前端调用支付
在后端返回 prepay_id 后,前端发起支付:
// UniApp 前端
uni.requestPayment({
provider: 'wxpay',
timeStamp: String(Date.now()),
nonceStr: '随机字符串',
package: `prepay_id=${prepay_id}`, // 从后端获取
signType: 'MD5',
paySign: '后端计算的签名', // 后端根据参数生成
success: (res) => {
console.log('支付成功', res);
},
fail: (err) => {
console.log('支付失败', err);
}
});
4. 注意事项
- 签名验证:前后端均需严格按微信支付规则生成签名,避免支付失败。
- 安全:敏感操作(如生成预支付订单)需在后端完成,防止 API 密钥泄露。
- 跨平台适配:UniApp 的
uni.requestPayment会自动适配小程序或 H5 环境。
总结
通过后端生成预支付订单和签名,前端调用 uni.requestPayment 即可实现支付。确保参数正确且签名有效,测试时使用微信开发者工具或真机调试。

