<?php namespace Pay\Lib;
use Dever;
Dever::apply('sdk/cmbc', 'pay');

class Cmbc extends Core
{
	public function __construct($config)
	{
		$project = Dever::project('pay');
		$this->config = new \Cmbc\Setting();
		# 通知接口
		$config['notify'] = $this->url($config['type'], $config['id']);
		# 证书
		$config['ssl'] = array
		(
			'cert' => $config['file_cert'],
			'key' => $config['file_key'],
		);

		$this->config->set($config['appid'], $config['appsecret'], $config['mchid'], $config['notify'], $config['key'], $config['ssl'], $config['type'], $config['timeout']);
	}

	/**
	 * 通知
	 */
	public function notify()
	{
		$input = file_get_contents("php://input");
		if ($input) {
			parse_str($input, $input);
		} else {
			$input = Dever::input();
		}
		$this->log('支付回调-初始化', $input);
		
		$tools = new \Cmbc\Handle();
		$callback = $tools->get('notify', $this->config);
		$result = $callback->request($input, $this);
		if ($result) {
			$this->log('支付回调-获取数据', $result);
			$this->updateOrder($result['mhtOrderNo'], $result['mhtOrderAmt']);
			echo 'success=Y';die;
		} else {
			echo 'success=N';die;
		}
	}

	/**
	 * 获取统一下单的基本信息
	 */
	public function order($account_id, $project_id, $uid, $username, $product_id, $name, $cash, $openid = false, $type = 1, $order_id = false, $other = false, $refer = false)
	{
		$trade_type = $this->getType($type);
		$order_id = $this->createOrder($uid, $username, $account_id, $project_id, $product_id, $name, $cash, $this->config->GetType(), $order_id);

		$tools = new \Cmbc\Handle();

		$order = $tools->get('order', $this->config);

		$request['mhtOrderNo'] = $order_id;
		$request['mhtOrderName'] = $name;
		$request['mhtOrderAmt'] = $cash * 100;
		$request['mhtOrderDetail'] = $name;
		$request['mhtOrderStartTime'] = date("YmdHis");
		$request['notifyUrl'] = $this->config->getNotifyUrl();
		$request['outputType'] = 1;
		if (!$openid) {
			$request['consumerId'] = 'ofBUV0RUoy_8C4VctZjrSDGzhUfY';
		} else {
			$request['consumerId'] = $openid;
		}
		
		$result = $order->request($request);
		$this->updateOrderParam($order_id, $result);
		return $result;
	}

	/**
	 * 获取二维码支付
	 */
	public function qrcode($order, $refer)
	{
		$notify = new \NativePay();
		$result = $notify->GetPayUrl($order);
		$url = $result['code_url'];
		return array
		(
			'url' => $url,
			'type' => 'qrcode',
		);
		return $url;
	}

	/**
	 * 获取小程序支付
	 */
	public function applet($order)
	{
		$result = array();
		if (isset($order['prepay_id'])) {
			$result['time'] = $order['timeStamp'];
			$result['nonce_str'] = $order['nonceStr'];
			$result['prepay_id'] = $order['prepay_id'];
			$result['sign_type'] = $order['signType'];
			$result['sign'] = $order['paySign'];
			$result['type'] = 'applet';
		}
		return $result;
	}


	/**
	 * 获取页面支付
	 */
	public function page($order, $refer)
	{
		$refer = urldecode($refer);
		$tools = new \JsApiPay($this->config);
		$info = $tools->GetJsApiParameters($order);

		$html = '<script type="text/javascript">
		function jsApiCall()
		{
			WeixinJSBridge.invoke(
				"getBrandWCPayRequest",
				'.$info.',
				function(res){
					//WeixinJSBridge.log(res.err_msg);
					if(res.err_msg == "get_brand_wcpay_request:ok")
					{
						location.href = "'.$refer.'";
					} else {
						alert(res.err_code+res.err_desc+res.err_msg);
					}
				}
			);
		}

		function callpay()
		{
			if (typeof WeixinJSBridge == "undefined"){
			    if( document.addEventListener ){
			        document.addEventListener("WeixinJSBridgeReady", jsApiCall, false);
			    }else if (document.attachEvent){
			        document.attachEvent("WeixinJSBridgeReady", jsApiCall); 
			        document.attachEvent("onWeixinJSBridgeReady", jsApiCall);
			    }
			}else{
			    jsApiCall();
			}
		}
		callpay();
		</script>';

		return $html;
	}

	private function getType($type)
	{
		switch ($type) {
			case 1:
				$type = 'JSAPI';
				break;
			
			case 2:
				$type = 'NATIVE';
				break;

			case 3:
				$type = 'APP';
				break;

			case 4:
				$type = 'MWEB';
				break;
		}

		return $type;
	}
}