銀聯開發必需要開啓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>
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; } ?>
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>"; } ?>
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(); ?>