本次开发在支付模块中新增了支付宝当面付第三方接口功能,通过调用旧系统的PHP接口生成支付URL和二维码。
路径: dryad-payment/src/main/java/com/ruoyi/payment/infrastructure/channel/alipay/AlipayThirdPartyClient.java
功能:
- 封装第三方支付宝接口调用
- 使用Apache HttpClient发送multipart/form-data请求
- 解析第三方接口响应,提取支付URL
核心方法:java public String createQrCodeUrl(String notifyUrl, String outTradeNo, Integer totalFee, String serviceOrdId)
路径: dryad-payment/src/main/java/com/ruoyi/payment/application/service/PaymentService.java
新增内容:
- 注入 AlipayThirdPartyClient Bean
- 新增方法 createAlipayThirdPartyPrecreate() - 处理第三方支付宝当面付业务逻辑
- 新增方法 callAlipayThirdPartyPrecreate() - 调用第三方接口生成支付URL
路径: dryad-payment/src/main/java/com/ruoyi/payment/interfaces/controller/PaymentController.java
新增接口:
- POST /api/pay/alipay/thirdparty/precreate - 发起支付宝当面付(第三方接口)
路径: dryad-payment/doc/支付宝第三方接口使用说明.md
内容:
- 功能说明
- 接口参数文档
- 代码实现说明
- 使用示例
- 注意事项
路径: dryad-payment/doc/支付宝第三方接口测试文档.md
内容:
- Postman测试步骤
- cURL测试命令
- 各种测试场景
- 前端集成示例
- 问题排查指南
使用Apache HttpClient发送multipart/form-data格式的POST请求:java HttpEntity entity = MultipartEntityBuilder.create() .addTextBody("notify_url", notifyUrl) .addTextBody("out_trade_no", outTradeNo) .addTextBody("total_fee", String.valueOf(totalFee)) .addTextBody("ServiceOrdID", serviceOrdId) .build();
| 业务参数 | 第三方参数 | 说明 |
|---|---|---|
| callbackUrl | notify_url | 回调通知地址 |
| orderId | out_trade_no | 订单ID |
| amount | total_fee | 金额(分) |
| bizOrderId | ServiceOrdID | 业务订单号 |
提供了灵活的URL解析方法,支持:
- 直接返回URL字符串
- JSON格式响应
- 带引号的URL字符串
可根据实际返回格式调整 parseQrCodeUrl() 方法。
复用现有的 QrCodeUtil 工具类,将支付URL转换为Base64格式的二维码图片。
前端请求
↓
PaymentController.createAlipayThirdPartyPrecreate()
↓
PaymentService.createAlipayThirdPartyPrecreate()
↓
callAlipayThirdPartyPrecreate()
↓
AlipayThirdPartyClient.createQrCodeUrl()
↓
HTTP POST → https://sys.966120.com.cn/alipay_pay_QR_NotifyUrl.php
↓
解析响应得到支付URL
↓
QrCodeUtil.generateQrCodeBase64() - 生成二维码
↓
保存订单和交易记录
↓
返回支付信息给前端
| 对比项 | 标准支付宝SDK接口 | 第三方接口 |
|---|---|---|
| 实现类 | AlipayF2FClient | AlipayThirdPartyClient |
| 调用方式 | 支付宝SDK | HTTP POST |
| 接口地址 | 支付宝官方 | 旧系统PHP接口 |
| 返回内容 | qr_code | 支付URL |
| 接口路径 | /api/pay/alipay/precreate | /api/pay/alipay/thirdparty/precreate |
https://dsp.966120.com.cn/alipay/pay_notify在 PaymentService.callAlipayThirdPartyPrecreate() 方法中可修改:
- 默认回调地址
- 其他业务参数
第三方接口的实际返回格式需要根据实际情况调整 parseQrCodeUrl() 方法:
private String parseQrCodeUrl(String responseBody) {
// 根据实际返回格式调整
// 如果是JSON: JSONObject json = JSON.parseObject(responseBody);
// 如果是纯文本: return responseBody.trim();
}
建议添加更详细的错误处理和日志记录,便于问题排查。
考虑添加:
- HTTP连接池
- 超时设置
- 重试机制
- 熔断降级
项目已包含所需依赖,无需额外添加:
- org.apache.httpcomponents:httpclient:4.5.13
- com.google.zxing:core:3.4.1
- com.google.zxing:javase:3.4.1
如有问题,请查阅:
- 使用说明文档: doc/支付宝第三方接口使用说明.md
- 测试文档: doc/支付宝第三方接口测试文档.md