支付宝App支付后端怎么做?alipay_sdk_cj客户端请求串生成完整教程
2026/9/24 15:42:35 网站建设 项目流程

支付宝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_nosetOutTradeNo商户订单号,唯一
total_amountsetTotalAmount订单总金额(元)
subjectsetSubject订单标题

其余字段(如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&notify_url=...&sign=MEQCI...&sign_type=RSA2&timestamp=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客户端主体:PayClientPayClientBuilder与全部 12 个接口入口
src/request.cj公共参数组装、字典排序、encodePayload签名编码
src/sign.cjRSA2 签名/验签(SHA256WithRSA + Base64),支持 PKCS1 密钥格式
src/util.cj北京时区时间戳、回调消息待签名字符串解析等工具函数
src/biz/trade_app_pay.cjApp 支付业务参数类
example/src/main.cj完整可运行示例(沙箱环境)

SDK 测试用例(基于沙箱公钥证书)位于 src/test/pay_test.cj,跟着示例代码就能跑通全流程。

常见问题 FAQ

Q1:tradeAppPaytradeCreate有什么区别?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 支付后端,流程可以概括为四步:

  1. 配依赖:cjpm.toml 引入alipay_sdk
  2. 建客户端PayClientBuilder填入 AppID 和 RSA2 证书密钥;
  3. 生成请求串TradeAppPayBiz填 3 个必选字段,调tradeAppPay拿到签名串下发给 App;
  4. 接收回调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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询