收藏
回答

小程序支付成功 但是云数据库没有存入订单 这个如何debug?

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(3232)//调用自己的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
      },
      successfunction(res{
        // res 是一个对象
        console.log("订单添加成功")
        wx.showToast({
          title'订单提交成功,如有问题请联系客服',
          icon'none',
          duration3000,
          successfunction () {
            setTimeout(function() {
             // wx.navigateTo({url: '../order/index?type=1',})//跳转到order页面要给个参数要不没order list
             wx.switchTab({url'../user/index',})
            }, 3000);
          }
        });
      }
    }) 
    
  wx.setStorageSync("cart",[]);//清空购物车
  },


回答关注问题邀请回答
收藏

3 个回答

  • showms
    showms
    11-23

    建议先创建订单,然后再发起支付,支付完成再更新订单交易状态。更新订单状态这步呢最好依赖微信支付结果回调

    11-23
    有用 1
    回复
  • 杨六郎
    杨六郎
    11-22

    谁能帮忙@官方?谢谢

    11-22
    有用 1
    回复
  • 跨商通
    跨商通
    11-23

    正常现象。

    因为wx.requestPayment的success里的代码,并不是100%只要支付成功就会执行的。

    你这些逻辑,应该写在云函数wechatpay里。


    11-23
    有用
    回复
登录 后发表内容