自行实现签名

如果未使用支付宝开放平台SDK,需要自行实现签名过程,本文档将向您介绍在使用普通公钥、公钥证书两种方式如何自行实现签名。

如何签名

1.筛选并排序

获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

2.拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。

普通公钥和公钥证书两种方式的请求参数有所区别,下面分别介绍两种方式的请求示例:

1)普通公钥方式

下面的请求示例,参数值都是示例,开发者参考格式即可:

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
app_id=2014072300007148
method=alipay.mobile.public.menu.add
charset=GBK
sign_type=RSA2
timestamp=2014-07-24 03:07:50
biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}
sign=e9zEAe4TTQ4LPLQvETPoLGXTiURcxiAKfMVQ6Hrrsx2hmyIEGvSfAQzbLxHrhyZ48wOJXTsD4FPnt+YGdK57+fP1BCbf9rIVycfjhYCqlFhbTu9pFnZgT55W+xbAFb9y7vL0MyAxwXUXvZtQVqEwW7pURtKilbcBTEW7TAxzgro=
version=1.0

则待签名字符串为:

app_id=2014072300007148&biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}&charset=GBK&method=alipay.mobile.public.menu.add&sign_type=RSA2&timestamp=2014-07-24 03:07:50&version=1.0

2)公钥证书方式

下面的请求示例,参数值都是示例,开发者参考格式即可:

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
app_id=2014072300007148
method=alipay.mobile.public.menu.add
charset=GBK
sign_type=RSA2
app_cert_sn=50fa7bc5dc305a4fbdbe166689ddc827
alipay_root_cert_sn=6bc29aa3b4d406c43483ffea81e08d22
timestamp=2014-07-24 03:07:50
biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}
sign=e9zEAe4TTQ4LPLQvETPoLGXTiURcxiAKfMVQ6Hrrsx2hmyIEGvSfAQzbLxHrhyZ48wOJXTsD4FPnt+YGdK57+fP1BCbf9rIVycfjhYCqlFhbTu9pFnZgT55W+xbAFb9y7vL0MyAxwXUXvZtQVqEwW7pURtKilbcBTEW7TAxzgro=
version=1.0

说明: 公钥证书方式下,开发者发送给开放平台网关请求参数中,需携带应用公钥证书SN(app_cert_sn)、支付宝根证书SN(alipay_root_cert_sn),若不携带这两个参数,网关会拒绝请求。SN值是通过解析X.509证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算MD5值获取,可参考开放平台SDK源码中AlipaySignature.getCertSN实现app_cert_sn的提取:

/**
  * 获取证书序列号
  * @param certPath X.509证书文件路径
  * @return 返回证书序列号
  * @throws AlipayApiException
  */
public static String getCertSN(String certPath)

AntCertificationUtil.getRootCertSN实现alipay_root_cert_sn的提取:

 /**
  * 获取根证书序列号
  * @param rootCertContent
  * @return
  */
public static String getRootCertSN(String rootCertContent)

则待签名字符串为:

alipay_root_cert_sn=6bc29aa3b4d406c43483ffea81e08d22&app_cert_sn=50fa7bc5dc305a4fbdbe166689ddc827&app_id=2014072300007148&biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}&charset=GBK&method=alipay.mobile.public.menu.add&sign_type=RSA2&timestamp=2014-07-24 03:07:50&version=1.0

3.调用签名函数

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

4.把生成的签名赋值给sign参数,拼接到请求参数中。

可以参考开放平台SDK源码中AlipaySignature.rsaSign方法。

/**
@param content 加签内容
@param privateKey 加签私钥
@param charset 加签字符集
@param charset 签名方法
**/
String AlipaySignature.rsaSign(String content, String privateKey, String charset,String signType)

工具演示签名过程:

支付宝签名验签工具可以一键生成密钥,并提供签名,验签等功能,此处演示签名过程。

1.打开签名工具,切换到“签名”页 ,界面显示如下:

undefined

2.输入“私钥”和“请求参数”,并选择对应“字符集”及“签名方式”,点击“开始签名”。

“请求参数”内容为请求支付宝开放平台的post内容,参数用&字符串连接,需要包含sign_type参数,且值与签名方式一致。参考输入框中样例。

签名后内容如下,其中待签名内容是经过格式处理后,最终要签名的内容:
undefined

3.点击“查看签名生成步骤”,可以查看详细处理流程。
undefined

onlineServer