ThinkPHP3.2中集成財付通支付

ThinkPHP3.2中集成財付通支付
在項目過程當中用到了支付寶和財付通的支付接口問題,發如今TP還未有人寫財付通的實例,我仿照前輩們寫的一個案例 http://www.thinkphp.cn/code/240.html 寫了一個

1、把接口集成開發包中文件提出來,用的php(utf8)版

把classes文件夾中的文件複製到TP目錄下的Library\Think 新建一個Tenpay目錄。
二,加入命名空間,方便調用


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

其餘請參看 http://www.thinkphp.cn/code/240.html 中的案例,支付接口的方法大體都是同樣的,下面提供財付通集成開發包

附件 php(utf8).zip ( 60.83 KB 下載:280 次 ) this

相關文章
相關標籤/搜索