node快速接入支付宝沙箱

在node中对接支付宝扫码支付功能

最近再做一个pc端扫码支付功能,记录一下对接流程

注意一下,支付宝沙箱类似于测试环境,所有后续还需要营销执照申请正式接口

支付宝沙箱地址:https://open.alipay.com/develop/sandbox/app
注意截图中几个字段后续,node对接上用的了
在这里插入图片描述
支付宝沙箱环境中注意的点就是应用公钥,应用私钥,支付宝公钥三者关系。在支付宝沙箱环境中可以直接在上面截图中直接获取。

node中代码

//zfb_config.js
const AlipaySdk = require('alipay-sdk').default;
const alipaySdk = new AlipaySdk({
  // appId
  appId: '',
  // 签名算法
  signType: 'RSA2',
  // 支付宝网关地址
  gateway: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do',//沙箱环境
  // 支付宝公钥
  alipayPublicKey:'',
  // 应用私钥
  privateKey:'',
});

module.exports = alipaySdk;

在返回页面后一般做查询订单状态,的操作,这时候在node中需要用到axios请求支付宝提供的api查询订单状态,以便对自己的数据状态进行操作

//server
  /**
   * 支付
   */
  async pay(query) {
    // 前端给后端的数据(订单号,金额,商品描述等信息)
    let orderId = query.orderId;
    let orderMoney = query.orderMoney;
    let orderTitle = query.orderTitle;
    let orderInfo = query.orderInfo;
    // 对接支付宝

    const formData = new AlipayFromData();
    formData.setMethod('get');
    //支付时信息
    const bizContent = {
      out_trade_no: orderId,
      product_code: 'FAST_INSTANT_TRADE_PAY',
      total_amount: orderMoney,
      subject: orderTitle,
      body: orderInfo,
    };
    formData.addField('bizContent', bizContent);

    //支付成功或失败的链接
    formData.addField('returnUrl', 'http://localhost:9000/issue/issueGet');

    const result = await alipaySdk
      .exec('alipay.trade.page.pay', {}, { formData: formData })
      .catch(error => console.error('caught error!', error));

    //对接成功,支付宝返回的数据
    return {
      msg: '支付中',
      paymentUrl: result,
    };
  }

/**
   * 查询订单状态
   */
  async queryOrderAlipay(query) {
    let out_trade_no = query.out_trade_no;
    let trade_no = query.trade_no;
    let alipayResult = {};

    // 对接支付宝
    const formData = new AlipayFromData();
    formData.setMethod('get');
    formData.addField('bizContent', {
      out_trade_no,
      trade_no,
    });

    const result = alipaySdk.exec(
      // 这个地方和前面的不同
      'alipay.trade.query',
      {},
      { formData: formData }
    );

    return result.then(async resData => {
      await axios({
        url: resData,
        method: 'get',
      })
        .then(data => {
          let r = data.data.alipay_trade_query_response;
          if (r.code === '10000') {
            switch (r.trade_status) {
              case 'WAIT_BUYER_PAY':
                alipayResult = {
                  success: true,
                  code: 200,
                  msg: '支付宝有交易记录,没付款',
                };
                break;
              case 'TRADE_FINISHED':
                alipayResult = {
                  success: true,
                  code: 200,
                  msg: '交易完成',
                  // msg: '交易完成,不能退款',
                };
                break;
              case 'TRADE_SUCCESS':
                alipayResult = {
                  success: true,
                  code: 200,
                  msg: '交易完成',
                  // msg: '刚交易完成,可以退款',
                };
                break;
              case 'TRADE_CLOSED':
                alipayResult = {
                  success: true,
                  code: 200,
                  msg: '交易关闭,没有支付成功',
                };
                break;
            }
          } else if (r.code === '40004') {
            alipayResult = { code: 400, message: '交易不存在' };
          }
        })
        .catch(err => {
          alipayResult = { code: 400, message: '查询订单失败' };
        });
      return {
        ...alipayResult
      };
    });
  }

前端内容就对应着传入后端需要的字段就可以了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蹦跶哒哒哒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值