【原创】PHP支付宝异步回调数据签名验证算法

作者Veris 文章分类 分类:PHP 文章评论 0条评论 阅读次数 已被围观 2234

小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

最族 [ http://www.mostclan.com ]


发表评论: