小V今天在做支付宝回调验签时碰到了不少问题:
1、openssl_get_publickey函数返回false(这里必须传支付宝的应用公钥,且格式正确,格式见后文代码)。
2、openssl_verify函数返回false,这里需要清除你的秘钥类型是什么(RSA/RSA2)。
贴函数代码:
/**
* 支付宝当面付异步回调数据验签
* @param array $params 待验证数据
* @param string $alipay_public_key 支付宝应用公钥
* @param string $sign_type 秘钥类型
* @return boolean 验签状态
*/
function verify_sign($params,$alipay_public_key,$sign_type='RSA2')
{
$ori_sign=$params['sign'];
unset($params['sign']);
unset($params['sign_type']);
ksort($params);
$data='';
foreach($params as $k => $v){
$data.=$k.'='.$v.'&';
}
$data=substr($data,0,-1);
$public_content="-----BEGIN PUBLIC KEY-----\n" . wordwrap($alipay_public_key, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
$public_key=openssl_get_publickey($public_content);
if($public_key){
if($sign_type=='RSA2') {
$result = (bool)openssl_verify($data, base64_decode($ori_sign), $public_key, OPENSSL_ALGO_SHA256);
} else {
$result = (bool)openssl_verify($data, base64_decode($ori_sign), $public_key);
}
openssl_free_key($public_key);
return $result;
}else{
return false;
}
}
=================================================
转载请注明出处:
作者:Veris