Пример #1
0
 public function notify($request)
 {
     //		$url = "http://o2o.7dit.com/tenpay.php?";
     //		foreach($_REQUEST as $k=>$v)
     //		{
     //			$url.=$k."=".$v."&";
     //		}
     //		$str = file_get_contents(APP_ROOT_PATH."log.txt")."\n".print_r($_REQUEST,1)."\n".$url;
     //		@file_put_contents(APP_ROOT_PATH."log.txt", $str);
     require_once APP_ROOT_PATH . "system/payment/tenpayc2c/ResponseHandler.class.php";
     require_once APP_ROOT_PATH . "system/payment/tenpayc2c/RequestHandler.class.php";
     require_once APP_ROOT_PATH . "system/payment/tenpayc2c/TenpayHttpClient.class.php";
     require_once APP_ROOT_PATH . "system/payment/tenpayc2c/ClientResponseHandler.class.php";
     $return_res = array('info' => '', 'status' => false);
     $payment = $GLOBALS['db']->getRow("select id,config from " . DB_PREFIX . "payment where class_name='tenpayc2c'");
     $payment['config'] = unserialize($payment['config']);
     /* 创建支付应答对象 */
     $resHandler = new ResponseHandler();
     $resHandler->setKey($payment['config']['tencentpay_key']);
     //判断签名
     if ($resHandler->isTenpaySign()) {
         //通知id
         //		error_reporting(E_ALL);
         //		ini_set("display_errors",1);
         $notify_id = $resHandler->getParameter("notify_id");
         //通过通知ID查询,确保通知来至财付通
         //创建查询请求
         $queryReq = new RequestHandler();
         $queryReq->init();
         $queryReq->setKey($payment['config']['tencentpay_key']);
         $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
         $queryReq->setParameter("partner", $payment['config']['tencentpay_id']);
         $queryReq->setParameter("notify_id", $notify_id);
         //通信对象
         $httpClient = new TenpayHttpClient();
         $httpClient->setTimeOut(5);
         //设置请求内容
         $httpClient->setReqContent($queryReq->getRequestURL());
         //后台调用
         if ($httpClient->call()) {
             //设置结果参数
             $queryRes = new ClientResponseHandler();
             $queryRes->setContent($httpClient->getResContent());
             $queryRes->setKey($payment['config']['tencentpay_key']);
             if ($resHandler->getParameter("trade_mode") == "2") {
                 //判断签名及结果(中介担保)
                 //只有签名正确,retcode为0,trade_state为0才是支付成功
                 //				print_r($queryRes);
                 if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0") {
                     //取结果参数做业务处理
                     $out_trade_no = $resHandler->getParameter("out_trade_no");
                     //财付通订单号
                     $transaction_id = $resHandler->getParameter("transaction_id");
                     //金额,以分为单位
                     $total_fee = $resHandler->getParameter("total_fee");
                     //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
                     $discount = $resHandler->getParameter("discount");
                     //------------------------------
                     //处理业务开始
                     //------------------------------
                     //处理数据库逻辑
                     //注意交易单不要重复处理
                     //注意判断返回金额
                     if ($resHandler->getParameter("trade_state") == "0" || $resHandler->getParameter("trade_state") == '5' || $resHandler->getParameter("status") == "3") {
                         $payment_notice = $GLOBALS['db']->getRow("select * from " . DB_PREFIX . "payment_notice where notice_sn = '" . $out_trade_no . "'");
                         $order_info = $GLOBALS['db']->getRow("select * from " . DB_PREFIX . "deal_order where id = " . $payment_notice['order_id']);
                         require_once APP_ROOT_PATH . "system/libs/cart.php";
                         $GLOBALS['db']->query("update " . DB_PREFIX . "payment_notice set outer_notice_sn = '" . $transaction_id . "' where id = " . $payment_notice['id']);
                         $rs = payment_paid($payment_notice['id']);
                         if ($rs) {
                             order_paid($payment_notice['order_id']);
                             echo "success";
                         } else {
                             echo 'fail';
                         }
                     } else {
                         echo "success";
                     }
                 } else {
                     //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
                     //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->             										       getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
                     echo "fail";
                 }
             }
             //获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
             /*
             echo "<br>------------------------------------------------------<br>";
             echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
             echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
             echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
             echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
             echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
             */
         } else {
             //通信失败
             echo "fail";
             //后台调用通信失败,写日志,方便定位问题
             echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
         }
     } else {
         header("Content-Type:text/html; charset=utf-8");
         echo "<br/>" . "认证签名失败" . "<br/>";
         echo $resHandler->getDebugInfo() . "<br>";
     }
 }
