支付宝App支付对接流程及SDK使用范例

  • 如果想在申请批准下来之前就进行开发调试,可以使用支付宝的 沙箱环境 。虽然和生产环境不是 100% 一致,但是足以开发调试业务了,需要注意的一点是在初始化 SDK 时,需要把网关设置为沙箱环境的网关。

  • 签约流程(签约应该是机器人自动审核的,审批的速度很快)

    • 签约 支付宝的 App 支付 产品

    • 新建 网页/移动应用​​​​ ​并且等待审核通过上线

      • 正常填写包名、应用名称、应用简介,注意应用签名是 MD5 格式的,并且不需要使用 :​​​ ​号隔开,直接填就行。
      • 审核通过后,在应用的产品绑定里,绑定 APP支付​​​ 这个产品
  • 设置开发相关的一些密钥参数

    • 注意:密钥方式加签,相关的密钥有三个,别弄混了。

      • 应用私钥,这个是自己生成的,私钥包含敏感信息,必须妥善保管,不能泄露。
      • 应用公钥,这个和应用私钥是配套一起生成的,之后需要配置到支付宝。
      • 支付宝公钥,用来验证来自支付宝的消息。在后续开发过程中,服务端会收到支付宝发送的同步、异步通知,需要使用支付宝公钥验证签名信息,防止消息是伪造的。
    • 打开自己新建的移动应用,在开发设置中设置接口的加签方式、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​​​​ 转为字符串, 参考这里

    • 之后就是结合业务逻辑,在服务端生成订单、接收支付宝的支付回调通知(注意验证签名和订单)、确认支付完成后更改订单状态这种东西了 。没啥说的,结合自己业务开发就行。

    • 参考: