在这篇文章中,我们将展示如何在多个编程语言中实现支付宝支付功能,并处理支付回调。我们将覆盖以下几种语言:Node.js、Python 和 Java。
在开始之前,请确保您已经完成以下准备工作:
首先,我们需要安装支付宝的SDK和其他依赖:
npm install alipay-sdk --save
npm install koa koa-router --save
const AlipaySdk = require('alipay-sdk').default;
const alipaySdk = new AlipaySdk({
appId: 'YOUR_APP_ID',
privateKey: 'YOUR_PRIVATE_KEY',
alipayPublicKey: 'ALIPAY_PUBLIC_KEY'
});
const createOrder = async (ctx) => {
const order = {
out_trade_no: 'unique_order_no',
product_code: 'FAST_INSTANT_TRADE_PAY',
total_amount: '0.01',
subject: 'test order'
};
const result = await alipaySdk.exec('alipay.trade.page.pay', {
bizContent: order,
returnUrl: 'http://yourwebsite.com/callback',
notifyUrl: 'http://yourwebsite.com/notify'
});
ctx.redirect(result);
};
// 设置路由
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router.get('/create-order', createOrder);
app.use(router.routes());
app.listen(3000);
const crypto = require('crypto');
const verifySignature = (params, sign) => {
const signContent = Object.keys(params).sort().map(key => {
if (key !== 'sign' && key !== 'sign_type' && params[key]) {
return `${key}=${params[key]}`;
}
return '';
}).join('&');
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(signContent, 'utf8');
return verifier.verify('ALIPAY_PUBLIC_KEY', sign, 'base64');
};
const notify = async (ctx) => {
const params = ctx.request.body;
const sign = params.sign;
delete params.sign;
if (verifySignature(params, sign)) {
// 验签成功,处理业务逻辑
console.log('Payment successful:', params);
ctx.body = 'success';
} else {
// 验签失败
ctx.body = 'fail';
}
};
router.post('/notify', notify);
pip install alipay-sdk-python
pip install flask
from flask import Flask, redirect, request
from alipay import AliPay
app = Flask(__name__)
alipay = AliPay(
appid="YOUR_APP_ID",
app_notify_url="http://yourwebsite.com/notify",
app_private_key_string=open("path/to/your/private_key.pem").read(),
alipay_public_key_string=open("path/to/alipay_public_key.pem").read()
)
@app.route('/create-order')
def create_order():
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no="unique_order_no",
total_amount="0.01",
subject="test order",
return_url="http://yourwebsite.com/callback"
)
return redirect("https://openapi.alipaydev.com/gateway.do?" + order_string)
if __name__ == '__main__':
app.run(port=3000)
import json
from flask import request, Flask
app = Flask(__name__)
@app.route('/notify', methods=['POST'])
def notify():
data = request.form.to_dict()
sign = data.pop('sign', None)
success = alipay.verify(data, sign)
if success:
print("Payment successful:", data)
return 'success'
else:
return 'fail'
if __name__ == '__main__':
app.run(port=3000)
在pom.xml
中添加以下依赖:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.0</version>
</dependency>
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
public class AlipayExample {
public static void main(String[] args) throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
"YOUR_APP_ID",
"YOUR_PRIVATE_KEY",
"json",
"UTF-8",
"ALIPAY_PUBLIC_KEY",
"RSA2"
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("http://yourwebsite.com/callback");
request.setNotifyUrl("http://yourwebsite.com/notify");
request.setBizContent("{\"out_trade_no\":\"unique_order_no\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\","
+ "\"total_amount\":\"0.01\","
+ "\"subject\":\"test order\"}");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
System.out.println("Call succeeded, redirect to payment page.");
} else {
System.out.println("Call failed.");
}
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.alipay.api.internal.util.AlipaySignature;
public class NotifyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = req.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, requestParams.get(name)[0]);
}
try {
boolean flag = AlipaySignature.rsaCheckV1(
params,
"ALIPAY_PUBLIC_KEY",
"UTF-8",
"RSA2"
);
if (flag) {
System.out.println("Payment successful:" + params);
resp.getWriter().write("success");
} else {
resp.getWriter().write("fail");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过上述步骤,您可以在不同的编程语言中实现支付宝支付功能,并处理支付回调。每种语言的实现逻辑基本相同,主要区别在于SDK的使用和请求/响应的处理方式。希望这篇文章能对您有所帮助!