<?php
namespace wstmart\mobile\controller;
use think\Loader;
use wstmart\common\model\Payments as M;
use wstmart\mobile\model\Orders as OM;
use wstmart\common\model\LogPayParams as PM;
use wstmart\common\model\ChargeItems as CM;
use wstmart\common\model\LogMoneys as LM;
/**
 * ============================================================================
 * 阿里支付控制器
 */
class Alipays extends Base{

	/**
	 * 初始化
	 */
	private $alipayConfig;
	public function _initialize() {
		header ("Content-type: text/html; charset=utf-8");
		Loader::import ( 'alipay.Corefunction' );
    	Loader::import ( 'alipay.Md5function' );
    	Loader::import ( 'alipay.AlipayNotify' );
    	Loader::import ( 'alipay.AlipaySubmit' );
    	$m = new M();
    	$payment = $m->getPayment("alipays");
    	$this->alipayConfig = array(
    			'partner' =>$payment['parterID'],   //这里是你在成功申请支付宝接口后获取到的PID;
    			'key'=>$payment['parterKey'],//这里是你在成功申请支付宝接口后获取到的Key
    			'seller_email'=>$payment['payAccount'],
    			'sign_type'=>strtoupper('MD5'),
    			'input_charset'=> strtolower('utf-8'),
    			'cacert'=>'',
    			'transport'=> 'http'
    	);
	}
	
