支付宝App支付后端怎么做?alipay_sdk_cj客户端请求串生成完整教程
【免费下载链接】alipay_sdk_cjAliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最安全的RSA2,公钥证书方式签名验证方式,默认只支持utf-8编码和JSON格式)项目地址: https://gitcode.com/Cangjie-SIG/alipay_sdk_cj
做支付宝 App 支付时,后端最核心的一步就是生成客户端请求串:商户服务器用私钥对订单参数签名,把签名后的整串数据下发给 App 端,App 再把它传给支付宝 SDK 唤起收银台。开源项目 alipay_sdk_cj 是支付宝接口的仓颉(Cangjie)后端 SDK,支持 RSA2 公钥证书验签方式,覆盖 App 支付、网页支付、退款、关单等 12 个常用接口,默认 utf-8 编码和 JSON 格式,让仓颉开发者几行代码就能接入支付宝支付接口。
为什么 App 支付后端只需要"生成字符串"?
很多新手会疑惑:为什么后端不直接调用支付宝网关?
这是支付宝 App 支付的官方机制决定的:
| 环节 | 谁来干 | 干什么 |
|---|---|---|
| 1. 下单签名 | 商户后端 | 用应用私钥对订单参数排序签名,生成客户端请求串 |
| 2. 唤起收银台 | App 客户端 | 把请求串交给支付宝 SDK,唤起支付宝收银台 |
| 3. 异步通知 | 支付宝 → 商户后端 | 支付完成后支付宝回调 notify_url,后端验签并改单 |
alipay_sdk_cj 把第 1 步封装成了tradeAppPay接口,直接返回签名后的请求串字符串,签名、参数排序、编码这些"魔鬼细节"全部由 src/request.cj 和 src/sign.cj 内部完成。
⚠️ 该 SDK 只支持商户直接接入模式和 RSA2(SHA256WithRSA)公钥证书验签方式,这也是官方目前推荐的接入方式。
接入前准备:配置依赖与密钥
第一步:在你的项目 cjpm.toml 中添加依赖
如果你的项目使用仓颉 LTS 1.0.0 版本,在 cjpm.toml 中添加:
[dependencies] alipay_sdk = {git = "https://gitcode.com/Cangjie-SIG/alipay_sdk_cj.git", branch = "main"}如果是 Beta Channel 0.53.13 版本,分支名换成beta_0.53.13。
📌 注意:1.0.0 版本需要单独下载 stdx 扩展包,并配置环境变量
CANGJIE_STDX_HOME指向 stdx 存放路径(Linux/macOS 写在~/.bash_profile或~/.zshrc里)。
第二步:准备 6 个密钥配置项
在支付宝开放平台选择公钥证书方式生成 RSA2 密钥(密钥格式要求 PKCS1),拿到下面这些值:
| 配置项 | 说明 |
|---|---|
appID | 支付宝分配的应用 ID |
privateKey | 应用私钥(单行文本) |
publicKey | 应用公钥(单行文本) |
appCertSn | 应用公钥证书序列号 SN |
alipayRootCertSn | 支付宝根证书 SN |
alipayPublicKey | 证书解析出的支付宝公钥 |
开发调试建议先用沙箱环境(网关地址https://openapi-sandbox.dl.alipaydev.com/gateway.do),上线时再切换正式证书配置。
快速上手:构建支付宝客户端
用PayClientBuilder链式构建一个客户端,源码定义在 src/pay.cj:
import alipay_sdk.{PayClientBuilder, Payer} import alipay_sdk.biz func newPayClient(): Payer { var client = PayClientBuilder() .setAppID(appid) // 应用ID .setApiUrl(apiurl) // 网关地址 .setAlipayRootCertSn(alipayrootcertsn) // 支付宝根证书SN .setAlipayPublicKey(alipaypubKey) // 支付宝公钥 .setAppCertSn(appcertsn) // 应用公钥证书SN .setPrivateKey(privateKey) // 应用私钥 .setPublicKey(pubkey) // 应用公钥 .setCharset("utf-8") .setFormat("JSON") .setSignType("RSA2") .setVersion("1.0") .setNotifyUrl("https://你的域名/callback") // 异步回调地址 .build() return client }build()方法会校验所有必填项,缺任何一项都会抛出明确的异常(如api_url is required),帮你快速定位配置问题。
核心步骤:生成 App 支付客户端请求串
1. 组装订单业务参数
App 支付对应的业务参数类是TradeAppPayBiz,定义在 src/biz/trade_app_pay.cj,必选字段就 3 个:
| 字段 | 方法 | 说明 |
|---|---|---|
out_trade_no | setOutTradeNo | 商户订单号,唯一 |
total_amount | setTotalAmount | 订单总金额(元) |
subject | setSubject | 订单标题 |
其余字段(如body订单描述、timeout_express超时时间)可以通过通用的set(key, value)方法追加,业务参数基类见 src/biz/biz_content.cj。
2. 一行代码生成请求串
main() { var bizContent = biz.TradeAppPayBiz() bizContent.setOutTradeNo(JsonString("2024102817470400001")) bizContent.setTotalAmount(JsonString("88.88")) bizContent.setSubject(JsonString("仓颉App测试订单")) let client = newPayClient() // 返回的就是可以直接下发给App端的客户端请求串 let orderStr = client.tradeAppPay(bizContent) println(orderStr) return }tradeAppPay的完整实现在 src/pay.cj,它内部走的是createClienSdktRequest分支:组装公共参数 → 字典序排序 → 用私钥 RSA2 签名 → 输出application/x-www-form-urlencoded格式的整串数据。注意这条路径不会发起 HTTP 请求,因为 App 支付场景下签名串是给客户端用的,不经过服务端网关。
生成的请求串长这样(示意):
app_id=2021000...&biz_content={"out_trade_no":"...","total_amount":"88.88","subject":"..."}&charset=utf-8&method=alipay.trade.app.pay¬ify_url=...&sign=MEQCI...&sign_type=RSA2×tamp=2024-10-28 17:47:04&version=1.0把它通过你自己的接口(如 JSON 响应)下发给 App 端即可,App 端把它传给支付宝 SDK 就能唤起收银台。
别忘了后半程:异步回调验签
支付完成后,支付宝会以 POST 方式把结果推送到你配置的notify_url。用asyncVerifySign方法验签,确认消息确实来自支付宝服务器:
// 在HTTP回调处理器中 let isPass = newPayClient().asyncVerifySign(body) if (isPass) { // 验签通过:更新订单状态,必须返回字符串 "success" ctx.responseBuilder.status(200).body("success") } else { ctx.responseBuilder.status(200).body("fail") }两个容易踩的坑:
- ✅ 验签通过必须返回字符串
success,否则支付宝会重复多次重试推送; - ✅ 验签失败统一返回
fail。
关键源码导读
| 文件 | 职责 |
|---|---|
| src/pay.cj | 客户端主体:PayClient、PayClientBuilder与全部 12 个接口入口 |
| src/request.cj | 公共参数组装、字典排序、encodePayload签名编码 |
| src/sign.cj | RSA2 签名/验签(SHA256WithRSA + Base64),支持 PKCS1 密钥格式 |
| src/util.cj | 北京时区时间戳、回调消息待签名字符串解析等工具函数 |
| src/biz/trade_app_pay.cj | App 支付业务参数类 |
| example/src/main.cj | 完整可运行示例(沙箱环境) |
SDK 测试用例(基于沙箱公钥证书)位于 src/test/pay_test.cj,跟着示例代码就能跑通全流程。
常见问题 FAQ
Q1:tradeAppPay和tradeCreate有什么区别?tradeCreate是服务端直接调网关创建预订单(返回 trade_no);tradeAppPay是 App 支付模式,后端只生成签名请求串,由 App 端唤起支付宝完成下单和支付。
Q2:支持退款吗?支持。SDK 提供tradeRefund(退款)、tradePageRefund(退款页面)、tradeFastpayRefundQuery(退款查询)、tradeCancel(撤销)、tradeClose(关单)等接口,退款类响应结构定义在 src/response/ 目录下。
Q3:密钥格式不对会怎样?注意密钥必须是PKCS1格式(非 Java 适用),生成方式参考支付宝开放平台的公钥证书文档。SDK 内部会自动为单行密钥补上 PEM 头尾并换行格式化(见 src/sign.cj 中的formatKey)。
Q4:以后想加网页支付怎么办?tradePagePay(电脑网站)和tradeWapPay(手机网站)已经支持,它们返回的是自动提交的 HTML form 页面,直接渲染给浏览器即可,实现同样在 src/pay.cj。
总结
用 alipay_sdk_cj 做支付宝 App 支付后端,流程可以概括为四步:
- 配依赖:cjpm.toml 引入
alipay_sdk; - 建客户端:
PayClientBuilder填入 AppID 和 RSA2 证书密钥; - 生成请求串:
TradeAppPayBiz填 3 个必选字段,调tradeAppPay拿到签名串下发给 App; - 接收回调:
asyncVerifySign验签,成功返回success。
整条链路只涉及 RSA2 签名和参数组装,没有多余的 HTTP 细节要处理,对仓颉新手非常友好 🚀
【免费下载链接】alipay_sdk_cjAliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最安全的RSA2,公钥证书方式签名验证方式,默认只支持utf-8编码和JSON格式)项目地址: https://gitcode.com/Cangjie-SIG/alipay_sdk_cj
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考