本文调研了微信、支付宝的接口要求验证办法,希望对大家对接微信、支付宝的数据署名验证有一些帮助。
微信支付署名验签一、必须步骤
设置Key密钥,须要商户自行到微信后台中设置。根据邮件内容下载证书。
二、署名天生算法
将所有非空参数按照参数名ASCII码从小到大进行排序,包含随机参数:nonce_str,并以&字符进行组合成字符串stringA,即stringA=key1=value1&key2=value2…;将key数据附加到stringA字符串之后,以&字符进行连接,得到字符串tempString,即tempString=stringA+&key=;对tempString利用md5算法获取hash值,并将hash值全部转化为大写,得到sign;在进行接口要求时必须带上参数:nonce_str、sign。
三、证书办法
微信中,在进行退款、撤销等环境下利用的是证书办法。证书会在注册商户时,微信官方也邮件办法奉告到商户去下载证书。
四、其他干系
支付宝署名验签
一、必要步骤
利用工具天生RSA密钥,可利用支付宝供应的工具天生公钥、私钥,并保存,建议利用2048位。将公钥上传至阿里云开放平台中。
二、署名天生算法
将所有非空参数按照ASCII码从小到大进行排序,须要剔除掉字节类型参数,如文件、字节流等,亦不包含sign字段;将所有待署名参数,组合成“key=value”格式,并利用&字符拼接起来,得到字符串stringA;利用措辞函数SHA256WithRSA(对应sign_type为RSA2)或者SHA1WithRSA(对应sign_type为RSA)署名函数利用商户私钥对待署名字符串(stringA)进行署名,并进行Base64编码;将天生的署名赋值给参数:sign,拼接到要求参数中。PHP中署名函数的须要利用的openSSL扩展。利用openssl_sign函数进行署名天生。字符集利用UTF-8。
三、验签过程
同步返回验签从返回数据中获取接口返回参数,如支付宝返回的json中xxx_response的值做验签(xxx代表接口名);从上述数据中获取两部分数据:sign、其他数据的json字符串,sign须要进行Base64解码;利用措辞SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)署名验证函数,传入待验具名段、支付宝公钥、署名内容(sign),验签方法(signType)进行验签,根据返回结果剖断是否验签通过。异步返回验签吸收所有返回参数,撤除sign、sign_type两个参数外,凡是关照返回回来的参数皆是待验签的参数。生活号异步关照组成的待验签串里须要保留sign_type参数。将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待署名字符串(参考天生署名时算法);将署名参数(sign)利用base64解码为字节码串;利用RSA的验签方法,通过署名字符串、署名参数(经由base64解码)及支付宝公钥验证署名,根据返回结果剖断是否验签通过。PHP中验签函数须要利用openssl扩展。利用函数openssl_verify函数进行署名验证,署名精确。此函数返回1,署名缺点返回0,其他缺点返回-1
四、其他干系
五、AES加密
支付宝开放平台所有OpenAPI均支持对接口的要求内容和相应内容进行AES加密。加密后,在网络上传输的接口报文内容将会由明文内容变为密文内容,可以大大提升接口内容传输的安全性。
AES密钥与RSA密钥的关系
开拓者可对要求参数先做AES加密,然后对密文进行RSA署名如果开启了支付宝AES加密,开拓者须要对返回报文进行先验签,再解密
要求报文加密
其它措辞基本的加密逻辑一样,须要把稳的是对加密后得到字节数组须要先做base64编码,然后再新建字符串 (由于base64后的字节一定是ASCII范围内,以是末了一步new String的时候无需指定字符集)
相应报文解密XML格式若存在xml根节点的第一个子节点为response_encrypted,后面紧随着sign节点,则该报文为加密的报文,密文存放在response_encrypted中
JSON格式
识别该结果是密文的办法是response后的结果是字符串(双引号开头)而不是json工具(大括号开头),密文为引号内的内容
参考文档:
[微信接口规则](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_1)
[支付宝天生密钥工具](https://docs.open.alipay.com/291/105971/)
[支付宝署名天生算法先容](https://docs.open.alipay.com/291/106118)
[支付宝署名验证算法先容](https://docs.open.alipay.com/200/106120)
[支付宝AES加密官方先容](https://docs.open.alipay.com/common/104567)