支付宝接口集成及错误排除

我集成了支付宝接口,能够支付成功,但是notify_url.php中始终好像没有回调,因此按照官方文档,我做了如下修改

  1. $verify_result = $alipayNotify->verifyNotify();  
  2. if($verify_result) {  
  3.     //商户订单号  
  4.     $order_id = $_POST['out_trade_no'];  
  5.     //支付宝交易号  
  6.     $trade_no = $_POST['trade_no'];  
  7.     //交易状态  
  8.     $trade_status = $_POST['trade_status'];  
  9.     //订单总金额  
  10.     $total_fee = floatval($_POST['total_fee']);  
  11.     //订单支付时间  
  12.     $pay_time = $_POST['gmt_payment'];  
  13.     //定制的错误机制  
  14.     $user_debug=1;  
  15.     //退款状态  
  16.     $refund_status = $_POST['refund_status'];  
  17.     logResult('记录付款后支付宝返回的相关信息[订单编号]:'.$order_id.'[金额]:'.$total_fee.'[时间]:'.$pay_time.'[状态]:'.$_POST['trade_status']);  
  18.     if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') {  
  19.     }  
  20. }  
  21. else{  
  22.     //验证失败  
  23.     logResult('验证失败');  
  24.     echo "fail";  
  25. }  
其实就是用支付宝接口内部方法logResult方法记录了回调的情况,看看是否回调该文件并且看回调到了哪一步

再支付一次我发现log.txt文件中多了“验证失败”,因此我就判断是$alipayNotify->verifyNotify();这个没有返回正确的值

打开alipay_notify.class.php文件,找到verifyNotify方法,发现官方注释了一段语句

  1. function verifyNotify(){  
  2.         if(empty($_POST)) {//判断POST来的数组是否为空  
  3.             return false;  
  4.         }  
  5.         else {  
  6.             //生成签名结果  
  7.             $isSign = $this->getSignVeryfy($_POST$_POST["sign"]);  
  8.             //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)  
  9.             $responseTxt = 'true';  
  10.             if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}  
  11.               
  12.             //写日志记录  
  13.             //if ($isSign) {  
  14.             //  $isSignStr = 'true';  
  15.             //}  
  16.             //else {  
  17.             //  $isSignStr = 'false';  
  18.             //}  
  19.             //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";  
  20.             //$log_text = $log_text.createLinkString($_POST);  
  21.             //logResult($log_text);  
  22.               
  23.             //验证  
  24.             //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关  
  25.             //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关  
  26.             if (preg_match("/true$/i",$responseTxt) && $isSign) {  
  27.                 return true;  
  28.             } else {  
  29.                 return false;  
  30.             }  
  31.         }  
  32.     }  

将如上代码的注释取消,再一次支付,再看log.txt发现写入了如下代码

执行日期: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&notify_type=trade_status_sync&quantity=1&out_trade_no=1394079155627&seller_id=2088211562160923&notify_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&notify_id=ec0149b551db7c645e3e66a3058d3b067g&use_coupon=N&sign_type=MD5&sign=5a46cb0b739f659089330a28293e042e

于是我们可以发现isSign是通过了,那就是$this->getResponse($_POST["notify_id"]这个方法错误了

  1. function getResponse($notify_id) {  
  2.         $transport = strtolower(trim($this->alipay_config['transport']));  
  3.         $partner = trim($this->alipay_config['partner']);  
  4.         $veryfy_url = '';  
  5.         if($transport == 'https') {  
  6.             $veryfy_url = $this->https_verify_url;  
  7.         }  
  8.         else {  
  9.             $veryfy_url = $this->http_verify_url;  
  10.         }  
  11.         $veryfy_url = $veryfy_url."partner=" . $partner . "¬ify_id=" . $notify_id;  
  12.         $responseTxt = getHttpResponseGET($veryfy_url$this->alipay_config['cacert']);  
  13.           
  14.         return $responseTxt;  
  15.     }  

可以看出,该函数就是与支付宝进行通信,并且这一次用到了支付宝的证书,我起初怀疑是证书的问题,其实所有的证书都是一样的,不会根据商户不同证书不同,不过也有可能是证书路径的问题$alipay_config['cacert']    = getcwd().'\\cacert.pem';有人也说改成$alipay_config['cacert']    = getcwd().'/cacert.pem';不过我没遇到这个问题

当然最后要看alipay_core.function.php中的getHttpResponseGET方法了

  1. function getHttpResponseGET($url,$cacert_url) {  
  2.     $curl = curl_init($url);  
  3.     curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头  
  4.     curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果  
  5.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证  
  6.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证  
  7.     curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址  
  8.     $responseText = curl_exec($curl);  
  9.     //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容  
  10.     curl_close($curl);  
  11.       
  12.     return $responseText;  
  13. }  

发现就是个curl_exec方法,于是就自然而然的怀疑是curl_exec方法被禁用了,打开phpinfo一看,果然是curl_exec被禁用了从中我们可以发现支付宝工作的原理,其实也没有多复杂,支付成功后他会往notify_url post数据过来,系统会根据本地的证书,curl校验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值