跳到主要内容

支付宝支付

简介​

支付宝支付是蚂蚁集团旗下的第三方支付平台,为商户和用户提供安全、便捷的支付解决方案。支持电脑网站支付、手机网站支付、APP支付、当面付等多种支付方式。本文档主要介绍电脑网站支付的接入流程和代码实现。

电脑网站支付是在电脑上打开的网站中集成支付宝支付功能,买家使用电脑上网时,通过浏览器跳转到支付宝收银台完成付款。支付完成后会跳转回商户指定的页面。

参考资料​

支付流程​

关键代码实现​

前端调用(JavaScript)​

// 引入方式(仅手机网站支付 JSAPI 需要):
// CDN: <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script>
// npm: @alipay/alipayjsapi,引入后通过全局 ap 对象调用

// 电脑网站支付:创建订单后跳转收银台
async function createAlipayOrder(orderData) {
const response = await fetch('/api/alipay/create-order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(orderData)
});

const result = await response.json();

if (result.payUrl) {
// 后端以 method 'get' 组装参数时返回收银台 URL
window.location.href = result.payUrl;
return;
}

// 后端返回自动提交表单时(EasySDK / page_execute),注入页面并提交
const container = document.createElement('div');
container.innerHTML = result.formHtml;
document.body.appendChild(container);
container.querySelector('form')?.submit();
}

// 手机网站支付(支付宝客户端内)
async function createMobileAlipayOrder(orderData) {
const response = await fetch('/api/alipay/create-wap-order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(orderData)
});
const result = await response.json();

const isAlipayClient = /alipayclient/i.test(navigator.userAgent);
if (isAlipayClient) {
ap.tradePay(
{ tradeNO: result.tradeNo },
(res) => {
// res.resultCode '9000' 表示支付成功,最终状态以后端异步通知为准
if (res.resultCode === '9000') {
window.location.href = '/pay/success';
}
}
);
} else {
window.location.href = result.payUrl;
}
}

后端实现​

// 使用支付宝官方SDK(alipay-sdk v2)
const AlipaySdk = require('alipay-sdk').default;
const AlipayFormData = require('alipay-sdk/lib/form').default;

class AlipayService {
constructor(config) {
this.alipaySdk = new AlipaySdk({
appId: config.appId,
privateKey: config.privateKey,
alipayPublicKey: config.alipayPublicKey,
gateway: config.gateway || 'https://openapi.alipay.com/gateway.do'
});
}

// 创建支付订单:method 'get' 时返回收银台 URL
async createPagePay(orderData) {
const formData = new AlipayFormData();
formData.setMethod('get');

formData.addField('bizContent', {
out_trade_no: orderData.outTradeNo,
product_code: 'FAST_INSTANT_TRADE_PAY',
total_amount: orderData.totalAmount,
subject: orderData.subject,
body: orderData.body
});

formData.addField('returnUrl', orderData.returnUrl);
formData.addField('notifyUrl', orderData.notifyUrl);

return this.alipaySdk.exec('alipay.trade.page.pay', {}, {
formData: formData
});
}

// 验证回调签名
checkNotifySign(postData) {
return this.alipaySdk.checkNotifySign(postData);
}

// 查询订单状态
async queryOrder(outTradeNo) {
return this.alipaySdk.exec('alipay.trade.query', {
bizContent: {
out_trade_no: outTradeNo
}
});
}
}

// 服务单例,避免每次请求重建
const alipayService = new AlipayService(config);

// 支付回调:报文为 form-urlencoded,需启用 express.urlencoded({ extended: false }) 中间件
app.post('/api/alipay/notify', (req, res) => {
if (!alipayService.checkNotifySign(req.body)) {
return res.send('fail');
}

const { out_trade_no, trade_status } = req.body;

if (trade_status === 'TRADE_SUCCESS' || trade_status === 'TRADE_FINISHED') {
// 更新前须与本地订单核对金额;写入需幂等,防止重复通知重复处理
updateOrderStatus(out_trade_no, 'paid');
}

// 验签通过的通知一律返回 success,否则支付宝会按间隔重发(最多 8 次)
res.send('success');
});

配置文件​

{
"alipay": {
"appId": "your_app_id",
"privateKey": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----",
"alipayPublicKey": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----",
"gateway": "https://openapi.alipay.com/gateway.do",
"returnUrl": "https://your-domain.com/pay/success",
"notifyUrl": "https://your-domain.com/api/alipay/notify"
}
}