服务端接入支付宝文档解读

发布于:2024-05-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

这个文档类似文言文,需要解读一下才能变成人话,请听我解读

首先确定职责范围和边界,这是最重要的,方向不对努力白费

image.png 这个图可谓是文档里最最重要的,没有之一,我在文档的犄角旮旯里找到了。

支付宝没有强调他的重要性,我替他强调一下

请看这个图,1.3,1.13,1.15是服务端要做的,除此以外的不用管,分别对应文档:app支付接口2.0文档,异步通知说明,同步通知说明

在这个图里,请注意1.3,他是没有网络请求的,重点强调!

如果你不用他的sdk,那这个文档写了和没写一样。

每到关键的地方,就会写着执行sdk,他还会很贴心的提供代码!代码是这么写的:

$aop->sdkExecute($request);
alipayClient.sdkExecute(request);
client.SdkExecute(request);
await alipaySdk.sdkExec();

是不是有种写了寂寞的感觉?

如果你不用他的sdk,其实也是有文档的,只是很隐蔽,怎么找到呢?

点击签名打开了一个页面告诉你签名规则,他是属于通用工具栏目里的,旁边有个栏目叫技术接入指南,里面有个开发指南,里面有个自行实现签名/自行实现验签。

这就需要提一下他的sdk代码了,他的sdk就做了几件事而已:签名/验签/处理证书。

解读一下,当文档在说sdk的时候,可以理解为他在说签名/验签

那自己实现一下签名/验签就是了,要什么sdk。

有具体的规则,有证书,签名就那么点东西,他还能玩出花样?他能

首先是证书,他提供了很多的文件,但是他不告诉这些文件是什么,你自己猜,我们来看看

  • 应用公钥RSA2048.txt
  • 应用私钥RSA2048-敏感数据,请妥善保管.txt
  • 支付宝.txt
  • alipayCertPublicKey_RSA2.crt
  • alipayRootCert.crt
  • appCertPublicKey_20210041xxxx.crt
  • CSR文件.csr

在自行实现签名里,他这样说:

需携带 应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn)SN 值是通过解析 X.509 证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算 MD5 值获取

支付宝根证书SN这个是确定的:alipayRootCert.crt,这个没问题,因为只有这一个文件名里带root

应用公钥证书SN(app_cert_sn)要靠猜了。在很多次验证之后发现他说的应用公钥匙证书是appCertPublicKey_20210041xxxx.crt

签发机构名称(name)这是java语言解析出来的叫name长这样:

CN=Ant Financial Certification Authority Class 1 R1,OU=Certification Authority,O=Ant Financial,C=CN

但是php语言解析出来叫issuer,长这样

[C] => CN
[O] => Ant Financial
[OU] => Certification Authority
[CN] => Ant Financial Certification Authority Class 1 R1

go语言解出来叫issuer,长这样

CN=Ant Financial Certification Authority Class 1 R1,OU=Certification Authority,O=Ant Financial,C=CN

文档里用name对其他语言太不友好了,要不是看了php源码,我真不知道去哪找name

使用各自语言对应的 SHA256WithRSA(对应 sign_type 为 RSA2)或 SHA1WithRSA(对应 sign_type 为 RSA)签名函数利用商家私钥对签名字符串进行签名,并进行 Base64 编码

私钥在哪?看文件名毫无疑问是这个:应用私钥RSA2048-敏感数据,请妥善保管.txt,但这内容也不是私钥格式啊

抱歉,你需要自己处理一下格式,怎么处理?文档没有,看sdk代码

下一个要解释的是公钥验签,自行实现验签的时候,他是这么说的:

使用各自语言对应的 SHA256WithRSA (对应 sign_type 为 RSA2) 或 SHA1WithRSA (对应 sign_type 为 RSA) 签名验证函数,传入待验签字段、支付宝公钥证书存放路径、签名内容(sign),验签方法(signType)进行验签,根据返回结果判定是否验签通过。

公钥是哪个呢?猜就完事了,经过各种试验,发现是alipayCertPublicKey_RSA2.crt

而且这个公钥不能直接用,需要处理一下,但是我文档不说,你看源码

最后一个要解释的是服务端API列表,各种支付接口,看他的文档结构,有请求参数,响应参数,还有错误码呢,文档上这样写着

请在服务端执行支付宝SDK中sdkExecute方法,读取响应中的body()结果。

第一反应是这是一个http请求,但是我找不到method,query,body,header,response啊,只有一个网关域名,这咋回事???

看sdk源码才知道,这根本就不是一个http请求,这就是签名而已

我建议支付宝文档,别总拿sdk说事,sdk毕竟封装了一次,不够直接,请直接说事。

  • 如果是签名,描述签名规则
  • 如果是验证,描述验证规则
  • 如果是网络请求,请给出curl
  • 如果需要证书,请指明证书以及如何处理

有了签名/验签规则、证书和curl,我不信还有什么说不清楚的。

sdk应该是辅助,有更好,没有也完全不影响。

接完之后,发现接入过程非常简单,和其他第三方没有什么不同,关键的地方一页纸一定能说清楚,不知道他们这么多人在写什么


网站公告

今日签到

点亮在社区的每一天
去签到