<?php
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
$payment_lang = ROOT_PATH . 'languages/' . $GLOBALS['_CFG']['lang'] . '/payment/icbc.php';
if (file_exists($payment_lang))
{
global $_LANG;
include_once($payment_lang);
}
/**
* 子產品資訊
*/
if (isset($set_modules) && $set_modules == true)
{
$i = isset($modules) ? count($modules) : 0;
/* 代碼 */
$modules[$i]['code'] = basename(__FILE__, '.php');
/* 描述對應的語言項 */
$modules[$i]['desc'] = 'icbc_desc';
/* 是否支援貨到付款 */
$modules[$i]['is_cod'] = '0'; //否
/* 是否支援線上支付 */
$modules[$i]['is_online'] = '1'; //是
/* 作者 */
$modules[$i]['author'] = 'ec';
/* 網址 */
$modules[$i]['website'] = 'http://www.baidu.com';
/* 版本号 */
$modules[$i]['version'] = '1.0.0.11';
/* 配置資訊 */
$modules[$i]['config'] = array(
array('name' => 'merID', 'type' => 'text', 'value' => ''),//商戶代碼
array('name' => 'merAcct', 'type' => 'text', 'value' => ''),//商戶帳号
array('name' => 'curType', 'type' => 'text', 'value' => ''),//支付币種
);
return;
}
class icbc
{
/**
* 構造函數
*
* @access public
* @param
*
* @return void
*/
function icbc()
{
}
function __construct()
{
$this->icbc();
}
/**
* 生成支付代碼
* @param array $order 訂單資訊
* @param array $payment 支付方式資訊
*/
function get_code($order, $payment)
{
//構造參數
$a_parameter = array(
//公共證書位址
'cert_public_file' => ROOT_PATH."includes/modules/payment/icbc/ebb2cpublic.crt",
//私有證書位址
'cert_private_file' => ROOT_PATH."includes/modules/payment/icbc/th2.crt",
//私鑰位址
'cert_key_file' => ROOT_PATH."includes/modules/payment/icbc/th2.key",
//接口名稱
'interfaceName' => 'ICBC_PERBANK_B2C',
//接口版本
'interfaceVersion' => '1.0.0.11',
//商城代碼
'merID' => $payment['merID'],
//商戶帳号
'merAcct' => $payment['merAcct'],
// 支援訂單支付的銀行卡種類 0表示僅允許使用借記卡支付,1表示僅允許使用信用卡支付,2表示借記卡和信用卡都能對訂單進行支付
'creditType' => 2,
//HS方式實時發送通知 AG方式不發送通知
'notifyType' => 'HS',
//訂單号
'orderid' => $order['order_sn'],
//金額以分為機關
'amount' => number_format($order['order_amount'], 2, '.', '') * 100,
//币種目前隻支援人民币,代碼為001
'curType' => '001',
//對于HS方式 0: 發送成功或者失敗資訊 1: 隻發送交易成功資訊
'resultType' => 0,
//14位時間戳
'orderDate' => local_date('YmdHis', gmtime()),
//商戶聯名,一般用0
'verifyJoinFlag' => 0,
//語言 預設為中文版 EN_US:英文版
'Language' => '',
//商品ID
'goodsID' => '',
//商品名稱
'goodsName' => $order['order_sn'],
//商品數量
'goodsNum' => 1,
//運費金額以分為機關
'carriageAmt' => 0,
// 虛拟商品/實物商品标志位 0 虛拟商品 1 實物商品
'goodsType' => 1,
//商城提示,備注1,備注2
'merHint' => '0',
'remark1' => '',
'remark2' => '',
//傳回商戶變量
'merVAR' => $order['log_id'].'-'.$order['order_sn'],
//接收銀行通知位址,目前隻支援http協定80端口
'merURL' => return_url(basename(__FILE__, '.php')),
//1.0.0.7加入 分期數,全額為1
'installmentTimes' => 1,
);
@ file_put_contents(ROOT_PATH.'_icbc_config.txt', serialize($a_parameter));
//構造V3版的xml
$s_tran_data = '
<?xml version="1.0" encoding="GBK" standalone="no"?>
<B2CReq>
<interfaceName>' . $a_parameter['interfaceName'] . '</interfaceName>
<interfaceVersion>' . $a_parameter['interfaceVersion'] . '</interfaceVersion>
<orderInfo>
<orderDate>' . $a_parameter['orderDate'] . '</orderDate>
<curType>' . $a_parameter['curType'] . '</curType>
<merID>' . $a_parameter['merID'] . '</merID>
<subOrderInfoList>
<subOrderInfo>
<orderid>' . $a_parameter['orderid'] . '</orderid>
<amount>' . $a_parameter['amount'] . '</amount>
<installmentTimes>' . $a_parameter['installmentTimes'] . '</installmentTimes>
<merAcct>' . $a_parameter['merAcct'] . '</merAcct>
<goodsID>' . $a_parameter['goodsID'] . '</goodsID>
<goodsName>' . $a_parameter['goodsName'] . '</goodsName>
<goodsNum>' . $a_parameter['goodsNum'] . '</goodsNum>
<carriageAmt>' . $a_parameter['carriageAmt'] . '</carriageAmt>
</subOrderInfo>
</subOrderInfoList>
</orderInfo>
<custom>
<verifyJoinFlag>' . $a_parameter['verifyJoinFlag'] . '</verifyJoinFlag>
<Language>' . $a_parameter['Language'] . '</Language>
</custom>
<message>
<creditType>' . $a_parameter['creditType'] . '</creditType>
<notifyType>' . $a_parameter['notifyType'] . '</notifyType>
<resultType>' . $a_parameter['resultType'] . '</resultType>
<merReference></merReference>
<merCustomIp>' . real_ip() . '</merCustomIp>
<goodsType>' . $a_parameter['goodsType'] . '</goodsType>
<merCustomID></merCustomID>
<merCustomPhone></merCustomPhone>
<goodsAddress>位址</goodsAddress>
<merOrderRemark></merOrderRemark>
<merHint>' . $a_parameter['merHint'] . '</merHint>
<remark1>' . $a_parameter['remark1'] . '</remark1>
<remark2>' . $a_parameter['remark2'] . '</remark2>
<merURL>' . $a_parameter['merURL'] . '</merURL>
<merVAR>' . $a_parameter['merVAR'] . '</merVAR>
</message>
</B2CReq>
';
$s_tran_data = str_replace(' ', '', $s_tran_data);
$s_tran_data = str_replace("\r", '', $s_tran_data);
$s_tran_data = str_replace("\n", '', $s_tran_data);
$o_icbc_b2cutil = new COM('ICBCEBANKUTIL.B2CUtil');
$rc=$o_icbc_b2cutil->init($a_parameter['cert_public_file'], $a_parameter['cert_private_file'], $a_parameter['cert_key_file'], '11111');
if($rc != 0){
echo $errorCode = "初始化失敗 調試代碼:".$o_icbc_b2cutil->getRC();
//return $errorCode;
}
$s_mer_sign_msg = $o_icbc_b2cutil->signC($s_tran_data, strlen($s_tran_data));
if($s_mer_sign_msg == '')
{
echo $errorCode = "簽名失敗! 調試代碼:".$o_icbc_b2cutil->getRC();
// return $errorCode;
}
else
{
$s_mer_sign_msg = base64_encode($s_mer_sign_msg);
}
$o_fp = fopen($a_parameter['cert_private_file'], 'rb');
$s_mer_cert = fread($o_fp, filesize($a_parameter['cert_private_file']));
$s_mer_cert = base64_encode($s_mer_cert);
fclose($o_fp);
//————————————————————-
//– 擷取商戶證書
//————————————————————-
$cert = $o_icbc_b2cutil->getCert(1);
if($cert == ''){
echo $errorCode = "擷取商戶證書失敗! 調試代碼:".$o_icbc_b2cutil->getRC();
//return $errorCode;
}
//$icbcB2CIP="https://mybank.ICBC.com.cn/servlet/ICBCINBSEBusinessServlet";
//https://mybank3.dccnet.com.cn/servlet/NewB2cMerPayReqServlet
//構造表單資料
return '<div style="text-align:center">
<form method="post" id="form_icbc" action="https://mybank3.dccnet.com.cn/servlet/NewB2cMerPayReqServlet">
<input name="interfaceName" type="hidden" value="' . $a_parameter['interfaceName'] . '" />
<input name="interfaceVersion" type="hidden" value="' . $a_parameter['interfaceVersion'] . '" />
<input name="tranData" type="hidden" value="' . base64_encode($s_tran_data) . '" />
<input name="merSignMsg" type="hidden" value="' . $s_mer_sign_msg . '" />
<input name="merCert" type="hidden" value="' . $s_mer_cert . '" />
</form>
<img src="http://www.icbc.com.cn/icbc/html/wangyin/wangyin/logo.gif" class="hand" οnclick="document.getElementById(\'form_icbc\').submit();"
alt="" />
</div>';
}
/**
* 響應操作
*/
function respond()
{
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "respond load ! \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
if (empty($_POST)) {
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "post null ! \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
return FALSE;
}
$s_mer_var =@ $_POST['merVAR']; //擷取支付号
$s_notify_data =@ $_POST['notifyData'];
$s_sign_msg =@ $_POST['signMsg'];
$a_mer_var = explode('_', $s_mer_var);
$i_order_id = $a_mer_var[1];
$i_log_id = $a_mer_var[0];
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "order transfer! log_id: $i_log_id \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
//構造參數
$a_parameter = array(
//公共證書位址
'cert_public_file' => ROOT_PATH."includes/modules/payment/icbc/ebb2cpublic.crt",
//私有證書位址
'cert_private_file' => ROOT_PATH."includes/modules/payment/icbc/user.crt",
//私鑰位址
'cert_key_file' => ROOT_PATH."includes/modules/payment/icbc/user.key",
);
//解析資料
$s_notify_data = base64_decode($s_notify_data);
//驗證簽名
$o_icbc_b2cutil = new COM('ICBCEBANKUTIL.B2CUtil');
$o_icbc_b2cutil->init($a_parameter['cert_public_file'], $a_parameter['cert_private_file'], $a_parameter['cert_key_file'], 'th');
$i_is_ok = $o_icbc_b2cutil->verifySignC($s_notify_data, strlen($s_notify_data), $s_sign_msg, strlen($s_sign_msg));
if ($i_is_ok != 0) {
return FALSE;
}
$o_xml = new DOMDocument();
$o_xml->loadXML($s_notify_data);
$i_trade_status = $o_xml->getElementsByTagName('tranStat')->item(0)->textContent;
$d_pay_price = $o_xml->getElementsByTagName('amount')->item(0)->textContent;
$d_pay_price = number_format($d_pay_price / 100, 2, '.', '');
if ($i_trade_status != 1) {
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "order trade status! log_id: $i_log_id , trade_status : false, $i_trade_status \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
return FALSE;
}
/* 檢查支付的金額是否相符 */
if (! check_money($i_log_id, $d_pay_price)) {
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "order check money! log_id: $i_log_id , money : error, $d_pay_price \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
return false;
}
/* 改變訂單狀态 */
order_paid($i_log_id);
##########################################################
$content =@ file_get_contents(ROOT_PATH.'_icbc_data.txt');
$content .= "order pay success! log_id: $i_log_id , pay_price: $d_pay_price \n";
@ file_put_contents(ROOT_PATH.'_icbc_data.txt', $content);
##########################################################
return TRUE;
}
}
?>
工商銀行提供完整的資料包 DEMO JAR
