php issign为false,支付宝接口集成及错误排除
我集成了支付寶接口,可以支付成功,可是notify_url.php中始終好像沒(méi)有回調(diào),所以按照官方文檔,我作了以下修改php
$verify_result?=?$alipayNotify->verifyNotify();
if($verify_result)?{
//商戶訂單號(hào)
$order_id?=?$_POST['out_trade_no'];
//支付寶交易號(hào)
$trade_no?=?$_POST['trade_no'];
//交易狀態(tài)
$trade_status?=?$_POST['trade_status'];
//訂單總金額
$total_fee?=?floatval($_POST['total_fee']);
//訂單支付時(shí)間
$pay_time?=?$_POST['gmt_payment'];
//定制的錯(cuò)誤機(jī)制
$user_debug=1;
//退款狀態(tài)
$refund_status?=?$_POST['refund_status'];
logResult('記錄付款后支付寶返回的相關(guān)信息[訂單編號(hào)]:'.$order_id.'[金額]:'.$total_fee.'[時(shí)間]:'.$pay_time.'[狀態(tài)]:'.$_POST['trade_status']);
if?($_POST['trade_status']?==?'TRADE_SUCCESS'?||?$_POST['trade_status']?==?'TRADE_FINISHED')?{
}
}
else{
//驗(yàn)證失敗
logResult('驗(yàn)證失敗');
echo?"fail";
}
其實(shí)就是用支付寶接口內(nèi)部方法logResult方法記錄了回調(diào)的狀況,看看是否回調(diào)該文件而且看回調(diào)到了哪一步數(shù)組
再支付一次我發(fā)現(xiàn)log.txt文件中多了“驗(yàn)證失敗”,所以我就判斷是$alipayNotify->verifyNotify();這個(gè)沒(méi)有返回正確的值安全
打開(kāi)alipay_notify.class.php文件,找到verifyNotify方法,發(fā)現(xiàn)官方注釋了一段語(yǔ)句服務(wù)器
function?verifyNotify(){
if(empty($_POST))?{//判斷POST來(lái)的數(shù)組是否為空
return?false;
}
else?{
//生成簽名結(jié)果
$isSign?=?$this->getSignVeryfy($_POST,?$_POST["sign"]);
//獲取支付寶遠(yuǎn)程服務(wù)器ATN結(jié)果(驗(yàn)證是不是支付寶發(fā)來(lái)的消息)
$responseTxt?=?'true';
if?(!?empty($_POST["notify_id"]))?{$responseTxt?=?$this->getResponse($_POST["notify_id"]);}
//寫日志記錄
//if?($isSign)?{
//$isSignStr?=?'true';
//}
//else?{
//$isSignStr?=?'false';
//}
//$log_text?=?"responseTxt=".$responseTxt."\n?notify_url_log:isSign=".$isSignStr.",";
//$log_text?=?$log_text.createLinkString($_POST);
//logResult($log_text);
//驗(yàn)證
//$responsetTxt的結(jié)果不是true,與服務(wù)器設(shè)置問(wèn)題、合做身份者ID、notify_id一分鐘失效有關(guān)
//isSign的結(jié)果不是true,與安全校驗(yàn)碼、請(qǐng)求時(shí)的參數(shù)格式(如:帶自定義參數(shù)等)、編碼格式有關(guān)
if?(preg_match("/true$/i",$responseTxt)?&&?$isSign)?{
return?true;
}?else?{
return?false;
}
}
}
將如上代碼的注釋取消,再一次支付,再看log.txt發(fā)現(xiàn)寫入了以下代碼curl
執(zhí)行日期:20140306121304
responseTxt=
notify_url_log:isSign=true,discount=0.00&payment_type=1&subject=訂單主題&trade_no=2014030615255398&buyer_email=287139270@qq.com&gmt_create=2014-03-06 12:12:55¬ify_type=trade_status_sync&quantity=1&out_trade_no=1394079155627&seller_id=2088211562160923¬ify_time=2014-03-06 12:13:03&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=0.10&gmt_payment=2014-03-06 12:13:03&seller_email=aaaaaa@126.com&price=0.10&buyer_id=2088702034696988¬ify_id=ec0149b551db7c645e3e66a3058d3b067g&use_coupon=N&sign_type=MD5&sign=5a46cb0b739f659089330a28293e042e函數(shù)
因而咱們能夠發(fā)現(xiàn)isSign是經(jīng)過(guò)了,那就是$this->getResponse($_POST["notify_id"]這個(gè)方法錯(cuò)誤了post
function?getResponse($notify_id)?{
$transport?=?strtolower(trim($this->alipay_config['transport']));
$partner?=?trim($this->alipay_config['partner']);
$veryfy_url?=?'';
if($transport?==?'https')?{
$veryfy_url?=?$this->https_verify_url;
}
else?{
$veryfy_url?=?$this->http_verify_url;
}
$veryfy_url?=?$veryfy_url."partner="?.?$partner?.?"?ify_id="?.?$notify_id;
$responseTxt?=?getHttpResponseGET($veryfy_url,?$this->alipay_config['cacert']);
return?$responseTxt;
}
能夠看出,該函數(shù)就是與支付寶進(jìn)行通訊,而且這一次用到了支付寶的證書(shū),我起初懷疑是證書(shū)的問(wèn)題,其實(shí)全部的證書(shū)都是同樣的,不會(huì)根據(jù)商戶不一樣證書(shū)不一樣,不過(guò)也有多是證書(shū)路徑的問(wèn)題$alipay_config['cacert']??? = getcwd().'\\cacert.pem';有人也說(shuō)改為$alipay_config['cacert']??? = getcwd().'/cacert.pem';不過(guò)我沒(méi)遇到這個(gè)問(wèn)題this
固然最后要看alipay_core.function.php中的getHttpResponseGET方法了編碼
function?getHttpResponseGET($url,$cacert_url)?{
$curl?=?curl_init($url);
curl_setopt($curl,?CURLOPT_HEADER,?0?);?//?過(guò)濾HTTP頭
curl_setopt($curl,CURLOPT_RETURNTRANSFER,?1);//?顯示輸出結(jié)果
curl_setopt($curl,?CURLOPT_SSL_VERIFYPEER,?true);//SSL證書(shū)認(rèn)證
curl_setopt($curl,?CURLOPT_SSL_VERIFYHOST,?2);//嚴(yán)格認(rèn)證
curl_setopt($curl,?CURLOPT_CAINFO,$cacert_url);//證書(shū)地址
$responseText?=?curl_exec($curl);
//var_dump(?curl_error($curl)?);//若是執(zhí)行curl過(guò)程當(dāng)中出現(xiàn)異常,可打開(kāi)此開(kāi)關(guān),以便查看異常內(nèi)容
curl_close($curl);
return?$responseText;
}
發(fā)現(xiàn)就是個(gè)curl_exec方法,因而就天然而然的懷疑是curl_exec方法被禁用了,打開(kāi)phpinfo一看,果真是curl_exec被禁用了url
從中咱們能夠發(fā)現(xiàn)支付寶工做的原理,其實(shí)也沒(méi)有多復(fù)雜,支付成功后他會(huì)往notify_url post數(shù)據(jù)過(guò)來(lái),系統(tǒng)會(huì)根據(jù)本地的證書(shū),curl校驗(yàn)
總結(jié)
以上是生活随笔為你收集整理的php issign为false,支付宝接口集成及错误排除的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 录屏软件 按键,linux下
- 下一篇: 山洪沟防洪治理工程技术规范_幸福沟水库一