Chinapay 銀聯支付接口

銀聯開發必需要開啓mcrypt 和 bcmath 兩個PHP擴展庫的支持 若是沒有就沒有辦法進行開發,先確認數據庫是否開啓擴展php

關於銀聯支付接口 最主要的是銀行提供的祕鑰和私鑰,html

netpayclient.php加密文件   MerPrK.key私鑰   PgPubk.key祕鑰 是銀聯也商戶簽約後提供 很是重要  數據庫

1:from表單 提交商戶數據個銀行  https://payment.ChinaPay.com/pay/TransGet銀聯生產環境接口 在測試是用銀聯提供的測試環境比較好瀏覽器

 經過require_once 加載submit頁面服務器

    <!-- 銀聯支付頁面 -->        
             <form action="https://payment.ChinaPay.com/pay/TransGet" method="post" target="_blank">
               <?php require_once("chinapay/netpayclient_order_submit.php");?>
                    <div style="display: none;">
                    <input type=hidden name="MerId" value="<?php echo $merid ?>"/>
                    <input type=hidden name="OrdId" value="<?php echo $ordid ?>"/>
                    <input type=hidden name="TransAmt" value="<?php echo $transamt ?>"/>
                     <input type=hidden name="CuryId" value="<?php echo $curyid ?>"/>
                     <input type=hidden name="TransDate" value="<?php echo $transdate?>"/>
                    <input type=hidden name="TransType" value="<?php echo $transtype?>"/>
                    <input type=hidden name="Version" value="<?php echo $version?>"/>
                       <input type=hidden name="BgRetUrl" value="<?php echo $bgreturl?>"/>
                    <input type=hidden name="PageRetUrl" value="<?php echo $pagereturl?>"/>
                    <input type=hidden name="GateId" value="<?php echo $gateid?>"/>
                    <input type=hidden name="Priv1" value="<?php echo $priv1?>"/>
                    <input type=hidden name="ChkValue" value="<?php echo $chkvalue?>"/>
                    </div>
                    <li>
                        <div class="pay_boxin pay_curr">
                            <span class="left"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/unionpay.jpg" height="40px"></span>
                        <span class="pay_money right">
                            <p>支付<strong><?php echo @sprintf('%0.2f',$OrderInfo['TotalMoney'])?></strong></p>
                        </span>
                        </div>
                        <input type="submit" style="width:220px; height:50px; border:0px; margin:30px 0 0 500px; background: url(<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png) center no-repeat; cursor:pointer;" value="" >
                        <div class="pay_disno" style="margin:30px 0 0 500px;"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png"></div>
                </li>
                </form>
View Code

2:netpayclient_order_submit.php 進行數據的簽名驗證 而且導入私鑰文件 加密部分的代碼能夠根據商戶需求進行修改app

<?php
    //header('Content-type: text/html; charset=gbk');

    include_once("netpayclient_config.php");
?>
<title>支付交易</title>
<?php
    //加載 netpayclient 組件
    include_once("netpayclient.php");
    //導入私鑰文件, 返回值即爲您的商戶號,長度15位
    $merid = buildKey(PRI_KEY);
    if(!$merid) {
        echo "導入私鑰文件失敗!";
        exit;
    }

    //生成訂單號,定長16位,任意數字組合,一天內不容許重複,本例採用當前時間戳,必填
    $ordid = substr($OrderInfo["PayNumber"], 1, 16);//"00" . date('YmdHis');
    //訂單金額,定長12位,以分爲單位,不足左補0,必填
    $transamt = padstr(str_replace(".", "", $OrderInfo['TotalMoney']),12);//padstr('1',12);
    //貨幣代碼,3位,境內商戶固定爲156,表示人民幣,必填
    $curyid = "156";
    //訂單日期,本例採用當前日期,必填
    $transdate = date('Ymd');
    //交易類型,0001 表示支付交易,0002 表示退款交易
    $transtype = "0001";
    //接口版本號,全報文簽名接口版本爲20141120,必填
    $version = "20141120";
    //頁面返回地址(您服務器上可訪問的URL),最長80位,當用戶完成支付後,銀行頁面會自動跳轉到該頁面,並POST訂單結果信息,可選
    $pagereturl = "$site_url/index.php/Payment/ChinaPayReturn";
    //後臺返回地址(您服務器上可訪問的URL),最長80位,當用戶完成支付後,我方服務器會POST訂單結果信息到該頁面,必填
    $bgreturl = "$site_url/index.php/Payment/ChinaPayReturn";

    /************************
    頁面返回地址和後臺返回地址的區別:
    後臺返回從我方服務器發出,不受用戶操做和瀏覽器的影響,從而保證交易結果的送達。
    ************************/

    //支付網關號,4位,上線時建議留空,以跳轉到銀行列表頁面由用戶自由選擇,本示例選用0001農商行網關便於測試,可選
    $gateid = "";
    //備註,最長60位,交易成功後會原樣返回,可用於額外的訂單跟蹤等,可選
    $priv1 = "";

    //按次序組合訂單信息爲待簽名串
    $plain = $merid . $ordid . $transamt . $curyid . $transdate . $transtype . $version    . $bgreturl    . $pagereturl . $gateid . $priv1;
    //生成簽名值,必填
    $chkvalue = sign($plain);
    if (!$chkvalue) {
        echo "簽名失敗!";
        exit;
    }
