RSA秘钥对在上一章节有具体生成步骤,可供参考。
商户算法签名模型设置为RSA时,采用本文档签名算法。
1、商户请求支付时,以商户自行生成的私钥进行RSAWithSign签名操作,平台将用商户生成的公钥进行验证签名。具体请参考SDK。
请求支付RSA签名算法街口支付
- Java:
- sign = RSAWithSign.signByPrivateKey(请求支付网关原始签名串,商户生成的私钥)
- PHP:
- $privatekey = openssl_get_privatekey('商户生成的私钥');
- openssl_sign(请求支付网关原始签名串,$sign_info,$privatekey,OPENSSL_ALGO_MD5);
- $sign = base64_encode($sign_info);
2、商户接收异步通知sign签名,以平台自带的公钥进行验证签名,具体请参考SDK。
异步接收通知RSA验证签名算法街口支付
- Java:
- true or false = RSAWithSign.validateSignByPublicKey(异步通知接收原始签名串, 平台自带的公钥, sign参数值)
- PHP:
- $publickey = openssl_get_publickey('平台自带的公钥');
- true or false = openssl_verify(异步通知接收原始签名串,$sign,$publickey,OPENSSL_ALGO_MD5);
举个例子:
请求支付参数列表街口支付
- service_type="connect_service"
- merchant_code="100000"
- interface_version="V1.0"
- sign_type="MD5"
- order_no="2233456788"
- order_time="2016-01-01 12:00:00"
- order_amount="100"
- product_number="1"
- notify_url="http://www.xxx.com/notify_url"
- return_url="http://www.xxx.com/return_url"
- bank_code="WEBCHAT"
- product_name="proname"
- order_userid="userid"
- order_info="additional"
- notice_type="0"
- sign="cdaTQyJ0aQ+MYgd33AgtkbC7p/e7ScaGhK+GDh6tsn+GNr4vPChvfJvIa70L51LO6904qYIvdImwQLsAnDDASphfKsPIjkeckq74DHz7DrMLuAjFFlL4uaIKCeZY/r3DQT3ASIgG3UFnDU2dMJr9SbVNmLRm//XWdEtpUozDixk="
第一步:根据请求支付原始签名字符串规定格式把对应参数值进行拼接,如下:
拼接字符串结果街口支付
- 100000~|~V1.0~|~MD5~|~2233456788~|~2016-01-01 12:00:00~|~100~|~1
- ~|~http://www.xxx.com/notify_url~|~http://www.xxx.com/return_url~|~WEBCHAT
- ~|~0~|~connect_service
第二步:根据商户自行生成的私钥进行生成sign签名,如下:
签名Sign结果街口支付
- sign = RSAWithSign.signByPrivateKey(第一步拼接字符串 ,"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJx9ronbllg1+h+JaEGYCdrhKsxFfPjuRjzP3OhOtlcf5T6VBsZS9F2JhNiHiccsHMStvOEX7UbLUOWkNviW4uHR5ee9Vg+48AbDBB/d142+9sShNeN4feDqWYDH10DExH/KxcYp1MEytjiq+NO4SwlJl64eu6/ONgNOOL27Ynf9AgMBAAECgYEAlC0xYlmpHzdk8g2iyVFUK4u/gZJehjrgCN7tlo5Je2+5GqvzsUCFIDiBsKGOJSiwyM6VpTGJu9nybK80WehNRPfYpLI4dTYZc6M94dpQk59yo8OpztRJp/lsLs2rLsY7pmOFm4p4X+rg8exn776Z/rEvlUgfrgMFJRHf8ACOJ+UCQQDYG7j8QKq4ILqUhFX6FpdDxP1DFcUnBr5OsYaLRSG8T6buyu6GqWQgzx6IH4y+wVWj+4urEO8kRJnsPuqhZBxfAkEAuWC4KJjHEsby7BY3QKJ/SFkgLnu5c9T0DYlTNYl+RQko8cdBGRwqAUlLhxu2LRPG2YsHYu9FNYySF4EuxxTJIwJAHP+LUP30aoSpxKgFSWuinItgWJIhRF1ZSAH2RdXe8v/VLJG6dANi1iw0sptZLXeP4FMuqKO7EyjJZrQCk+l1DQJBAJL4mqkdD1/Uuc3xgxbMfmtmtfwEfbDXGjMNOBpPCvxC2eJuni8BRFBGwwm4L8QnVNUuw8lteAqPi1f1RJfz488CQGb0TzKs2QOia6YTye74bIK7Vp4A8PqMoR46CaMnjbt2lYHWx12z5Y+VuDleNgoaA/Xg6qKKcGOnTUlQW85yIiQ=")
- sign = "cdaTQyJ0aQ+MYgd33AgtkbC7p/e7ScaGhK+GDh6tsn+GNr4vPChvfJvIa70L51LO6904qYIvdImwQLsAnDDASphfKsPIjkeckq74DHz7DrMLuAjFFlL4uaIKCeZY/r3DQT3ASIgG3UFnDU2dMJr9SbVNmLRm//XWdEtpUozDixk="