|
楼主 |
发表于 2011-4-25 23:15:50
|
显示全部楼层
回复 liren
只要你理解到位了是不会出错的,你发的代码太少,不知道你哪出问题了 ...
jeongee 发表于 2011-4-25 23:12
我调试之后发现因为 sign和mysign不一致,造成verify_result返回了false,但是目前还不知道为什么sign和mysign不一致
就是下面这个方法:
PHP复制代码 /********************************************************************************/
/**对return_url的认证
*return 验证结果:true/false
*/
function return_verify () {
log_message ("debug","get transport:".$this->transport);
log_message ("debug","get gateway:".$this->gateway);
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
if($this->transport == "https") {
$veryfy_url = $this->gateway. "service=notify_verify" ."&partner=" .$this->partner. "¬ify_id=".$_GET["notify_id"];
} else {
$veryfy_url = $this->gateway. "partner=".$this->partner."¬ify_id=".$_GET["notify_id"];
}
log_message ("debug","get veryfy_url:".$veryfy_url);
$veryfy_result = $this->get_verify($veryfy_url);
log_message ("debug","get veryfy_result:".$veryfy_result);
log_message ("debug","get empty_GET:".$_GET);
//生成签名结果
if(empty($_GET)) { //判断GET来的数组是否为空
return false;
}
else {
$get = para_filter ($_GET); //对所有GET反馈回来的数据去空
$sort_get = arg_sort ($get); //对所有GET反馈回来的数据排序
$this->mysign = build_mysign ($sort_get,$this->_key ,$this->sign_type); //生成签名结果
log_message ("debug","get this->mysign:".$this->mysign);
log_message ("debug","get this->mysign:".$_GET["sign"]);
//写日志记录
//log_result("veryfy_result=".$veryfy_result."\n return_url_log:sign=".$_GET["sign"]."&mysign=".$this->mysign."&".create_linkstring($sort_get));
//判断veryfy_result是否为ture,生成的签名结果mysign与获得的签名结果sign是否一致
//$veryfy_result的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//mysign与sign不等,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (preg_match("/true$/i",$veryfy_result) && $this->mysign == $_GET["sign"]) {
return true;
}else {
return false;
}
}
} 复制代码 |
|