9月的订单,交易单号4200002346202409147100666709
商户单号:2024091414211861
环境id: prod-dbtpz
云函数支付代码:
// 云函数入口函数
//questionPay:
exports.main = async (event, context) => {
const res = await cloud.cloudPay.unifiedOrder({
body: event.body, // 商品描述,必填
details:event.details,//商品详情
outTradeNo: event.goodsnum, // 商户订单号,必填,不能重复
spbillCreateIp: '127.0.0.1', // 终端IP,必填
subMchId: event.subMchId, // 子商户号,微信支付商户号,必填
totalFee:parseInt(event.payVal), // 总金额,必填
envId: 'prod-dbtpz', // 结果通知回调云函数环境,你自己小程序的坏境id
functionName: 'wechatpay', // 结果通知回调云函数名,非必填参数,即使为空,也不影响支付,但是官方文档里写的是必填参数,表示已醉
nonceStr:event.nonceStr,//第三个坑:官方文档中相关云函数代码没有nonceStr和tradeType,测试的时候会报nonceStr不存在的错,翻看文档才发现这个是必填项,直接粘过来以后还需要加上这两个参数
//tradeType:'JSAPI'
});
return res;
};
支付函数代码:
// 请求questionPay云函数,调用支付能力
_callQuestionPay(body, details,goodsnum, subMchId, payVal) {
wx.cloud
.callFunction({
name: 'questionPay',
data: {
// 需要将data里面的参数传给questionPay云函数
body,
details,
goodsnum, // 商品订单号不能重复
subMchId, // 子商户号,微信支付商户号,必填
payVal, // 这里必须整数,不能是小数,而且类型是number,否则就会报错
nonceStr:uuid(32, 32)//调用自己的uuid函数 不用也行 原来发现错在totalprice没值
},
})
.then((res) => {
console.log(res);//商户支付受限
const payment = res.result.payment;
console.log('payment:'+payment); // 里面包含appId,nonceStr,package,paySign,signType,timeStamp这些支付参数
wx.requestPayment({
// 根据获取到的参数调用支付 API 发起支付
...payment, // 解构参数appId,nonceStr,package,paySign,signType,timeStamp
success: (res) => {
console.log('支付成功', res);
wx.showToast({
title: '支付成功',
success: () => console.log('success'),
fail: () => console.log('failure'),
});
this.creatOrder(goodsnum);
},
fail: (err) => {
console.error('支付失败', err);
wx.showToast({
title: '支付失败',
success: () => console.log('success'),
fail: () => console.log('failure'),
});
},
});
})
.catch((err) => {
console.error(err);
});
},
creatOrder(goodsnum){
//获取缓存中数据
let cart=wx.getStorageSync("cart")||[];
//过滤后购物车数组
cart=cart.filter(v=>v.checked);
//把商品信息写进body
var order_item=[];
for(let i=0;i<cart.length;i++){
order_item.push({
cloth_id:cart[i].cloth_id,
cloth_price:cart[i].cloth_price,
cloth_notes:cart[i].cloth_notes,
num:cart[i].num
});
}
const address=wx.getStorageSync("curAddr");
const totalPrice=this.data.totalPrice;
//获取当前时间戳 转换成北京时间
//console.log("after bejing: "+utc_beijing(app.globalData.serverDate));
let curBeijingTime = formatTime(new Date())//utc_beijing(app.globalData.serverDate);
console.log("当前北京时间为:" + curBeijingTime);
//写入数据库
const testDB = wx.cloud.database({
//env: 'test-3aahe'
env: 'prod-dbtpz'
})
testDB.collection('orders').add({
data: {
_id:goodsnum,
product:order_item,
totalPrice:totalPrice,
address:address,
orderDate:curBeijingTime,
status:'待发货',
curName:this.data.curName,
curId:this.data.curId
},
success: function(res) {
// res 是一个对象
console.log("订单添加成功")
wx.showToast({
title: '订单提交成功,如有问题请联系客服',
icon: 'none',
duration: 3000,
success: function () {
setTimeout(function() {
// wx.navigateTo({url: '../order/index?type=1',})//跳转到order页面要给个参数要不没order list
wx.switchTab({url: '../user/index',})
}, 3000);
}
});
}
})
wx.setStorageSync("cart",[]);//清空购物车
},
谁能帮忙@官方?谢谢
建议先创建订单,然后再发起支付,支付完成再更新订单交易状态。更新订单状态这步呢最好依赖微信支付结果回调
正常现象。
因为wx.requestPayment的success里的代码,并不是100%只要支付成功就会执行的。
你这些逻辑,应该写在云函数wechatpay里。