文档中心 > 当面付

签名与验签

更新时间:2016/05/24 访问次数:15859

请求参数签名

1. 筛选
获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段。

2. 排序
将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

3. 拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。SDK中已封装签名方法,开发者可直接调用,详见SDK说明。如自己开发,则需将待签名字符串和私钥放入SHA1 RSA算法中得出签名(sign)的值。
例如下面的请求示例,参数值都是示例,开发者参考格式即可:

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=RSA
 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=RSA&timestamp=2014-07-24 03:07:50&version=1.0

4. 调用签名函数
使用各自语言对应的SHA1WithRSA签名函数利用商户私钥对待签名字符串进行签名,并进行Base64编码。

返回参数验证签名

开发者只对支付宝返回的json中response的值做验签。Response的Json值内容需要包含首尾的“{”和“}”两个尖括号,双引号也需要参与验签,如果字符串中包含“http://”的正斜杠,需要先将正斜杠做转义,默认打印出来的字符串是已经做过转义的。建议验签不通过时将正斜杠转义一次后再做一次验签。

如当面付扫码支付获取二维码的返回内容为:

{"alipay_trade_precreate_response":{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"},"sign":"VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE="}

则待验签内容为:

{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"}

sign前面的那个逗号不参与验签。
获取sign值时,只需要sign节点的值(不含双引号)。

调用签名函数:使用各自语言对应的SHA1WithRSA签名验证函数,传入待验签字段、支付宝公钥、参数sign对应的值(该参数为支付宝返回)进行验签,根据返回结果判定是否验签通过。

FAQ

关于此文档暂时还没有FAQ
返回
顶部