乐趣区

关于javascript:nodejsvue实现支付宝支付沙箱完整版亲测可用

有写到, 记录下支付宝领取

demo 请狠狠的戳这里 ¥ https://download.lllomh.com/cliect/#/product/J302659722615829

沙箱环境 (Beta) 是帮助开发者进行接口性能开发及次要性能联调的辅助环境,模仿了开放平台局部产品的次要性能和次要逻辑。可用于在产品上线前理解环境、组合和调试各种接口。

沙箱环境配置

关上 支付宝开发者核心 并登录,点击 => 进入我的控制台(也可能登录之后主动进入),不须要企业账户, 集体的也能够

在开发者核心中点击开发服务下的研发服务,就进入沙箱环境页面了,

在沙箱利用能够看到根本配置。

密钥配置

点击 RSA2(SHA256) 密钥 设置,

点击 支付宝密钥生成器,下载对应版本的工具,下载实现后将工具装置在不蕴含空格的目录中,

而后点关上,点击生成密钥,即可生成商户利用私钥与商户利用公钥。而后点击复制公钥。

回到沙箱界面,抉择公钥,并把刚刚复制的公钥粘贴进去;

而后就能够失去支付宝公钥了,代码中会用到。

1, 封装配置

alipayUtil.js

const AlipaySdk = require('alipay-sdk').default; // 引入 SDK
const alipaySdk =  new  AlipaySdk({
  appId: '2021000117615613', // 开放平台上创立利用时生成的 appId
  signType: 'RSA2', // 签名算法, 默认 RSA2
  gateway: 'https://openapi.alipaydev.com/gateway.do', // 支付宝网关地址,沙箱环境下应用时须要批改
  alipayPublicKey: '', // 支付宝公钥,须要对后果验签时候必填
  privateKey: '', // 利用私钥字符串
});
module.exports = alipaySdk;

// 正式环境只有把上述换成正式的就能够了 

2, 接口定义

创立支付宝须要的表单表

 const formData = new AlipayFormData();
    formData.setMethod('get');

把 告诉加进去 (如需要的话)

 formData.addField('notifyUrl', 'https://www.baidu.com'); // 领取胜利回调地址,必须为能够间接拜访的地址,不能带参数 

而后就是须要的订单参数

 formData.addField('bizContent', {
        outTradeNo: orderId, // 商户订单号,64 个字符以内、可蕴含字母、数字、下划线, 且不能反复
        productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称, 仅反对 FAST_INSTANT_TRADE_PAY
        totalAmount: '0.01', // 订单总金额,单位为元,准确到小数点后两位
        subject: '商品', // 订单题目
        body: '商品详情', // 订单形容

    });

后就是 胜利回调: 这里我被坑了很久:

 formData.addField('returnUrl', 'https://opendocs.alipay.com');// 加在这里才有成果, 不是加在 bizContent 外面 

最初提交官网, 用官网文档的写法:

 const result =  alipaySdk.exec(  // result 为能够跳转到领取链接的 url
        'alipay.trade.page.pay', // 对立收单下单并领取页面接口
        {}, // api 申请的参数(蕴含“公共申请参数”和“业务参数”){formData: formData},
    );

订单查问 (可用可不必):

/**
 * 增加购物车提交订单支付宝领取后查问订单状态是否胜利 */
router.post('/api/member/queryOrderAlipay', (req, res) => {
  let orderId=req.body.orderId
  const formData = new AlipayFormData();
  formData.setMethod('get');
  formData.addField('bizContent', {orderId});
  // 通过该接口被动查问订单状态
  const result = alipaySdk.exec(
    'alipay.trade.query',
    {},
    {formData: formData},
  );
  axios({
    method: 'GET',
    url: result
  })
    .then(data => {
      let r = data.data.alipay_trade_query_response;
      if(r.code === '10000') { // 接口调用胜利
        switch(r.trade_status) {
          case 'WAIT_BUYER_PAY':
            res.send(
              {
                "success": true,
                "message": "success",
                "code": 200,
                "timestamp": (new Date()).getTime(),
                "result": {
                  "status":0,
                  "massage":'交易创立,期待买家付款'
                }
              }
            )
            break;
          case 'TRADE_CLOSED':
            res.send(
              {
                "success": true,
                "message": "success",
                "code": 200,
                "timestamp": (new Date()).getTime(),
                "result": {
                  "status":1,
                  "massage":'未付款交易超时敞开,或领取实现后全额退款'
                }
              }
            )
            break;
          case 'TRADE_SUCCESS':
            res.send(
              {
                "success": true,
                "message": "success",
                "code": 200,
                "timestamp": (new Date()).getTime(),
                "result": {
                  "status":2,
                  "massage":'交易领取胜利'
                }
              }
            )
            break;
          case 'TRADE_FINISHED':
            res.send(
              {
                "success": true,
                "message": "success",
                "code": 200,
                "timestamp": (new Date()).getTime(),
                "result": {
                  "status":3,
                  "massage":'交易完结,不可退款'
                }
              }
            )
            break;
        }
      } else if(r.code === '40004') {res.send('交易不存在');
      }
    })
    .catch(err => {
      res.json({
        msg: '查问失败',
        err
      });
    });

})

到这里就实现了, 胜利返回 领取领取的该地址前端只有拿到跳到这里地址去领取就能够了, 胜利后跳到回调胜利页面

接口演示

前端间接申请 而后拿到地址:

 goPay() {
            let data = {orderId: 't454545212121' // 随机生成惟一的就行了这个 本人找吧}
            var instance = this.$axios.create({headers: {'content-type': 'application/x-www-form-urlencoded'}});
             // 代理到  http://localhost:3000/api/pcpay
            instance.post(`http://localhost:3000/api/pcpay`, this.$qs.stringify(data)).then(res =>{
                this.data=res;
                window.open(res.data.result)
            });

        }

最初用沙箱版本 app 扫码付款能够看到成果

后果 demo​​​​​

心愿多多反对, 你的评论点赞都是我的能源, 有问题能够留言, 谢谢网友

退出移动版