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"; } }