支付宝App支付对接流程及SDK使用范例
如果想在申请批准下来之前就进行开发调试,可以使用支付宝的 沙箱环境 。虽然和生产环境不是 100% 一致,但是足以开发调试业务了,需要注意的一点是在初始化 SDK 时,需要把网关设置为沙箱环境的网关。
签约流程(签约应该是机器人自动审核的,审批的速度很快)
签约 支付宝的 App 支付 产品
- 签约成功后会在
支付宝开放平台的控制台
里看到一个类型为
基础应用
的应用2.0签约
- 签约成功后会在
支付宝开放平台的控制台
里看到一个类型为
新建
网页/移动应用
并且等待审核通过上线- 正常填写包名、应用名称、应用简介,注意应用签名是 MD5 格式的,并且不需要使用
:
号隔开,直接填就行。 - 审核通过后,在应用的产品绑定里,绑定
APP支付
这个产品
- 正常填写包名、应用名称、应用简介,注意应用签名是 MD5 格式的,并且不需要使用
设置开发相关的一些密钥参数
注意:密钥方式加签,相关的密钥有三个,别弄混了。
- 应用私钥,这个是自己生成的,私钥包含敏感信息,必须妥善保管,不能泄露。
- 应用公钥,这个和应用私钥是配套一起生成的,之后需要配置到支付宝。
- 支付宝公钥,用来验证来自支付宝的消息。在后续开发过程中,服务端会收到支付宝发送的同步、异步通知,需要使用支付宝公钥验证签名信息,防止消息是伪造的。
打开自己新建的移动应用,在开发设置中设置接口的加签方式、IP 白名单、应用网关等等。
设置完成之后,可以使用生产环境的参数进行测试了
[[2023-02-28]] 补充:
- 笑死,刚吐槽完没两天,
ncu
一检查,alipay-sdk
居然更新发包更新到3.3.0
了,我那个震惊啊 = =。 - 原来的那个 PR 已经被合并,如果你
alipay-sdk
更新到了3.3.0+
,可以直接使用sdkExec
方法去调用alipay.trade.app.pay
这个 App 支付接口,详细的可以参考文档: alipay/alipay-sdk-nodejs-all: 支付宝开放平台 Alipay SDK for Node.js (github.com) 。 - 最重要的是,目前项目的 README.md 文档相比原来简直友善太多了,想必可以避免很多人踩坑了。
- 笑死,刚吐槽完没两天,
下面是原来的内容:
Node.js 下支付宝官方提供的 SDK 是 alipay-sdk - npm (npmjs.com) ,上次提交还是
2021年12月13号
,然后 PR 也没人合并。怕是又一个年久失修预定,虽然很奇怪,但想想是阿里的开源,也很正常。此外必须吐槽,支付宝 SDK 相关的文档写的太拉跨了,让人简直都无力吐槽了,给个 1 分吧,怕骄傲。
看了文档,之后很自然的就认为调用 App 支付的方式应该是:
const result = await alipaySdk.exec(method, params, options);
就去调用 App 支付的接口,然后就看到了 302 重定向,报错提示是:
HTTP请求出错
,满脸问号。各种搜索,还在阿里的开发者论坛上看到十几个报告这个问题的,都是和我一样纯纯的大冤种啊,然而官方一个有用的答复都没,摊手。
最后还是在 GitHub Issues 里找到了相关信息,白白浪费了一下午时间,摔。
移动端的 App 想要唤醒支付宝进行支付,不需要像上面那样调用服务端的 SDK。
在服务端,只需要获取到
orderInfo
这个东西,它是支付宝 App 支付的请求参数字符串,主要包含商家的订单信息,形式为key=value
,以&
连接。服务端把这个东西返回给前端,然后传给支付宝 Android 的 SDK,就能唤醒支付宝进行支付了。下面是服务端如何获取
orderInfo
的例子:import AlipaySdk from "alipay-sdk"; import { PAY } from "../../app.config"; import { randomUUID } from "crypto"; import { sign } from "alipay-sdk/lib/util"; const alipaySdk = new AlipaySdk({ appId: PAY.alipay.appId, privateKey: PAY.alipay.appPrivateKey, alipayPublicKey: PAY.alipay.publicKey, }); const signData = sign( "alipay.trade.app.pay", { bizContent: { subject: `测试商品:${+new Date()}`, // 商品名称 total_amount: '0.01', // 商品金额 out_trade_no: randomUUID(), // 商家订单号,需保证唯一性 }, }, alipaySdk.config ); /** 将这个orderInfo返回给前端,前端使用它去调SDK,唤醒支付宝支付 */ const orderInfo = new URLSearchParams(signData).toString();
此外还有个被很多人吐槽的坑需要额外留意,别再一脚踩进大坑里:如果是页面类型的接口调用,需要将
bizContent
转为字符串, 参考这里 。之后就是结合业务逻辑,在服务端生成订单、接收支付宝的支付回调通知(注意验证签名和订单)、确认支付完成后更改订单状态这种东西了 。没啥说的,结合自己业务开发就行。
参考: