<?php

/**
 * SKYUC! 快钱手机神州行支付插件
 * ============================================================================
 * 版权所有 (C) 2012 天空网络，并保留所有权利。
 * 网站地址: http://www.skyuc.com
 * ----------------------------------------------------------------------------
 * This is NOT a freeware, use is subject to license terms
 * ============================================================================
 */

if (! defined ( 'SKYUC_AREA' )) {
	echo 'SKYUC_AREA  must be defined to continue';
	exit ();
}

$payment_lang = DIR . '/languages/' . $GLOBALS['skyuc']->options ['lang'] . '/payment/kuaiqianszx.php';

if (is_file ( $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'] = 'shenzhou_desc';

	/* 是否支持实时开通 */
	$modules [$i] ['is_cod'] = '1';

	/* 是否支持在线支付 */
	$modules [$i] ['is_online'] = '1';

	/* 作者 */
	$modules [$i] ['author'] = '99bill.com';

	/* 网址 */
	$modules [$i] ['website'] = 'http://www.99bill.com';

	/* 版本号 */
	$modules [$i] ['version'] = '1.0.1';

	/* 配置信息 */
	$modules [$i] ['config'] = array (array ('name' => 'shenzhou_account', 'type' => 'text', 'value' => '' ), array ('name' => 'shenzhou_key', 'type' => 'text', 'value' => '' ) );

	return;

}

class shenzhou {
	/**
	 * 构造函数
	 *
	 * @access  public
	 * @param
	 *
	 * @return void
	 */
	public function __construct() {
	}

	/**
	 * 生成支付代码
	 * @param   array   $order  订单信息
	 * @param   array   $payment    支付方式信息
	 */
	public function get_code($order, $payment) {
		$merchant_acctid = trim ( $payment ['shenzhou_account'] ); //快钱神州行账号 不可空
		$key = trim ( $payment ['shenzhou_key'] ); //密钥 不可空
		$input_charset = 1; //字符集 默认1=utf-8
		$bg_url = '';
		$page_url = get_url () . 'respond.php';
		$version = 'v2.0';
		$language = 1;
		$sign_type = 1; //签名类型 不可空 固定值 1:md5
		$payer_name = '';
		$payer_contact_type = '';
		$payer_contact = '';
		$order_id = $order ['log_id']; //商户订单号 不可空
		$order_amount = $order ['pay_amount'] * 100; //商户订单金额 不可空
		$pay_type = '00'; //支付方式 不可空
		$card_number = '';
		$card_pwd = '';
		$full_amount_flag = '0';
		$order_time = skyuc_date ( 'YmdHis', $order ['add_time'] ); //商户订单提交时间 不可空 14位
		$product_name = '';
		$product_num = '';
		$product_id = '';
		$product_desc = '';
		$ext1 = 'shenzhou';
		$ext2 = 'skyuc';

		/* 生成加密签名串 请务必按照如下顺序和规则组成加密串！*/
		$signmsgval = '';
		$signmsgval = $this->append_param ( $signmsgval, "inputCharset", $input_charset );
		$signmsgval = $this->append_param ( $signmsgval, "bgUrl", $bg_url );
		$signmsgval = $this->append_param ( $signmsgval, "pageUrl", $page_url );
		$signmsgval = $this->append_param ( $signmsgval, "version", $version );
		$signmsgval = $this->append_param ( $signmsgval, "language", $language );
		$signmsgval = $this->append_param ( $signmsgval, "signType", $sign_type );
		$signmsgval = $this->append_param ( $signmsgval, "merchantAcctId", $merchant_acctid );
		$signmsgval = $this->append_param ( $signmsgval, "payerName", urlencode ( $payer_name ) );
		$signmsgval = $this->append_param ( $signmsgval, "payerContactType", $payer_contact_type );
		$signmsgval = $this->append_param ( $signmsgval, "payerContact", $payer_contact );
		$signmsgval = $this->append_param ( $signmsgval, "orderId", $order_id );
		$signmsgval = $this->append_param ( $signmsgval, "orderAmount", $order_amount );
		$signmsgval = $this->append_param ( $signmsgval, "payType", $pay_type );
		$signmsgval = $this->append_param ( $signmsgval, "cardNumber", $card_number );
		$signmsgval = $this->append_param ( $signmsgval, "cardPwd", $card_pwd );
		$signmsgval = $this->append_param ( $signmsgval, "fullAmountFlag", $full_amount_flag );
		$signmsgval = $this->append_param ( $signmsgval, "orderTime", $order_time );
		$signmsgval = $this->append_param ( $signmsgval, "productName", urlencode ( $product_name ) );
		$signmsgval = $this->append_param ( $signmsgval, "productNum", $product_num );
		$signmsgval = $this->append_param ( $signmsgval, "productId", $product_id );
		$signmsgval = $this->append_param ( $signmsgval, "productDesc", urlencode ( $product_desc ) );
		$signmsgval = $this->append_param ( $signmsgval, "ext1", urlencode ( $ext1 ) );
		$signmsgval = $this->append_param ( $signmsgval, "ext2", urlencode ( $ext2 ) );
		$signmsgval = $this->append_param ( $signmsgval, "key", $key );
		$sign_msg = strtoupper ( md5 ( $signmsgval ) ); //安全校验域 不可空


		$def_url = '<div style="text-align:center"><form name="kqPay" style="text-align:center;" method="post"' . 'action="https://www.99bill.com/szxgateway/recvMerchantInfoAction.htm" target="_blank">';
		$def_url .= "<input type= 'hidden' name='inputCharset' value='" . $input_charset . "' />";
		$def_url .= "<input type='hidden' name='bgUrl' value='" . $bg_url . "' />";
		$def_url .= "<input type='hidden' name='pageUrl' value='" . $page_url . "' />";
		$def_url .= "<input type='hidden' name='version' value='" . $version . "' />";
		$def_url .= "<input type='hidden' name='language' value='" . $language . "' />";
		$def_url .= "<input type='hidden' name='signType' value='" . $sign_type . "' />";
		$def_url .= "<input type='hidden' name='merchantAcctId' value='" . $merchant_acctid . "' />";
		$def_url .= "<input type='hidden' name='payerName' value='" . $payer_name . "' />";
		$def_url .= "<input type='hidden' name='payerContactType' value='" . $payer_contact_type . "' />";
		$def_url .= "<input type='hidden' name='payerContact' value='" . $payer_contact . "' />";
		$def_url .= "<input type='hidden' name='orderId' value='" . $order_id . "' />";
		$def_url .= "<input type='hidden' name='orderAmount' value='" . $order_amount . "' />";
		$def_url .= "<input type='hidden' name='payType' value='" . $pay_type . "' />";
		$def_url .= "<input type='hidden' name='cardNumber' value='" . $card_number . "' />";
		$def_url .= "<input type='hidden' name='cardPwd' value='" . $card_pwd . "' />";
		$def_url .= "<input type='hidden' name='fullAmountFlag' value='" . $full_amount_flag . "' />";
		$def_url .= "<input type='hidden' name='orderTime' value='" . $order_time . "' />";
		$def_url .= "<input type='hidden' name='productName' value='" . urlencode ( $product_name ) . "' />";
		$def_url .= "<input type='hidden' name='productNum' value='" . $product_num . "' />";
		$def_url .= "<input type='hidden' name='productId' value='" . $product_id . "' />";
		$def_url .= "<input type='hidden' name='productDesc' value='" . urlencode ( $product_desc ) . "' />";
		$def_url .= "<input type='hidden' name='ext1' value='" . urlencode ( $ext1 ) . "' />";
		$def_url .= "<input type='hidden' name='ext2' value='" . urlencode ( $ext2 ) . "' />";
		$def_url .= "<input type='hidden' name='signMsg' value='" . $sign_msg . "' />";
		$def_url .= "<input type='submit' name='submit' value='" . $GLOBALS ['_LANG'] ['pay_button'] . "' />";
		$def_url .= "</form></div><br />";

		return $def_url;
	}

	/**
	 * 响应操作
	 */
	public function respond() {
		$payment = get_payment ( basename ( __FILE__, '.php' ) );
		$merchant_acctid = $payment ['shenzhou_account']; //收款帐号 不可空
		$key = $payment ['shenzhou_key'];
		$get_merchant_acctid = trim ( $_REQUEST ['merchantAcctId'] ); //接收的收款帐号
		$pay_result = trim ( $_REQUEST ['payResult'] );
		$version = trim ( $_REQUEST ['version'] );
		$language = trim ( $_REQUEST ['language'] );
		$sign_type = trim ( $_REQUEST ['signType'] );
		$pay_type = trim ( $_REQUEST ['payType'] ); //20代表神州行卡密直接支付；22代表快钱账户神州行余额支付
		$card_umber = trim ( $_REQUEST ['cardNumber'] );
		$card_pwd = trim ( $_REQUEST ['cardPwd'] );
		$order_id = ( int ) trim ( $_REQUEST ['orderId'] ); //订单号
		$order_time = trim ( $_REQUEST ['orderTime'] );
		$order_amount = trim ( $_REQUEST ['orderAmount'] );
		$deal_id = trim ( $_REQUEST ['dealId'] ); //获取该交易在快钱的交易号
		$ext1 = trim ( $_REQUEST ['ext1'] );
		$ext2 = trim ( $_REQUEST ['ext2'] );
		$pay_amount = trim ( $_REQUEST ['payAmount'] ); //获取实际支付金额
		$bill_order_time = trim ( $_REQUEST ['billOrderTime'] );
		$pay_result = trim ( $_REQUEST ['payResult'] ); //10代表支付成功； 11代表支付失败
		$sign_type = trim ( $_REQUEST ['signType'] );
		$sign_msg = trim ( $_REQUEST ['signMsg'] );

		//生成加密串。必须保持如下顺序。
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "merchantAcctId", $merchant_acctid );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "version", $version );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "language", $language );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "payType", $pay_type );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "cardNumber", $card_number );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "cardPwd", $card_pwd );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "orderId", $order_id );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "orderAmount", $order_amount );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "dealId", $deal_id );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "orderTime", $order_time );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "ext1", $ext1 );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "ext2", $ext2 );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "payAmount", $pay_amount );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "billOrderTime", $bill_order_time );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "payResult", $pay_result );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "signType", $sign_type );
		$merchant_signmsgval = $this->append_param ( $merchant_signmsgval, "key", $key );
		$merchant_signmsg = md5 ( $merchant_signmsgval );

		//首先对获得的商户号进行比对
		if ($get_merchant_acctid != $merchant_acctid) {
			//'商户号错误';
			return false;
		}

		if (strtoupper ( $sign_msg ) == strtoupper ( $merchant_signmsg )) {
			if ($pay_result == 10) //有成功支付的结果返回10
{
				order_paid ( $order_id );

				return true;
			} elseif ($pay_result == 11 && $pay_amount > 0) {
				$sql = 'SELECT order_amount FROM ' . TABLE_PREFIX . 'order_info' . " WHERE order_id = '$order_id'";
				$order_info = $GLOBALS ['db']->query_first ( $sql );
				$get_order_amount = $order_info ['order_amount'];
				if ($get_order_amount == $pay_amount && $get_order_amount == $order_amount) //检查订单金额、实际支付金额和订单是否相等
{
					order_paid ( $order_id );

					return true;
				} elseif ($get_order_amount == $order_amount && $pay_amount > 0) //订单金额相等 实际支付金额 > 0的情况
{
					$surplus_amount = $get_order_amount - $pay_amount; //计算订单剩余金额
					$sql = 'UPDATE' . TABLE_PREFIX . 'order_info' . " SET `money_paid` = (money_paid  + '$pay_amount')," . " order_amount = (order_amount - '$pay_amount') WHERE order_id = '$order_id'";
					$result = $GLOBALS ['db']->query ( $sql );
					$sql = 'UPDATE' . TABLE_PREFIX . 'order_info' . " SET `order_status` ='" . OS_CONFIRMED . "' WHERE order_id = '$orderId'";
					$result = $GLOBALS ['db']->query ( $sql );
					//order_paid($orderId, PS_UNPAYED);
					//'订单金额小于0';
					return false;
				} else {
					//'订单金额不相等';
					return false;
				}
			} else {
				//'实际支付金额不能小于0';
				return false;
			}
		} else {
			//'签名校对错误';
			return false;
		}
	}

	/**
	 * 将变量值不为空的参数组成字符串
	 * @param   string   $strs  参数字符串
	 * @param   string   $key   参数键名
	 * @param   string   $val   参数键对应值
	 */
	public function append_param($strs, $key, $val) {
		if ($strs != "") {
			if ($val != "") {
				$strs .= '&' . $key . '=' . $val;
			}
		} else {
			if ($val != "") {
				$strs = $key . '=' . $val;
			}
		}

		return $strs;
	}
}

?>