<?php
!function_exists('html') && exit('ERR');

if(!$webdb[yeepay_id]){
	showerr('系統沒有設置易寶支付收款商戶編號,所以不能在線支付');
}elseif(!$webdb[yeepay_key]){
	showerr('系統沒有設置易寶支付密鑰,所以不能在線支付');
}

//PHP168增加
if(!function_exists("iconv")){
	function iconv($s,$d,$string){
		require_once(PHP168_PATH."inc/class.chinese.php");
		$cnvert = new Chinese("GB2312","UTF8",$string,PHP168_PATH."./inc/gbkcode/");
		$string = $cnvert->ConvertIT();
		return $string;
	}
}

$p1_MerId=$webdb[yeepay_id];
$merchantKey=$webdb[yeepay_key];
//include 'merchantProperties.php'

/*
* @Description 易寶支付產品通用接口範例 
* @V3.0
* @Author rui.xin
*/
 	
#	產品通用接口正式請求地址
$reqURL_onLine = "https://www.yeepay.com/app-merchant-proxy/node";
#	產品通用接口測試請求地址
#$reqURL_onLine = "http://tech.yeepay.com:8080/robot/debug.action";
		
# 業務類型
# 支付請求，固定值"Buy" .	
$p0_Cmd = "Buy";
		
#	送貨地址
# 為"1": 需要用戶將送貨地址留在易寶支付系統;為"0": 不需要，默認為 "0".
$p9_SAF = "0";


//處理支付結果
if($_GET[hmac]){
	#	只有支付succeed時易寶支付才會通知商戶.
	##支付succeed回調有兩次，都會通知到在線支付請求參數中的p8_Url上︰瀏覽器重定向;服務器點對點通訊.

	#	解析返回參數.
	//$return = getCallBackValue($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType,$hmac);

	#	判斷返回簽名是否正確（True/False）
	$bRet = CheckHmac($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType,$hmac);
	#	以上代碼和變量不需要修改.
			
	#	校驗碼正確.
	if($bRet){
		if($r1_Code=="1"){
			
		#	需要比較返回的金額與商家數據庫中訂單的金額是否相等，只有相等的情況下才認為是交易succeed.
		#	並且需要對返回的處理進行事務控制，進行記錄的排它性處理，防止對同一條交易重復發貨的情況發生.      	  	
			
			if($r9_BType=="1"){
				//echo "交易succeed";
				//echo  "<br />在線支付頁面返回";
			}elseif($r9_BType=="2"){
				#如果需要應答機制則必須回寫流,以success開頭,大小寫不敏感.
				echo "success";
				echo "<br />交易succeed";
				echo  "<br />在線支付服務器返回";      			 
			}elseif($r9_BType=="3"){ 
				echo  "電話支付通知頁面返回";      			
			}
			
			olpay_end($r6_Order);
		}
		
	}else{
		echo "交易信息被篡改";
		exit;
	}
}
else
{
	$array=olpay_send();

	#	商家設置用戶購買商品的支付信息.
	##易寶支付平台統一使用GBK/GB2312編碼方式,參數如用到中文，請注意轉碼

	#	商戶訂單號,選填.
	##若不為""，提交的訂單號必須在自身賬戶交易中唯一;為""時，易寶支付會自動生成隨機的商戶訂單號.
	$p2_Order					= $array[numcode];

	#	支付金額,必填.
	##單位:元，精確到分.
	$p3_Amt						= $array[money];

	#	交易幣種,固定值"CNY".
	$p4_Cur						= "CNY";

	#	商品名稱
	##用于支付時顯示在易寶支付網關左側的訂單產品信息.
	$p5_Pid						= $array[title];

	#	商品種類
	//$p6_Pcat					= $_REQUEST['p6_Pcat'];

	#	商品描述
	$p7_Pdesc					= $array[content];

	#	商戶接收支付succeed數據的地址,支付succeed後易寶支付會向該地址發送兩次succeed通知.
	$p8_Url                     = $array[return_url];
	//$p8_Url						= $_REQUEST['p8_Url'];	

	#	商戶擴展信息
	##商戶可以任意填寫1K 的字符串,支付succeed時將原樣返回.												
	$pa_MP						= 'endpay';

	#	銀行編碼
	##默認為""，到易寶支付網關.若不需顯示易寶支付的頁面，直接跳轉到各銀行、神州行支付、駿網一卡通等支付頁面，該字段可依照附錄:銀行列表設置參數值.			
	//$pd_FrpId					= $_REQUEST['pd_FrpId'];

	#	應答機制
	##為"1": 需要應答機制;為"0": 不需要應答機制.
	$pr_NeedResponse=0;
	//$pr_NeedResponse	= $_REQUEST['pr_NeedResponse'];

	#調用簽名函數生成簽名串
	$hmac = getReqHmacString($p2_Order,$p3_Amt,$p4_Cur,$p5_Pid,$p6_Pcat,$p7_Pdesc,$p8_Url,$pa_MP,$pd_FrpId,$pr_NeedResponse);

	echo "
		<html>
		<head>
		<title>To YeePay Page</title>
		</head>
		<body onload='document.yeepay.submit();'>
		<form name='yeepay' action='$reqURL_onLine' method='post'>
		<input type='hidden' name='p0_Cmd'					value='$p0_Cmd'>
		<input type='hidden' name='p1_MerId'				value='$p1_MerId'>
		<input type='hidden' name='p2_Order'				value='$p2_Order'>
		<input type='hidden' name='p3_Amt'					value='$p3_Amt'>
		<input type='hidden' name='p4_Cur'					value='$p4_Cur'>
		<input type='hidden' name='p5_Pid'					value='$p5_Pid'>
		<input type='hidden' name='p6_Pcat'					value='$p6_Pcat'>
		<input type='hidden' name='p7_Pdesc'				value='$p7_Pdesc'>
		<input type='hidden' name='p8_Url'					value='$p8_Url'>
		<input type='hidden' name='p9_SAF'					value='$p9_SAF'>
		<input type='hidden' name='pa_MP'						value='$pa_MP'>
		<input type='hidden' name='pd_FrpId'				value='$pd_FrpId'>
		<input type='hidden' name='pr_NeedResponse'	value='$pr_NeedResponse'>
		<input type='hidden' name='hmac'						value='$hmac'>
		</form>
		</body>
		</html>
	";
		exit;
}
	
#簽名函數生成簽名串
function getReqHmacString($p2_Order,$p3_Amt,$p4_Cur,$p5_Pid,$p6_Pcat,$p7_Pdesc,$p8_Url,$pa_MP,$pd_FrpId,$pr_NeedResponse)
{
  global $p0_Cmd;
  global $p9_SAF;
  
  //PHP168修改過
  global $p1_MerId,$merchantKey;
	//include 'merchantProperties.php';

		
	#進行簽名處理，一定按照文檔中標明的簽名順序進行
  $sbOld = "";
  #加入業務類型
  $sbOld = $sbOld.$p0_Cmd;
  #加入商戶編號
  $sbOld = $sbOld.$p1_MerId;
  #加入商戶訂單號
  $sbOld = $sbOld.$p2_Order;     
  #加入支付金額
  $sbOld = $sbOld.$p3_Amt;
  #加入交易幣種
  $sbOld = $sbOld.$p4_Cur;
  #加入商品名稱
  $sbOld = $sbOld.$p5_Pid;
  #加入商品分類
  $sbOld = $sbOld.$p6_Pcat;
  #加入商品描述
  $sbOld = $sbOld.$p7_Pdesc;
  #加入商戶接收支付succeed數據的地址
  $sbOld = $sbOld.$p8_Url;
  #加入送貨地址標識
  $sbOld = $sbOld.$p9_SAF;
  #加入商戶擴展信息
  $sbOld = $sbOld.$pa_MP;
  #加入銀行編碼
  $sbOld = $sbOld.$pd_FrpId;
  #加入是否需要應答機制
  $sbOld = $sbOld.$pr_NeedResponse;
  
  return HmacMd5($sbOld,$merchantKey);
  
} 

function getCallbackHmacString($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType)
{
  
  //PHP168修改過
  global $p1_MerId,$merchantKey;
	//include 'merchantProperties.php'
  
	#取得加密前的字符串
	$sbOld = "";
	#加入商家ID
	$sbOld = $sbOld.$p1_MerId;
	#加入消息類型
	$sbOld = $sbOld.$r0_Cmd;
	#加入業務返回碼
	$sbOld = $sbOld.$r1_Code;
	#加入交易ID
	$sbOld = $sbOld.$r2_TrxId;
	#加入交易金額
	$sbOld = $sbOld.$r3_Amt;
	#加入貨幣單位
	$sbOld = $sbOld.$r4_Cur;
	#加入產品Id
	$sbOld = $sbOld.$r5_Pid;
	#加入訂單ID
	$sbOld = $sbOld.$r6_Order;
	#加入用戶ID
	$sbOld = $sbOld.$r7_Uid;
	#加入商家擴展信息
	$sbOld = $sbOld.$r8_MP;
	#加入交易結果返回類型
	$sbOld = $sbOld.$r9_BType;

	return HmacMd5($sbOld,$merchantKey);

}


#	取得返回串中的所有參數
function getCallBackValue(&$r0_Cmd,&$r1_Code,&$r2_TrxId,&$r3_Amt,&$r4_Cur,&$r5_Pid,&$r6_Order,&$r7_Uid,&$r8_MP,&$r9_BType,&$hmac)
{  
	$r0_Cmd		= $_REQUEST['r0_Cmd'];
	$r1_Code	= $_REQUEST['r1_Code'];
	$r2_TrxId	= $_REQUEST['r2_TrxId'];
	$r3_Amt		= $_REQUEST['r3_Amt'];
	$r4_Cur		= $_REQUEST['r4_Cur'];
	$r5_Pid		= $_REQUEST['r5_Pid'];
	$r6_Order	= $_REQUEST['r6_Order'];
	$r7_Uid		= $_REQUEST['r7_Uid'];
	$r8_MP		= $_REQUEST['r8_MP'];
	$r9_BType	= $_REQUEST['r9_BType']; 
	$hmac			= $_REQUEST['hmac'];
	
	return null;
}

function CheckHmac($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType,$hmac)
{
	if($hmac==getCallbackHmacString($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType))
		return true;
	else
		return false;
}

function HmacMd5($data,$key)
{
	// RFC 2104 HMAC implementation for php.
	// Creates an md5 HMAC.
	// Eliminates the need to install mhash to compute a HMAC
	// Hacked by Lance Rushing(NOTE: Hacked means written)

	//需要配置環境支持iconv，否則中文參數不能正常處理
	$key = iconv("GB2312","UTF-8",$key);
	$data = iconv("GB2312","UTF-8",$data);

	$b = 64; // byte length for md5
	if (strlen($key) > $b) {
	$key = pack("H*",md5($key));
	}
	$key = str_pad($key, $b, chr(0x00));
	$ipad = str_pad('', $b, chr(0x36));
	$opad = str_pad('', $b, chr(0x5c));
	$k_ipad = $key ^ $ipad ;
	$k_opad = $key ^ $opad;

	return md5($k_opad . pack("H*",md5($k_ipad . $data)));
}

?>