有写到, 记录下支付宝领取
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
心愿多多反对, 你的评论点赞都是我的能源, 有问题能够留言, 谢谢网友