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;
}
}