比较容易出错的是两个地方:
1. 订单号必须唯一,不能重复,重复就会创建失败
2. 金额必须是整数(以分为单位),小数会导致创建失败
小程序云开发实现微信支付的代码分为两部分:
1. 小程序端代码
2. 云函数代码
小程序端的代码首先调用云函数代码创建一个支付项目,如果创建成功,云函数将返回这个支付项目的相关数据(payment),小程序端用这个数据(payment)来调用微信支付界面,用户开始支付,用户的操作结束后,小程序获得支付结果,成功支付或者未支付。
小程序端
async onTapPay(e){
let paid=false; let This=this;
let order = new Date().Idealand_ToFileName(); // 订单号,每个订单必须不一样,如果重复会导致订单创建失败
let totalFee = 1000; // 这里是以分为单位,必须为整数,如果是小时,会导致订单创建失败
let data = { order, totalFee };
let res=await wx.cloud.callFunction({ name: 'pay', data });
const { payment } = res.result;
if(!payment || !payment.package){
// 订单创建失败
} else {
// 订单创建成功,调用支付界面
wx.requestPayment({
...payment,
success (res) { paid=true; /* 支付成功 */ },
fail (err) { /* 支付失败 */ },
});
}
},
云函数 pay
exports.main = async (event, context) => {
let {order, totalFee}=event;
let ps={
"outTradeNo" : order, // 支付项目编号,必须唯一,不可重复
totalFee, // 以分为单位,必须为整数,不可为小数
"subMchId" : "1652990403", // 普通商户号
"envId": "juyipintest-4gx5k7wu2ab0d08f", // 云环境Id
"body" : "居意品创意餐厅", // 这个没有用,随便填
"spbillCreateIp" : "127.0.0.1", // 这个没有用,随便填
"functionName": "payCallBack", // 这个没有用,随便填
};
const res = await cloud.cloudPay.unifiedOrder(ps); return res;
};