예제 #1
0
 public function tenpaynotice()
 {
     require_once C('APP_ROOT') . "Lib/Pay/Tenpay/ResponseHandler.class.php";
     require_once C('APP_ROOT') . "Lib/Pay/Tenpay/RequestHandler.class.php";
     require_once C('APP_ROOT') . "Lib/Pay/Tenpay/client/ClientResponseHandler.class.php";
     require_once C('APP_ROOT') . "Lib/Pay/Tenpay/client/TenpayHttpClient.class.php";
     /* 创建支付应答对象 */
     $resHandler = new ResponseHandler();
     $resHandler->setKey($this->payConfig['tenpay']['mkey']);
     //Log::write('tenpay notice:'.print_r($resHandler->getAllParameters(), true), Log::DEBUG);
     //判断签名
     if ($resHandler->isTenpaySign()) {
         //通知id
         $notify_id = $resHandler->getParameter("notify_id");
         $tenpay_params = C('TENPAY_PARAMS');
         //通过通知ID查询,确保通知来至财付通
         //创建查询请求
         $queryReq = new RequestHandler();
         $queryReq->init();
         $queryReq->setKey($this->payConfig['tenpay']['mkey']);
         $queryReq->setGateUrl($tenpay_params["VERIFY_URL"]);
         $queryReq->setParameter("partner", $this->payConfig['tenpay']['MerCode']);
         $queryReq->setParameter("notify_id", $notify_id);
         $queryReq->setParameter("input_charset", "UTF-8");
         //通信对象
         $httpClient = new TenpayHttpClient();
         $httpClient->setTimeOut(5);
         //设置请求内容
         $httpClient->setReqContent($queryReq->getRequestURL());
         //后台调用
         if ($httpClient->call()) {
             //设置结果参数
             $queryRes = new ClientResponseHandler();
             $queryRes->setContent($httpClient->getResContent());
             $queryRes->setKey($this->payConfig['tenpay']['mkey']);
             //判断签名及结果
             //只有签名正确,retcode为0,trade_state为0才是支付成功
             if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $queryRes->getParameter("trade_state") == "0" && $queryRes->getParameter("trade_mode") == "1") {
                 //取结果参数做业务处理
                 $out_trade_no = $queryRes->getParameter("out_trade_no");
                 //财付通订单号
                 $transaction_id = $queryRes->getParameter("transaction_id");
                 //金额,以分为单位
                 $total_fee = $queryRes->getParameter("total_fee");
                 //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
                 $discount = $queryRes->getParameter("discount");
                 //------------------------------
                 //处理业务开始
                 //------------------------------
                 //处理数据库逻辑
                 //注意交易单不要重复处理
                 //注意判断返回金额
                 $nid = $this->createnid("tenpay", $out_trade_no);
                 $done = $this->payDone(1, $nid, $transaction_id, "total_fee:" . $total_fee);
                 //------------------------------
                 //处理业务完毕
                 //------------------------------
                 echo "success";
             } else {
                 //错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
                 //echo "验证签名失败 或 业务错误信息:trade_state=" . $queryRes->getParameter("trade_state") . ",retcode=" . $queryRes->getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
                 $out_trade_no = $resHandler->getParameter("out_trade_no");
                 $nid = $this->createnid("tenpay", $out_trade_no);
                 $done = $this->payDone(3, $nid, "", print_r($queryRes->getAllParameters(), true));
                 echo "fail";
             }
         } else {
             // 				$out_trade_no = $resHandler->getParameter("out_trade_no");
             // 				$nid = $this->createnid( "tenpay", $out_trade_no);
             // 				$done = $this->payDone(3,$nid, "", print_r($resHandler->getAllParameters(), true));
             //通信失败
             echo "fail";
             //后台调用通信失败,写日志,方便定位问题
             //echo "<br>call err:" . $httpClient->getResponseCode() ."," . $httpClient->getErrInfo() . "<br>";
             Log::write("tenpay notice:<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo(), Log::DEBUG);
         }
     } else {
         $out_trade_no = $resHandler->getParameter("out_trade_no");
         $transaction_id = $resHandler->getParameter("transaction_id");
         $nid = $this->createnid("tenpay", $out_trade_no);
         $done = $this->payDone(2, $nid, $transaction_id, print_r($resHandler->getAllParameters(), true));
         //回调签名错误
         echo "fail";
     }
 }