?>
View Code

3:netpayclient_order_feedback.php 支付應答頁面 加載公鑰 與私鑰進行驗證簽名 成功銀行會返回數據給商戶ide

<?php
    //header('Content-type: text/html; charset=gbk');
    include_once("netpayclient_config.php");
?>
<title>支付應答</title>
<h1>支付應答</h1>
<?php
    //加載 netpayclient 組件
    include_once("netpayclient.php");

    //導入公鑰文件
    $flag = buildKey(PUB_KEY);
    if(!$flag) {
        echo "導入公鑰文件失敗!";
        exit;
    }

    //獲取交易應答的各項值
    $merid = $_REQUEST["merid"];
    $orderno = $_REQUEST["orderno"];
    $transdate = $_REQUEST["transdate"];
    $amount = $_REQUEST["amount"];
    $currencycode = $_REQUEST["currencycode"];
    $transtype = $_REQUEST["transtype"];
    $status = $_REQUEST["status"];
    $checkvalue = $_REQUEST["checkvalue"];
    $gateId = $_REQUEST["GateId"];
    $priv1 = $_REQUEST["Priv1"];

    if(strlen($orderno) == 16)
    {
        $orderno = "2" . $orderno;
    }
    //驗證簽名值,true 表示驗證經過
    $flag = verifyTransResponse($merid, $orderno, $amount, $currencycode, $transdate, $transtype, $status, $checkvalue);
    if(!$flag) {
        //echo "<h2>驗證簽名失敗!</h2>";
        //exit;
    }
    //echo "<h2>驗證簽名成功!</h2>";
    //交易狀態爲1001表示交易成功,其餘爲各種錯誤,如卡內餘額不足等
    if ($status == '1001'){
        //echo "<h3>交易成功!</h3>";
        //您的處理邏輯請寫在這裏,如更新數據庫等。
        //注意:若是您在提交時同時填寫了頁面返回地址和後臺返回地址,且地址相同,請在這裏先作一次數據庫查詢判斷訂單狀態,以防止重複處理相通的訂單
        $this->actionSetPayN($orderno,3);
        $this->redirect(array('/UserCenter'));
    } else {
        echo "<h3>交易失敗!</h3>";
    }


?>
View Code

4:後臺回調跳轉post

5:netpayclient_config.php 設置頁面測試

<?php
    /*請按照您的實際狀況配置如下各參數*/

    //私鑰文件,在CHINAPAY申請商戶號時獲取,請相應修改此處,可填相對路徑,下同
    define("PRI_KEY", "MerPrk.key");
    //公鑰文件,示例中已經包含
    define("PUB_KEY", "PgPubk.key");
    
    /*如您已有生產密鑰,請修改如下配置,默認爲測試環境*/
    
    //支付請求地址(測試)
    //define("","http://payment-test.ChinaPay.com/pay/TransGet");
    //支付請求地址(生產)
    //define("","https://payment.ChinaPay.com/pay/TransGet");
    
     //取得本示例安裝位置 商戶的網站地址
    $site_url = "http://www.xxxx.com"//getSiteUrl();
?>
相關文章
相關標籤/搜索