比较容易出错的是两个地方:
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;
- };