最近做了一个招商银行支付对接,要求使用SHA1WithRSA算法校验, “ 成功签约结果通知 ” 和 “ 成功支付结果通知 ” 接收到的通知报文进行验签。招商银行给出的文档如下
此文档写的有问题,导致PHP无法成功的校验签名真伪。问题如下
1.noticeData不能转为小写,转了必挂
2.在解密前必须给签名base64_decode一下
3.获取招商银行公钥必须手动加上标准证书头 begin end
找到这些问题,SHA1WithRSA就迎刃而解了,用到的PHP函数只有一个 openssl_verify 核心代码如下:
$pub_key_id = '-----BEGIN PUBLIC KEY-----'.PHP_EOL.$publicKey.PHP_EOL.'-----END PUBLIC KEY-----'; $bool = openssl_verify($data, base64_decode($signature) ,$pub_key_id,OPENSSL_ALGO_SHA1); //如果签名正确返回 1, 签名错误返回 0, 内部发生错误则返回false 我的环境是php5.6