您的位置:首页 > 移动开发

支付宝pc即时支付兼容app移动支付异步回调函数验证

2016-02-22 17:27 393 查看
1、即时支付原文件 alipay_notify.class.php
/**
* 获取返回时的签名验证结果
* @param $para_temp 通知返回来的参数数组
* @param $sign 返回的签名结果
* @return 签名验证结果
*/
function getSignVeryfy($para_temp, $sign) {
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);

//对待签名参数数组排序
$para_sort = argSort($para_filter);

//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);

$isSgin = false;
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
default :
$isSgin = false;
}

return $isSgin;
}

2、修改过后

/**
* 获取返回时的签名验证结果
* @param $para_temp 通知返回来的参数数组
* @param $sign 返回的签名结果
* @return 签名验证结果
*/
function getSignVeryfy($para_temp, $sign) {
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);

//对待签名参数数组排序
$para_sort = argSort($para_filter);

//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);

$isSgin = false;
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}

return $isSgin;
}


3、在alipay_md5.function.php中增加rsa签名验证

/**
* rsa验证签名
* @param $prestr 需要签名的字符串
* @param $sign 签名结果
* return 签名结果
*/
function rsaVerify($prestr, $sign)
{
$sign = str_replace(' ','+',$sign);
$sign = base64_decode($sign);
$public_key = file_get_contents(\Yii::getAlias('@vendorUser').'/alipay/alipay_public_key.pem');
$pkeyid = openssl_get_publickey($public_key);
if ($pkeyid) {
$verify = openssl_verify($prestr, $sign, $pkeyid);
openssl_free_key($pkeyid);
}
if ($verify == 1) {
return true;
} else {
return false;
}
}

我是用yii2.0把支付宝嵌入的

yii2.0的异步回调地址要注意

一般yii的路由是index.php?r=xxx

这种格式r=xxx会被支付宝认为是参数而不是路由,所以它访问的时候是不带[b]r=xxx,而是放在post参数里面[/b]

所以要解决这种问题需要自己重写路由规则

一般yii的路由是[b]index.php/xxx/这种格式[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: