开发者社区
社区提问意见反馈
开发者钉组织
扫描二维码
加入支付宝开发者钉组织
文档中心
开放平台 
收藏
订阅更新
我的文档
设置
如果未使用支付宝开放平台 sdk,需要自行实现加签过程。支付宝开放平台密钥工具提供 签名 功能,生成 签名(sign)后,开发者可与自己代码中请求生成的信息进行对比,了解数据是否正确。详情可查看 支付宝开放平台密钥工具 > 签名
支付宝现已推出符合oas3.0规范的api(v3版本),拥有更简洁的签名/验签处理逻辑,推荐无法使用sdk的用户,直接对接 v3版本的openapi
签名算法说明
支付宝开放平台开发助手生成密钥主要使用 rsa2 、sm2 签名算法。签名主要包含两个过程:摘要和非对称加密。
首先对需要签名的数据做摘要(类似于常见的 md5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果,详情可查看
说明:新建应用只支持 rsa2 签名方式(安全能力高于 rsa),目前已使用 rsa 签名方式的应用仍然可以正常调用接口,详情可查看 开放平台证书升级指南
签名算法
标准签名算法
描述
rsa2
sha256withrsa
强制要求 rsa 密钥的长度至少为 2048。
注意:
协议参数:开放平台的报文标准中,sign_type 参数用于指定签名算法,若使用 sha256withrsa 签名算法则在报文中需要指定 sign_type=rsa2,若开发者使用开放平台 sdk,详情可查看 接口加签方式说明
避免公私钥混用:不同签名算法的签名密钥是隔离的。由于同时提供了两套签名算法,若选择了特定的签名算法,请保证使用对应的私钥签名,同时使用对应的支付宝公钥进行验签。
自行实现签名
如果未使用支付宝开放平台 sdk,开发者需要自行实现签名过程。
签名过程:生成签名方(通常为商家)首先将所有参数和值放入一个map 中,并按照 key 值升序排列(调用collections.sort 方法)。然后将所有参数拼接起来,去掉 key 或 value 为空的参数,并用 & 连接,组成签名原文。最后使用 rsa 的私钥对签名原文进行签名。若接口中需携带图片/视频等文件上传请求,文件流不参与签名,请自行将文件转换成文件流形式,且以文件流格式请求。
文中代码部分以 java 语言调用 alipay.trade.pay(统一收单交易支付接口)为例,介绍如何使用公钥、证书两种方式自行实现签名及如何发起请求。 其它语言请查看各自 sdk。
第一步:筛选并排序
获取所有请求参数(包括公共请求参数),不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数,并按照第一个字符的键值 ascii 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ascii 码递增排序,以此类推。
第二步:拼接
将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。
公钥和公钥证书两种方式的请求参数有所区别,下面分别介绍两种方式的请求示例。
公钥方式
待签名字符串。
证书方式
注意:
公钥证书方式下,开发者发送给开放平台网关请求参数中,需携带 应用公钥证书 sn(app_cert_sn)、支付宝根证书 sn(alipay_root_cert_sn),若不携带这两个参数,网关会拒绝请求(详情可查看 常见问题 )。
sn 值是通过解析 x.509 证书文件中签发机构名称(name)以及内置序列号(serialnumber),将二者拼接后的字符串计算 md5 值获取,可参考开放平台 sdk 源码: alipaysignature.getcertsn 实现 app_cert_sn 的提取:
antcertificationutil.getrootcertsn 实现 alipay_root_cert_sn 的提取:
待签名字符串。
第三步:调用签名函数
使用各自语言对应的 sha256withrsa(对应 sign_type 为 rsa2)或 sha1withrsa(对应 sign_type 为 rsa)签名函数利用商家私钥对签名字符串进行签名,并进行 base64 编码。把生成的签名 encode 后赋值给 sign 参数,拼接到请求参数中。
示例代码
可查看 支付宝开放平台 sdk 源码中 alipaysignature.rsasign 方法。
第四步:拼接完整请求
1. 拼接原始数据
以公钥模式为例,完成 第三步:调用签名函数 后需将生成的签名作为 signvalue 拼接到请求数据中。
app_id=2014072300xxxxxx&biz_content={"out_trade_no":"2022xxxx","total_amount":88.88,"subject":"iphone6 16g","scene":"bar_code","auth_code":"287634438256xxxxx"}&charset=utf-8&method=alipay.trade.pay&sign_type=rsa2×tamp=2014-07-24 03:07:50&version=1.0&sign=ght5q6yxbtvf4q855tinwef/dielmyee97 onjdhpe6jonfr9f3bae37dczcogu7ulfpno dh3cgly05bqn5ntj9tj3srbzwa40cltlgki 6 0fujofsa225 mcrd4fnnqi2zd5adi9qc9ndn8nbvsjvzqtn5nepot8dg1qdv7kvvwg74emfea1j2jumbvbmp2pgiewcv5c8ojsxa2p66 l3ycqeemjbn22dz0chlj4hkmw3ra2oish6ryzivniiy4/djkedmxfeborp1vrbmatbqe afggzzgt5w4arkbq4fwlxjwkc9 1y4ircgmx65ceb5ct frgg2/9/b0ryg==
2. encode 请求数据
将所有一级 key 的 value 值进行 encode 操作。
说明:将接口业务参数 bizcontent 的 value 值作为一个整体进行 encode 操作。
app_id=2014072300xxxxxx&biz_content={"out_trade_no":"2022xxxx","total_amount":88.88,"subject":"iphone6 16g","scene":"bar_code","auth_code":"287634438256xxxxx"}&charset=utf-8&method=alipay.trade.pay&sign_type=rsa2×tamp=2014-07-24 03:07:50&version=1.0&sign=ght5q6yxbtvf4q855tinwef/dielmyee97+onjdhpe6jonfr9f3bae37dczcogu7ulfpno+dh3cgly05bqn5ntj9tj3srbzwa40cltlgki+6+0fujofsa225+mcrd4fnnqi2zd5adi9qc9ndn8nbvsjvzqtn5nepot8dg1qdv7kvvwg74emfea1j2jumbvbmp2pgiewcv5c8ojsxa2p66+l3ycqeemjbn22dz0chlj4hkmw3ra2oish6ryzivniiy4/djkedmxfeborp1vrbmatbqe++afggzzgt5w4arkbq4fwlxjwkc9+1y4ircgmx65ceb5ct+frgg2/9/b0ryg==
3. 拼接请求
将编码后的请求数据发送至支付宝网关地址。
说明:支付宝网关地址固定为 https://openapi.alipay.com/gateway.do
post 请求格式
get 请求格式
内容没有解决您的问题?您还可以前往 或 寻求帮助
凯发k8官方网娱乐官方 copyright © 支付宝(杭州)信息技术有限公司  | icp证浙b2-20160559
该文档对你是否有帮助?
当前页面目录
网站地图