3、在項目配置文件中加入接口配置參數 php
//財付通配置參數 'tenpay_config' => array( 'partner' => '**********', //這裏是你在成功申請財付通接口後獲取到的商戶號; 'key' => '*******************', //這裏是你在成功申請財付通接口後獲取到的密鑰 'return_url' => '********/tenreturnurl', 'notify_url' => '********/tennotifyurl', ),
3、在支付操做的控制器中加入代碼以下 html
public function tenpay($data) { $tenpay_config = C('tenpay_config'); /* 獲取提交的訂單號 */ $out_trade_no = $data["orderid"]; /* 獲取提交的商品名稱 */ $product_name = $data["title"]; /* 獲取提交的商品價格 */ $order_price = $data["money"]; /* 獲取提交的備註信息 */ $remarkexplain = $data["remark"]; /* 支付方式 */ $trade_mode = 1; $strDate = date("Ymd"); $strTime = date("His"); /* 商品價格(包含運費),以分爲單位 */ $total_fee = $order_price * 100; /* 商品名稱 */ $desc = "商品:" . $product_name . ",備註:" . $remarkexplain; /* 建立支付請求對象 */ $reqHandler = new \Think\Tenpay\RequestHandler(); $reqHandler->init(); $reqHandler->setKey(trim($tenpay_config['key'])); $reqHandler->setGateUrl("https://gw.tenpay.com/gateway/pay.htm"); //---------------------------------------- //設置支付參數 //---------------------------------------- $reqHandler->setParameter("partner", trim($tenpay_config['partner'])); $reqHandler->setParameter("out_trade_no", $out_trade_no); $reqHandler->setParameter("total_fee", $total_fee); //總金額 $reqHandler->setParameter("return_url", $tenpay_config['return_url']); $reqHandler->setParameter("notify_url", $tenpay_config['notify_url']); $reqHandler->setParameter("body", $desc); $reqHandler->setParameter("bank_type", "DEFAULT"); //銀行類型,默認爲財付通 //用戶ip $reqHandler->setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']); //客戶端IP $reqHandler->setParameter("fee_type", "1"); //幣種 $reqHandler->setParameter("subject", $desc); //商品名稱,(中介交易時必填) //系統可選參數 $reqHandler->setParameter("sign_type", "MD5"); //簽名方式,默認爲MD5,可選RSA $reqHandler->setParameter("service_version", "1.0"); //接口版本號 $reqHandler->setParameter("input_charset", "utf-8"); //字符集 $reqHandler->setParameter("sign_key_index", "1"); //密鑰序號 //業務可選參數 $reqHandler->setParameter("attach", ""); //附件數據,原樣返回就能夠了 $reqHandler->setParameter("product_fee", ""); //商品費用 $reqHandler->setParameter("transport_fee", "0"); //物流費用 $reqHandler->setParameter("time_start", date("YmdHis")); //訂單生成時間 $reqHandler->setParameter("time_expire", ""); //訂單失效時間 $reqHandler->setParameter("buyer_id", ""); //買方財付通賬號 $reqHandler->setParameter("goods_tag", ""); //商品標記 $reqHandler->setParameter("trade_mode", $trade_mode); //交易模式(1.即時到賬模式,2.中介擔保模式,3.後臺選擇(賣家進入支付中心列表選擇)) $reqHandler->setParameter("transport_desc", ""); //物流說明 $reqHandler->setParameter("trans_type", "1"); //交易類型 $reqHandler->setParameter("agentid", ""); //平臺ID $reqHandler->setParameter("agent_type", ""); //代理模式(0.無代理,1.表示卡易售模式,2.表示網店模式) $reqHandler->setParameter("seller_id", ""); //賣家的商戶號 //請求的URL $reqUrl = $reqHandler->getRequestURL(); //獲取debug信息,建議把請求和debug信息寫入日誌,方便定位問題 /**/ $reqHandler->doSend2($reqUrl); $debugInfo = $reqHandler->getDebugInfo(); }
聲明一下,$data是商品的參數,裏面必須包含訂單號,商品名稱,訂單描述,商品價格。上述代碼中的doSend2函數是一個跳轉函數,修改的是ResponseHandler.class.php中的dosend函數。 thinkphp
function doSend2($url) { header("Location:" . $url); exit; }
4、支付成功跳轉處理 異步
/* 財付通頁面跳轉處理方法; */ function tenreturnurl() { /* 建立支付應答對象 */ $tenpay_config = C('tenpay_config'); $resHandler = new \Think\Tenpay\ResponseHandler(); $resHandler->setKey(trim($tenpay_config['key'])); //判斷簽名 if ($resHandler->isTenpaySign()) { //通知id $notify_id = $resHandler->getParameter("notify_id"); //商戶訂單號 $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"); //支付結果 $trade_state = $resHandler->getParameter("trade_state"); //交易模式,1即時到帳 $trade_mode = $resHandler->getParameter("trade_mode"); //支付完成時間 $time_end = $resHandler->getParameter("time_end"); $parameter = array( "out_trade_no" => $out_trade_no, //商戶訂單編號; "trade_no" => $transaction_id, //財付通訂單號; "total_fee" => $total_fee, //交易金額; "trade_status" => $trade_state, //交易狀態 "notify_id" => $notify_id, //通知校驗ID。 "notify_time" => $time_end, //通知的發送時間。 ); if ("1" == $trade_mode) { if ("0" == $trade_state) { $status = CommonController::checkorderstatus($out_trade_no); if (!$status) { CommonController::orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數; } $this->success("支付成功", U('Home/Order/Payscuess', array('id' => $out_trade_no))); } else { //當作不成功處理 $this->error("支付失敗"); } } } else { $this->error("認證簽名失敗," . $resHandler->getDebugInfo()); } } /* 財付通異步通知處理方法; */ function tennotifyurl() { $tenpay_config = C('tenpay_config'); /* 建立支付應答對象 */ $resHandler = new \Think\Tenpay\ResponseHandler(); $resHandler->setKey(trim($tenpay_config['key'])); //判斷簽名 if ($resHandler->isTenpaySign()) { //通知id $notify_id = $resHandler->getParameter("notify_id"); //經過通知ID查詢,確保通知來至財付通 //建立查詢請求 $queryReq = new \Think\Tenpay\RequestHandler(); $queryReq->init(); $queryReq->setKey(trim($tenpay_config['key'])); $queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml"); $queryReq->setParameter("partner", trim($tenpay_config['partner'])); $queryReq->setParameter("notify_id", $notify_id); //通訊對象 $httpClient = new \Think\Tenpay\client\TenpayHttpClient(); $httpClient->setTimeOut(5); //設置請求內容 $httpClient->setReqContent($queryReq->getRequestURL()); //後臺調用 if ($httpClient->call()) { //設置結果參數 $queryRes = new \Think\Tenpay\client\ClientResponseHandler(); $queryRes->setContent($httpClient->getResContent()); $queryRes->setKey(trim($tenpay_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") { //通知id $notify_id = $resHandler->getParameter("notify_id"); //商戶訂單號 $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"); //支付結果 $trade_state = $resHandler->getParameter("trade_state"); //交易模式,1即時到帳 $trade_mode = $resHandler->getParameter("trade_mode"); //支付完成時間 $time_end = $resHandler->getParameter("time_end"); $parameter = array( "out_trade_no" => $out_trade_no, //商戶訂單編號; "trade_no" => $transaction_id, //財付通訂單號; "total_fee" => $total_fee, //交易金額; "trade_status" => $trade_state, //交易狀態 "notify_id" => $notify_id, //通知校驗ID。 "notify_time" => $time_end, //通知的發送時間。 ); $status = CommonController::checkorderstatus($out_trade_no); if (!$status) { CommonController::orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數; } echo "success"; } else { echo "fail"; } } } else { //通訊失敗 echo "fail"; //後臺調用通訊失敗,寫日誌,方便定位問題 echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>"; } } else { echo "<br/>" . "認證簽名失敗" . "<br/>"; echo $resHandler->getDebugInfo() . "<br>"; } }
其中的checkorderstatus和orderhandle用的是上述支付寶即時交易案例中的訂單處理函數 函數
//處理訂單函數 //更新訂單狀態,寫入訂單支付後返回的數據 function orderhandle($parameter) { $ordid = $parameter['out_trade_no']; $data['trade_no'] = $parameter['trade_no']; $data['trade_status'] = $parameter['trade_status']; $data['notify_id'] = $parameter['notify_id']; $data['notify_time'] = $parameter['notify_time']; $data['buyer_email'] = $parameter['buyer_email']; $data['paystatus'] = 1; $Ord = M('order'); $Ord->where('orderid=' . $ordid)->save($data); } //在線交易訂單支付處理函數 //函數功能:根據支付接口傳回的數據判斷該訂單是否已經支付成功; //返回值:若是訂單已經成功支付,返回true,不然返回false; function checkorderstatus($ordid) { $Ord = M('order'); $ordstatus = $Ord->where('orderid=' . $ordid)->getField('paystatus'); if ($ordstatus == 1) { return true; } else { return false; } }
php(utf8).zip ( 60.83 KB 下載:280 次 ) this