銀聯chinapay支付接口實現詳解


<?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;
}
//訂單號跟商戶號的關系:
//商戶提交給ChinaPay的交易訂單號,訂單號的第五至第九位必須是商戶號的最后五位

//生成訂單號,定長16位,任意數字組合,一天內不允許重復,必填
$ordid = ecshopsn2chinapaysn(date('Ymd').mt_rand(10000,99999),$merid);
//訂單金額,定長12位,以分為單位,不足左補0,必填
$transamt = formatamount(0.01);

//貨幣代碼,3位,境內商戶固定為156,表示人民幣,必填
$curyid = "156";

//訂單日期,本例采用當前日期,必填
$transdate = date('Ymd',time());
//交易類型,0001 表示支付交易,0002 表示退款交易
$transtype = "0001";
//接口版本號,有兩個支付版本: 20070129、20040916,客戶是808080開頭的,就用04版本,必填
$version = "20040916";
//頁面返回地址(您服務器上可訪問的URL),最長80位,當用戶完成支付后,銀行頁面會自動跳轉到該頁面,並POST訂單結果信息,可選
$pagereturl = "$site_url/netpayclient_order_feedback.php";
//后台返回地址(您服務器上可訪問的URL),最長80位,當用戶完成支付后,我方服務器會POST訂單結果信息到該頁面,必填
$bgreturl = "$site_url/netpayclient_order_feedback.php";

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

//支付網關號,4位,上線時建議留空,以跳轉到銀行列表頁面由用戶自由選擇,本示例選用0001農商行網關便於測試,可選
$gateid = "";
//備注,最長60位,交易成功后會原樣返回,可用於額外的訂單跟蹤等,可選
$priv1 = "memo"; 
//官方手冊有兩種簽名方式:
//04的應該是第二種

//第一種:
//按次序組合訂單信息為待簽名串
//$plain = $merid . $ordid . $transamt . $curyid . $transdate .$transtype.$priv1;

//生成簽名值,必填
//$chkvalue = sign($plain);

//第二種:
//生成簽名值,必填

$chkvalue = signOrder($merid,$ordid,$transamt,$curyid,$transdate,$transtype);

if (!$chkvalue) {
echo "簽名失敗!";
exit;
}

?>
<?php
/*
*本地訂單號轉為銀聯訂單號
*/
function ecshopsn2chinapaysn($order_sn, $vid){
if($order_sn && $vid){
$sub_vid = substr($vid, 10, 5);
$sub_start = substr($order_sn, 2, 4);
$sub_end = substr($order_sn, 6);
$temp = $pay_id;
return $sub_start . $sub_vid . $sub_end;
}
}

/*
*銀聯訂單號轉為本地訂單號
*/
function chinapaysn2ecshopsn($chinapaysn){
if($chinapaysn){ 
$year = date('Y',time());

return substr($year,0,2) . substr($chinapaysn, 0, 4) . substr($chinapaysn, 9) ;
}
}

/*
*格式化交易金額,以分位單位的12位數字。
*/
function formatamount($amount){
if($amount){
if(!strstr($amount, ".")){
$amount = $amount.".00";
}
$amount = str_replace(".", "", $amount);
$temp = $amount;
for($i=0; $i< 12 - strlen($amount); $i++){
$temp = "0" . $temp;
}
return $temp;
}
}

?>
<p> 本接口需要 mcrypt 和 bcmath 兩個PHP擴展庫的支持,請查看<a href="phpinfo.php" target="_blank">配置</a></p>
<h1>支付交易</h1>
<h5><a href="javascript:window.location.reload()">刷新本頁以改變訂單號</a></h5>

<form action="<?php echo REQ_URL_PAY; ?>" method="post" target="_blank">
<label>商戶號</label><br/>
<input type="text" name="MerId" value="<? echo $merid; ?>" readonly /><br/>
<label>訂單號</label><br/>
<input type="text" name="OrdId" value="<? echo $ordid; ?>" readonly/><br/>
<label>訂單金額</label><br/>
<input type="text" name="TransAmt" value="<? echo $transamt; ?>" readonly/><br/>
<label>貨幣代碼</label><br/>
<input type="text" name="CuryId" value="<? echo $curyid; ?>" readonly/><br/>
<label>訂單日期</label><br/>
<input type="text" name="TransDate" value="<? echo $transdate; ?>" readonly/><br/>
<label>交易類型</label><br/>
<input type="text" name="TransType" value="<? echo $transtype; ?>" readonly/><br/>
<label>支付版本號</label><br/>
<input type="text" name="Version" value="<? echo $version; ?>" readonly/><br/>
<label>后台返回地址</label><br/>
<input type="text" name="BgRetUrl" value="<? echo $bgreturl; ?>"/><br/>
<label>頁面返回地址</label><br/>
<input type="text" name="PageRetUrl" value="<? echo $pagereturl; ?>"/><br/>
<label>網關號</label><br/>
<input type="text" name="GateId" value="<? echo $gateid; ?>"/><br/>
<label>備注</label><br/>
<input type="text" name="Priv1" value="<? echo $priv1; ?>" readonly/><br/>
<label>簽名值</label><br/>
<input type="text" name="ChkValue" value="<? echo $chkvalue; ?>" readonly/><br/>
<input type="submit" value="支付">
</form>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM