在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
};
});
}
前端内容就对应着传入后端需要的字段就可以了