天天看點

工商銀行支付接口 B2C PHP ecshop

<?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

工商銀行支付接口 B2C PHP ecshop