今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看。
什么是支付宝 API v3 版本?
官网上给的解释是基于 OAS3.0 API 规范,支付宝做了相应的 API 升级(v3),在开发体验上进行了重点优化。
与之前支付宝 API 的主要区别有几条:
- 使用 RESTful 设计风格,并通过 OpenAPI 规范(OAS)描述接口。
- 使用 JSON 作为数据交互的格式,不再使用 XML 和表单格式。
- 简化加验签逻辑,对 HTTP 报文整体进行签名。
- 简化加解密、文件上传等规范。
更多内容及详细介绍可直接参考 v3 协议简介 。
其实之前也没有 v2 的概念,不过根据对文档整体的理解来看,v2 版本的概念应该就是之前调用的 通用版本 和 Easy 版本 。
两个版本的差异可以参考下方表格:
顺便提一句,通用版目前是我用的最多的方式,主要是用习惯了不想改(可不是因为偷懒_(:з」∠)_不过新版方式后面也可以试一下看看。
PS:通用版自签名的方法可以参考:[SDK 如何实现签名],SDK 接口调用方式参考:[代码示例]。
如何对接v3版本
v3 版本比起 v2 版本来说 改变的地方还是挺多的,最大的改变就是请求的方式,由原本的 RPC 风格切换成了RESTful。
下面我们就来看看 v3 版本自签名是如何调用的。
下面以 统一收单交易支付接口 为例。
步骤一:构造 authString
authString 也就是 v3 版本新加的身份鉴权信息。
需要用到的参数有:
- app_id:开放平台颁发的应用 id。
- timestamp:Unix 时间戳,精确到毫秒。
- nonce:自定义参数,自己生成唯一性字符串,每次请求要保证唯一。
组装示例
long Unix=date.getTime();
String authString= "app_id="+app_id+",timestamp="+Unix+",nonce=3246658768654544";
authString生成内容
app_id=2014111111111122,timestamp=1702452177941,nonce=3246658768654544
步骤二:拼接待签名字符串
需要用到的参数有:
- authString:上一步返回。
- httpMethod:本次请求的 http 方法,例如 GET\POST\PUT。
- httpReuqestUrl:这个从对应接口文档请求 url 中拿,不包含域名值。
- httpRequestBody:本次请求的 body 内容;GET方式请求时,入参空字符串。
注意:下方代码示例中的 \n
千万不能丢!!!不然验签通过不了的QAQ
组装示例
String httpMethod="POST";
String httpReuqestUrl= "/v3/alipay/trade/precreate";
String httpRequestBody="{\"out_trade_no\":\"20181128763521373251698\",\"total_amount\":\"1\",\"subject\":\"123\",\"body\":\"body\"}";
String content=authString+"\n"+httpMethod+"\n"+httpReuqestUrl+"\n"+httpRequestBody+"\n";
System.out.println("content:"+"\n"+content);
返回内容
app_id=2021111111111122,timestamp=1702452177941,nonce=3246658768654544
POST
/v3/alipay/trade/precreate
{"out_trade_no":"20181128763521373251698","total_amount":"1","subject":"123","body":"body"}
步骤三:生成 sign
需要用到的参数有:
- content:上一步返回。
- privateKey:应用私钥,如何获取参考[如何获取商户私钥]。
- charset:编码格式。
加签方式这边我想吐槽下:文档上加密方式说是支持 SHA256withRSA 和 SM3WithSM2 两种,但是能用国密加签方式为什么不给我国密配置入口哇,不给入口说支持都是耍流氓啊
标签:支付宝,请求,content,v3,签名,httpPost,id,String From: https://blog.51cto.com/yjdmx/8918229