    /**
     * 支付宝支付跳转方法
     */
    public function toAliPay(){

    	$payObj = input("payObj/s");
    
    	$call_back_url = "";
    	$notify_url = "";
    	$subject = "";
    	$total_fee = 0;
    	$transId = 0;
    	$userId = 0;
    	$payParams = array();
    	if($payObj=="recharge"){//充值
    		$itemId = (int)input("itemId/d");
			$orderAmount = 0;
			if($itemId>0){
                $cm = new CM();
				$item = $cm->getItemMoney($itemId);
				$total_fee = isSet($item["chargeMoney"])?$item["chargeMoney"]:0;
			}else{
				$total_fee = (int)input("needPay/d");
			}
			
    		$shopId = (int)session('WST_USER.shopId');
    		$targetType = ($shopId>0)?1:0;
			$targetId = (int)session('WST_USER.userId');
			if($targetType==1){//商家
				$targetId = $shopId;
			}
			$userId = $targetId;
			$out_trade_no = WSTOrderNo();
			$transId = $out_trade_no;
			$payParams["targetId"] = $targetId;
			$payParams["targetType"] = $targetType;
			$payParams["itemId"] = $itemId;
			$payParams["payObj"] = $payObj;
			
			$call_back_url = url("mobile/users/index","",true,true);
	    	$notify_url = url("mobile/alipays/aliNotify","",true,true);
	    	$subject = '钱包充值';
    	}else{
    		$orderNo = input('orderNo');
	    	$isBatch = (int)input('isBatch');
	    	$userId = (int)session('WST_USER.userId');
	    	$m = new OM();
			$obj = array();
			$obj["userId"] = $userId;
			$obj["orderNo"] = input("orderNo/s");
			$obj["isBatch"] = (int)input("isBatch/d");
	    	$rs = $m->getOrderPayInfo($obj);
	    	if(empty($rs)){
	    		$this->assign('type','');
	    		return $this->fetch("users/orders/orders_list");
	    	}else{
		    	$m = new M();
		    	$om = new OM();
				$data = $om->checkOrderPay($obj);
		    	if($data["status"]==-1){
		    		echo "<span style='font-size:40px;'>您的订单已支付,不要重复支付!</span>";
		    		return;
		    	}else if($data["status"]==-2){
		    		echo "<span style='font-size:40px;'>您的订单因商品库存不足,不能支付!</span>";
		    		return;
		    	}
	    	}
	    	$order = $om->getPayOrders($obj);
	    	$total_fee = $order["needPay"];
	    	$payRand = $order["payRand"];
	    	$out_trade_no = $obj["orderNo"]."a".$payRand;
	    	$transId = $obj["orderNo"];
	    	
	    	$payParams["userId"] = $userId;
	    	$payParams["isBatch"] = $isBatch;
	    	$payParams["orderNo"] = $orderNo;
	    	
	    	$call_back_url = url("mobile/orders/index","",true,true);
	    	$notify_url = url("mobile/alipays/aliNotify","",true,true);
	    	$subject = '支付购买商品费用';
    	}
    	
    	$format = "xml";
    	$v = "2.0";
    	$req_id = date('Ymdhis');
    	$merchant_url = "";
    	$seller_email = $this->alipayConfig['seller_email'];
    	
    	$req_data = '<direct_trade_create_req><notify_url>' . $notify_url . '</notify_url><call_back_url>' . $call_back_url . '</call_back_url><seller_account_name>' . $seller_email . '</seller_account_name><out_trade_no>' . $out_trade_no . '</out_trade_no><subject>' . $subject . '</subject><total_fee>' . $total_fee . '</total_fee><merchant_url>' . $merchant_url . '</merchant_url></direct_trade_create_req>';
    
    	//构造要请求的参数数组,无需改动
    	$para_token = array(
    		"service" => "alipay.wap.trade.create.direct",
    		"partner" => trim($this->alipayConfig['partner']),
    		"sec_id" => trim($this->alipayConfig['sign_type']),
    		"format"	=> $format,
    		"v"	=> $v,
    		"req_id"	=> $req_id,
    		"req_data"	=> $req_data,
    		"_input_charset"	=> trim(strtolower($this->alipayConfig['input_charset']))
    	);
    	//建立请求
    	$alipaySubmit = new \AlipaySubmit($this->alipayConfig);
    	$html_text = $alipaySubmit->buildRequestHttp($para_token);
    	//URLDECODE返回的信息
    	$html_text = urldecode($html_text);
    	//解析远程模拟提交后返回的信息
    	$para_html_text = $alipaySubmit->parseResponse($html_text);
    	//获取request_token
    	$request_token = $para_html_text['request_token'];
    	//**************************根据授权码token调用交易接口alipay.wap.auth.authAndExecute**************************
    	//业务详细
    	$req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';
    	//必填

    	//构造要请求的参数数组,无需改动
    	$parameter = array(
    		"service" => "alipay.wap.auth.authAndExecute",
    		"partner" => trim($this->alipayConfig['partner']),
    		"sec_id" => trim($this->alipayConfig['sign_type']),
    		"format"	=> $format,
    		"v"	=> $v,
    		"req_id"	=> $req_id,
    		"req_data"	=> $req_data,
    		"_input_charset"	=> trim(strtolower($this->alipayConfig['input_charset']))
    	);
    	
    	$data = array();
    	$data["userId"] = $userId;
    	$data["transId"] = $transId;
    	$data["paramsVa"] = json_encode($payParams);
    	$data["payFrom"] = 'alipays';
    	$m = new PM();
    	$m->addPayLog($data);
    	
    	//建立请求
    	$alipaySubmit = new \AlipaySubmit($this->alipayConfig);
    	$html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '');
    	echo $html_text;
    }
    
    /**
     * 服务器异步通知页面方法
     *
     */
    function aliNotify() {
    	$om = new OM();
    	// 计算得出通知验证结果
    	$alipayNotify = new \AlipayNotify ( $this->alipayConfig );
    	$verify_result = $alipayNotify->verifyNotify ();
    	
    	if ($verify_result) {
    		$notify_data = $_POST['notify_data'];
    		// 获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
    		// 解析notify_data
    		// 注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
    		$doc = new \DOMDocument ();
    		$doc->loadXML ( $notify_data );
    		if (! empty ( $doc->getElementsByTagName ( "notify" )->item ( 0 )->nodeValue )) {
    			// 交易号
    			$trade_no = $doc->getElementsByTagName ( "trade_no" )->item ( 0 )->nodeValue;
    			// 商户订单号
    			$out_trade_no = $doc->getElementsByTagName ( "out_trade_no" )->item ( 0 )->nodeValue;
    
    			$total_fee = $doc->getElementsByTagName( "total_fee" )->item(0)->nodeValue;
    			// 支付宝交易号
    			$trade_no = $doc->getElementsByTagName ( "trade_no" )->item ( 0 )->nodeValue;
    			// 交易状态
    			$trade_status = $doc->getElementsByTagName ( "trade_status" )->item ( 0 )->nodeValue;
    			if ($trade_status == 'TRADE_FINISHED' OR $trade_status  == 'TRADE_SUCCESS') {
    				$obj["trade_no"] = $trade_no;
    				$tradeNo = explode("a",$out_trade_no);
    				
      				$obj["out_trade_no"] = $tradeNo[0];
      				$obj["payFrom"] = 'alipays';
      				$obj["total_fee"] = $total_fee;
      				
      				$m = new PM();
      				$payParams = $m->getPayLog(["transId"=>$obj["out_trade_no"]]);
      				if(isSet($payParams["payObj"]) && $payParams["payObj"]=='recharge'){

						$obj["targetId"] = $payParams["targetId"];
						$obj["targetType"] = $payParams["targetType"];
						$obj["itemId"] = $payParams["itemId"];;
						// 支付成功业务逻辑
						$m = new LM();
						$rs = $m->complateRecharge ( $obj );
      				}else{
      					//$payFrom = $om->getOrderPayFrom($tradeNo[0]);
      					$obj["userId"] = $payParams["userId"];
      					$obj["isBatch"] = $payParams["isBatch"];
      					//支付成功业务逻辑
      					$rs = $om->complatePay($obj);
      				}

    				if($rs["status"]==1){
    					echo 'success';
    				}else{
    					echo 'fail';
    				}
    			}
    			//echo "success"; // 请不要修改或删除
    		}
    	} else {
    		// 验证失败
    		echo "fail";
    	}
    }

}