PHP支付宝异步回调数据签名验证密钥算法 PHP支付回调验证签名


第一种方法:

支付宝官方提供的SDK入口文件为根目录的 AopSdk.php 通过引用AopSdk.php,可以初始化aop目录下的Aopclient文件,达到可以调用SDK内置验签方法。这个方法需要引入SDK,有点麻烦。

require_once '../AopSdk.php';  //引入SDK
$alipay = new AopClient();  //初始化
$alipay->alipayrsaPublicKey = 'xxxxx';  //初始化支付宝私钥

//传入支付宝发来的POST参数,私钥路径(因为上边我们通过字符串形式已经初始化私钥了,这里就填null,如果是私钥文件,这里填写对应的文件路径),加密方式(一般都是RSA2,看你在调用支付的时候用的是RSA还是RSA2)
$result = $alipay->rsaCheckV1($_POST,null,'RSA2');
if($result) {
	//验签成功
}
//$result返回的是bool类型

第二种方法:

一个函数搞定,验签成功会返回结果回来,不然就是没结果。

/**
 * 支付宝当面付异步回调数据验签
 * @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;
    }
}