<?php
/**
  * @method 支付宝api
  * @author soul
  * @copyright 2016/3/31
  */
class MainAliPay extends MainBase
{
	/**阿里支付对象**/
	private function getAlipayObj()
	{
		require_once mvc::$cfg['AUTOLOAD']['Main']['path']."alipay/AopSdk.php"; 
		$aop = new AopClient ();  
		$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';  
		$aop->appId = mvc::$cfg['ALIPAY']['appId'];  
		$aop->rsaPrivateKey = mvc::$cfg['ALIPAY']['privatekey'];  
		$aop->alipayrsaPublicKey = mvc::$cfg['ALIPAY']['publickey'];
		$aop->apiVersion = '1.0';  
		$aop->signType = 'RSA2';  
		$aop->postCharset= 'UTF-8';  
		$aop->format='json';
		return $aop;
	}

	/**
	  * @method 支付宝接口调取
	  * @param  $apiCode 接口名称
	  * @param  $bizArr 接口需要的数据
	  * @param  $dataArr 其它参数 默认为空  ['setReturnUrl'=>'', 'setNotifyUrl'=>'']
	  * @param  $ignoreErr  默认有错必报
	  * @author soul
	  * @copyright 2017/8/16
	  * @return
			成功：['status'=>true, 'data'=>接口返回的结果]
			失败：['status'=>false, 'data'=>'xxx', 'code'=>'xxx']
	  */
	public function getApi($apiCode, $bizArr, $dataArr = [], $errorStop = true)
	{
		$aop = $this->getAlipayObj();
		$request = new $apiCode ();

		//特殊参数
		foreach($dataArr as $k=>$v)
		{
			if($v == '') continue;
			switch($k)
			{
				case 'setReturnUrl': $request->setReturnUrl($v); break;
				case 'setNotifyUrl': $request->setNotifyUrl($v); break;
			}
		}
		$request->setBizContent(json_encode($bizArr));
		switch($apiCode)
		{
			case 'AlipayTradeAppPayRequest':
				$response = $aop->sdkExecute($request);
				$arr = ['pay_form'=>base64_encode($response)];
				return LibFc::ReturnData(true, $arr);
			break;
			case 'AlipayTradePagePayRequest':
				$result = $aop->pageExecute($request);
				$arr = ['pay_form'=>base64_encode(str_replace('<form', '<form target="_blank"', $result))];
				return LibFc::ReturnData(true, $arr);
			break;
			//其它特殊接口
		}
		$result = $aop->execute ( $request); 
		$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
		$resultArr = json_decode(json_encode($result->$responseNode), true);
		if(!$errorStop || (!empty($resultArr['code']) && $resultArr['code'] == 10000))
		{
			return LibFc::ReturnData(true, $resultArr);
		} 
		else 
		{
			return LibFc::ReturnData(false, $resultArr['sub_msg'], $resultArr['sub_code']);
		}
	}


	/**
	  * @method 获取阿里支付订单的信息
	  * @param  $tradeNo 付款代码
	  * @param  $type transaction_id || out_trade_no
	  * @author soul
	  * @copyright 2017/8/16
	  * @return
			成功：['status'=>true, 'data'=>['por_id'=>, 'por_status'=>, 'por_pay_time'=>]]
			失败：['status'=>false, 'data'=>'xxx', 'code'=>'xxx']
	  */
	public function getAliPayOrder($tradeNo, $type = 'transaction_id')
	{
		//query:{"appid":"wx0f4101f7c0262758","attach":[],"bank_type":"CITIC_CREDIT","cash_fee":"1","fee_type":"CNY","is_subscribe":"Y","mch_id":"1425099302","nonce_str":"IXvNCRk38gFdj2Fy","openid":"owl8Js8Cyr0AgLIkqeNIRhcBcF94","out_trade_no":"500028","result_code":"SUCCESS","return_code":"SUCCESS","return_msg":"OK","sign":"C63252151CE509BF8AF4697DB6B7B3CE","time_end":"20170817160314","total_fee":"1","trade_state":"SUCCESS","trade_type":"NATIVE","transaction_id":"4003352001201708176720013713"}
		$result = [];
		switch($type)
		{
			case 'out_trade_no': 
				$bizArr = ['out_trade_no'=>$tradeNo];
			break;
			case 'transaction_id': 
				$bizArr = ['trade_no'=>$tradeNo];
			break;
		}
		$res = $this->getApi('AlipayTradeQueryRequest', $bizArr, [], false);
		$result = $res['data'];
		if(!empty($result['code']) && $result['code'] == 10000)
		{
			switch($result['trade_status'])
			{
				case 'TRADE_SUCCESS':
					//成功支付 通过out_trade_no 修改订单状态
					$setArr = [
						'por_status' => 1,
						'por_transaction_id' => $result['trade_no'],
						'por_pay_time' => strtotime($result['send_pay_date']),
						'por_payjson' => LibFc::jsonEncode($result),
						'por_check_by' => '系统',
						'por_check_time' => time(),
						'por_money' => sprintf('%.2f', $result['total_amount']),
						'por_return_etime' => 0
					];
					$this->set('pa_order', $setArr, sprintf(" AND por_trade_no='%s'", LibFc::Escape($result['out_trade_no'])));
					$result['por_status'] = 1;
				break;
				case 'TRADE_CLOSED':
					$setArr = [
						'por_status' => -1,
						'por_payjson' => LibFc::jsonEncode($result),
						'por_return_etime' => 0
					];
					$this->set('pa_order', $setArr, sprintf(" AND por_trade_no='%s'", LibFc::Escape($result['out_trade_no'])));
					$result['por_status'] = -1;
				break;
			}
		}
		return LibFc::ReturnData(true, $result);
	}


	/**
	  * @method 关闭支付宝的支付订单
	  * @param  $out_trade_no 微信平台out_trade_no
	  * @author soul
	  * @copyright 2017/8/16
	  * @return
			成功：['status'=>true, 'data'=>[]]
			失败：['status'=>false, 'data'=>'xxx', 'code'=>'xxx']
	  */
	public function closeAliPay($out_trade_no)
	{
		$bizArr = ['out_trade_no'=>$out_trade_no];
		$res = $this->getApi('AlipayTradeCloseRequest', $bizArr, [], false);
		$result = $res['data'];
		if($result['sub_code'] == 'ACQ.TRADE_NOT_EXIST' || $result['code'] == 10000)
		{
			return LibFc::ReturnData(true);
		}
		else
		{
			return LibFc::ReturnData(false, $resultArr['sub_msg'], $resultArr['sub_code']);
		}
	}
}