Node.js 支付宝支付

/**
   * 统一下单
   * @param ctx
   * 商户订单号 - outTradeNo
   * 订单总金额 - totalAmount
   * 订单标题 - subject
   */
  async pcpay(ctx) {
    console.log("统一下单:" + JSON.stringify(ctx.request.body));
    let outTradeNo = ctx.request.body.outTradeNo;
    let totalAmount = ctx.request.body.totalAmount;
    let subject = ctx.request.body.subject;

    // 填写订单基础信息
    const bizContent = {
      product_code: "FAST_INSTANT_TRADE_PAY",
      out_trade_no: outTradeNo,
      total_amount: totalAmount,
      subject: subject
    }

    // 获取支付宝官方支付链接
    const formData = new AlipayFormData();
    formData.setMethod("get");
    formData.addField("bizContent", bizContent);
    //支付成功或失败的返回链接
    formData.addField("returnUrl", "http://qjzjne.natappfree.cc/api/payment/callback");

    let message = "下单成功";
    const resultUrl = await alipaySdk.exec(
      "alipay.trade.page.pay",
      {},
      { formData: formData }
    ).catch(error => console.error('订单生成失败!', error), message = "订单生成失败!" );

    //保存订单数据
    const data = {
      outTradeNo: outTradeNo,
      totalAmount: totalAmount,
      subject: subject,
      tradeStatus: 'WAIT_BUYER_PAY',
    }
    await strapi.entityService.create('api::payment.payment', { data: data });

    ctx.send({
      code: 200,
      url: resultUrl,
      message: message
    });
  },
/**
   * 支付回调
   * @param ctx
   * 商户订单号 - outTradeNo
   * 平台订单号 - tradeNo
   */
  async callback(ctx) {
    console.log("支付回调:" + JSON.stringify(ctx.query));
    const signRes = alipaySdk.checkNotifySign(ctx.query);
    console.log("验签:"+signRes);

    const outTradeNo = ctx.query.out_trade_no;
    const tradeNo = ctx.query.trade_no;

    if(signRes){
      let message = "支付回调成功";
      const payments = await strapi.entityService.findMany(
        'api::payment.payment',
        { filters: { outTradeNo: outTradeNo } }
      ).catch(error => console.error('支付回调失败!', error), message = "支付回调失败!" );

      let payment;
      if (payments || payments.length > 0) {
        payment = payments[0];
      }

      const entry = await strapi.entityService.update('api::payment.payment', payment.id, {
        data: {
          tradeNo: tradeNo,
        },
      });
      ctx.send({
        code: 200,
        data: entry,
        message: message
      });
    }else{
      ctx.send({
        code: 200,
        message: "验签失败"
      });
    }
  },
/**
   * 订单查询
   * @param ctx
   * 商户订单号 - outTradeNo
   * 平台订单号 - tradeNo
   */
  async queryOrder(ctx) {
    console.log("订单查询:" + JSON.stringify(ctx.request.body));
    let outTradeNo = ctx.request.body.outTradeNo;
    let tradeNo = ctx.request.body.tradeNo;
    let message;
    const formData = new AlipayFormData();
    formData.setMethod("get");
    const bizContent = {
      outTradeNo,
      tradeNo
    };
    formData.addField("bizContent", bizContent);
    const queryResult = await alipaySdk.pageExec('alipay.trade.query', {
      method: 'GET',
      bizContent
    })

    const result = await axios.get(queryResult)
    const dataResult = result.data.alipay_trade_query_response;
    console.log("交易查询:" + JSON.stringify(dataResult))

    if (dataResult.code == 10000) {
      switch (dataResult.trade_status) {
        case 'WAIT_BUYER_PAY':
          message = "交易创建,等待买家付款"
          break;
        case 'TRADE_FINISHED':
          message = "交易结束,不可退款"
          break;
        case 'TRADE_SUCCESS':
          message = "交易支付成功"
          break;
        case 'TRADE_CLOSED':
          message = "未付款交易超时关闭,或支付完成后全额退款";
          break;
      }
      //更新交易状态值
      const payments = await strapi.entityService.findMany(
        'api::payment.payment',
        { filters: { outTradeNo: outTradeNo } }
      );

      const entry = await strapi.entityService.update('api::payment.payment', payments[0].id, {
        data: {
          tradeStatus: dataResult.trade_status,
        },
      });

      ctx.send({
        code: 200,
        data: entry,
        message: message
      })
    } else if (dataResult.code == 40004) {
      ctx.send({
        code: 404,
        message: "交易不存在"
      })
    }
  }

Demo下载地址:https://download.csdn.net/download/u013772876/88376302

你可能感兴趣的:(node.js)