Пример #2
0
                }
                //------------------------------
                //处理业务完毕
                //------------------------------
                echo "success";
            } else {
                //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
                //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->             										       getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
                log_result("中介担保后台回调失败");
                echo "fail";
            }
        }
        //获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
        /*
        echo "<br>------------------------------------------------------<br>";
        echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
        echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
        echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
        echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
        echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
        */
    } else {
        //通信失败
        echo "fail";
        //后台调用通信失败,写日志,方便定位问题
        echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
    }
} else {
    echo "<br/>" . "认证签名失败" . "<br/>";
    echo $resHandler->getDebugInfo() . "<br>";
}
Пример #3
0
 /**
  * POST接收数据
  * 状态码说明  (0 交易完成 1 交易失败 2 交易超时 3 交易处理中 4 交易未支付 5交易取消 6交易发生错误)
  */
 public function notify()
 {
     /* 创建支付应答对象 */
     $resHandler = new ResponseHandler();
     $resHandler->setKey($this->config['key']);
     //判断签名
     if ($resHandler->isTenpaySign()) {
         //通知id
         $notify_id = $resHandler->getParameter("notify_id");
         //通过通知ID查询,确保通知来至财付通
         //创建查询请求
         $queryReq = new RequestHandler();
         $queryReq->init();
         $queryReq->setKey($this->config['key']);
         $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
         $queryReq->setParameter("partner", $this->config['partner']);
         $queryReq->setParameter("notify_id", $notify_id);
         //通信对象
         $httpClient = new TenpayHttpClient();
         $httpClient->setTimeOut(5);
         //设置请求内容
         $httpClient->setReqContent($queryReq->getRequestURL());
         //后台调用
         if ($httpClient->call()) {
             //设置结果参数
             $queryRes = new ClientResponseHandler();
             $queryRes->setContent($httpClient->getResContent());
             $queryRes->setKey($this->config['key']);
             if ($resHandler->getParameter("trade_mode") == "1") {
                 //判断签名及结果(即时到帐)
                 //只有签名正确,retcode为0,trade_state为0才是支付成功
                 if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {
                     $return_data['order_id'] = $resHandler->getParameter("out_trade_no");
                     $return_data['price'] = dround($resHandler->getParameter("total_fee") / 100);
                     $return_data['account'] = $resHandler->getParameter("partner");
                     $return_data['order_status'] = 0;
                     return $return_data;
                 } else {
                     //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
                     //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes-> getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
                     error_log(date('m-d H:i:s') . '| POST: ' . $queryRes->getParameter("retmsg") . ' |' . "\r\n", 3, LOG_PATH . 'tenpay_error_log.php');
                     return false;
                 }
             } elseif ($resHandler->getParameter("trade_mode") == "2") {
                 //判断签名及结果(中介担保)
                 //只有签名正确,retcode为0,trade_state为0才是支付成功
                 if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0") {
                     $return_data['order_id'] = $resHandler->getParameter("out_trade_no");
                     $return_data['price'] = dround($resHandler->getParameter("total_fee") / 100);
                     $return_data['account'] = $resHandler->getParameter("partner");
                     switch ($resHandler->getParameter("trade_state")) {
                         case 0:
                             $return_data['order_status'] = 3;
                             break;
                         case 1:
                             $return_data['order_status'] = 4;
                             break;
                         case 2:
                             $return_data['order_status'] = 4;
                             break;
                         case 4:
                             $return_data['order_status'] = 3;
                             break;
                         case 5:
                             $return_data['order_status'] = 0;
                             break;
                         case 6:
                             $return_data['order_status'] = 5;
                             break;
                         case 7:
                             $return_data['order_status'] = 3;
                             break;
                         case 8:
                             $return_data['order_status'] = 3;
                             break;
                         case 9:
                             $return_data['order_status'] = 5;
                             break;
                         case 10:
                             $return_data['order_status'] = 5;
                             break;
                         default:
                             $return_data['order_status'] = 5;
                     }
                     return $return_data;
                 } else {
                     //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
                     //echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->             										       getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
                     error_log(date('m-d H:i:s') . '| POST: ' . $queryRes->getParameter("retmsg") . ' |' . "\r\n", 3, LOG_PATH . 'tenpay_error_log.php');
                     return false;
                 }
             }
             //获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
             /*
             	echo "<br>------------------------------------------------------<br>";
             	echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
             	echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
             	echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
             	echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
             	echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
             */
         } else {
             error_log(date('m-d H:i:s') . '| POST: ' . $httpClient->getErrInfo() . ' |' . "\r\n", 3, LOG_PATH . 'tenpay_error_log.php');
             return false;
         }
     } else {
         error_log(date('m-d H:i:s') . '| POST: ' . $resHandler->getDebugInfo() . ' |' . "\r\n", 3, LOG_PATH . 'tenpay_error_log.php');
         return false;
     }
 }