<?php
/**
 * 支付宝接口类库   
 */
header("Content-Type: text/html;charset=utf-8");
defined('IN_YUNYECMS') or exit('No permission.');
core::load_class('base',false);
core::load_fun('content');
core::load_fun('tree');
core::load_fun('shop');
class alipay extends base {
	    public $db;
       //在类初始化方法中，引入相关类库    
		function __construct() {
		 $this->db = core::load_model('content_model');
		 parent::__construct();
		 islogin(); 
			include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'core.php'; 
			include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'md5.php'; 
			include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'notify.php'; 
			include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'submit.php'; 
		 }
    //doalipay方法
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来  然后进行相关处理
        */
	
    public function doalipay(){
            /*********************************************************
            把alipayapi.php中复制过来的如下两段代码去掉，
            第一段是引入配置项，
            第二段是引入submit.class.php这个类。
           为什么要去掉？？
            第一，配置项的内容已经在项目的Config.php文件中进行了配置，我们只需用C函数进行调用即可；
            第二，这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入；所以这里不再需要；
            *****************************************************/
       // require_once("alipay.config.php");
       // require_once("lib/alipay_submit.class.php");
       
       //这里我们通过TP的C函数把配置项参数读出，赋给$alipay_config；
		include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
		$alipaycfg=$this->cfg;
		$alipaycfg=$alipaycfg['alipay'];
		$alipay_config['partner']=$alipaycfg['partner'];
		$alipay_config['key']=$alipaycfg['key'];
		$alipay_config['seller_id']=$alipaycfg['partner'];
        /**************************请求参数**************************/
        $notify_url = "http://".SITE_URL."/core/extend/alipay/shop_notify_url.php"; //服务器异步通知页面路径
        $return_url = "http://".SITE_URL.url("shop/alipay/returnurl"); //页面跳转同步通知页面路径
        //商户订单号，商户网站订单系统中唯一订单号，必填
        $out_trade_no = $_POST['WIDout_trade_no'];
        //订单名称，必填
        $subject = $_POST['WIDsubject'];
        //付款金额，必填
        $total_fee = $_POST['WIDtotal_fee'];
        //商品描述，可空
        $body = $_POST['WIDbody'];	
		if(!empty($out_trade_no)){
	      $strsql="select * from `#yunyecms_orders` where sn='{$out_trade_no}'";
          $cur= $this->db->find($strsql);
		}
		$money=$cur["money"];
		if($total_fee!=$money){
		   messagebox(Lan('goods_parm_error'),$_SERVER['HTTP_REFERER']);
		}
		
	/************************************************************/

//构造要请求的参数数组，无需改动
$parameter = array(
		"service"       => $alipay_config['service'],
		"partner"       => $alipay_config['partner'],
		"seller_id"  => $alipay_config['seller_id'],
		"payment_type"	=> $alipay_config['payment_type'],
		"notify_url"	=> $notify_url,
		"return_url"	=> $return_url,
		"anti_phishing_key"=>$alipay_config['anti_phishing_key'],
		"exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
		"out_trade_no"	=> $out_trade_no,
		"subject"	=> $subject,
		"total_fee"	=> $total_fee,
		"body"	=> $body,
		"_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
		//其他业务参数根据在线开发文档，添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
        //如"参数名"=>"参数值"
);
        //建立请求
		
			$alipaySubmit = new AlipaySubmit($alipay_config);
			$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
			echo $html_text;
    }	
	
	
    
        /******************************
        服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
        *******************************/
	
	function notifyurl(){
		    include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
		//计算得出通知验证结果
			$alipayNotify = new AlipayNotify($alipay_config);
			$verify_result = $alipayNotify->verifyNotify();

			if($verify_result) {//验证成功
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代
				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
				//商户订单号
				$out_trade_no = $_POST['out_trade_no'];
				//支付宝交易号
				$trade_no = $_POST['trade_no'];
				//交易状态
				$trade_status = $_POST['trade_status'];
				if($_POST['trade_status'] == 'TRADE_FINISHED') {
				
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
						//如果有做过处理，不执行商户的业务程序

					//注意：
					//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知

					//调试用，写文本函数记录程序运行情况是否正常
					//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
				}
				else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
	            $cur=$this->db->find("select * from `#yunyecms_orders` where sn='{$out_trade_no}'");
				  if($cur['status']==0){
						$strsql="update `#yunyecms_orders`  set  status=1,trade_no='".$trade_no."'  where  sn='".$out_trade_no."'";
						$this->db->query($strsql);
				   }
				   $phone=$cur['phone'];
				   $signName="云业汇";   
				   $templateCode="SMS_78745166"; 
				   $phoneNumbers=$phone;
				   $templateParam=Array(  // 短信模板中字段的值
				   "sn"=>$out_trade_no
					 );	
				   sendsms($signName,$templateCode, $phoneNumbers,$templateParam); 
					//判断该笔订单是否在商户网站中已经做过处理
						//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
						//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
						//如果有做过处理，不执行商户的业务程序
					//注意：
					//付款完成后，支付宝系统发送该交易状态通知
					//调试用，写文本函数记录程序运行情况是否正常
					//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
				}
				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				echo "success";		//请不要修改或删除

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			}
			else {
				//验证失败
				echo "fail";

				//调试用，写文本函数记录程序运行情况是否正常
				//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
			}
	}
	
	function returnurl(){
		$cfg=$this->cfg;
		$lang=$this->lang; 
	    islogin();
		$userid=usafestr(yunyecms_strdecode(ugetcookie("userid")));
        $breadcumb=array('0'=>array('title'=>Lan('member_center'),'url'=>url("member/member/index")),
              '1'=>array('title'=>Lan('pay_success'),'url'=>url("shop/alipay/returnurl"))
			);			
		include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
		$alipayNotify = new AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyReturn();
		if($verify_result) {//验证成功
			//请在这里加上商户的业务逻辑程序代码
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
			//商户订单号
			$out_trade_no = $_GET['out_trade_no'];
			//支付宝交易号
			$trade_no = $_GET['trade_no'];
			//交易状态
			$trade_status = $_GET['trade_status'];
			if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
			}
			else {
			  echo "trade_status=".$_GET['trade_status'];
			}
			 include tpl('returnurl','shop');
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
			//验证失败
			//如要调试，请看alipay_notify.php页面的verifyReturn函数
			 include tpl('returnurl','shop');

		}
		
		
		
	}
	

	
	public function memberalipay(){
		/*********************************************************
		把alipayapi.php中复制过来的如下两段代码去掉，
		第一段是引入配置项，
		第二段是引入submit.class.php这个类。
	   为什么要去掉？？
		第一，配置项的内容已经在项目的Config.php文件中进行了配置，我们只需用C函数进行调用即可；
		第二，这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入；所以这里不再需要；
		*****************************************************/
   // require_once("alipay.config.php");
   // require_once("lib/alipay_submit.class.php");
   
   //这里我们通过TP的C函数把配置项参数读出，赋给$alipay_config；
	include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
	$alipaycfg=$this->cfg;
	$alipaycfg=$alipaycfg['alipay'];
	$alipay_config['partner']=$alipaycfg['partner'];
	$alipay_config['key']=$alipaycfg['key'];
	$alipay_config['seller_id']=$alipaycfg['partner'];
	
	/**************************请求参数**************************/
	$notify_url = "http://".SITE_URL."/core/extend/alipay/notify_url.php"; //服务器异步通知页面路径
	$return_url = "http://".SITE_URL.url("shop/alipay/mem_returnurl"); //页面跳转同步通知页面路径
//商户订单号，商户网站订单系统中唯一订单号，必填
	$out_trade_no = $_POST['WIDout_trade_no'];
	//订单名称，必填
	$subject = $_POST['WIDsubject'];
	//付款金额，必填
	$total_fee = $_POST['WIDtotal_fee'];
	//商品描述，可空
	$body = $_POST['WIDbody'];	
	if(!empty($out_trade_no)){
	  $strsql="select * from `#yunyecms_membergroup_orders` where sn='{$out_trade_no}'";
	  $cur= $this->db->find($strsql);
	}
	$money=$cur["money"];
	if($total_fee!=$money){
	   messagebox(Lan('goods_parm_error'),$_SERVER['HTTP_REFERER']);		
	}
	
/************************************************************/
//构造要请求的参数数组，无需改动
$parameter = array(
	"service"       => $alipay_config['service'],
	"partner"       => $alipay_config['partner'],
	"seller_id"  => $alipay_config['seller_id'],
	"payment_type"	=> $alipay_config['payment_type'],
	"notify_url"	=> $notify_url,
	"return_url"	=> $return_url,
	"anti_phishing_key"=>$alipay_config['anti_phishing_key'],
	"exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
	"out_trade_no"	=> $out_trade_no,
	"subject"	=> $subject,
	"total_fee"	=> $total_fee,
	"body"	=> $body,
	"_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
	//其他业务参数根据在线开发文档，添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
	//如"参数名"=>"参数值"
);
	//建立请求
	
		$alipaySubmit = new AlipaySubmit($alipay_config);
		$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
		echo $html_text;
}	
	
function mem_notifyurl(){
		islogin();
		$userid=ugetcookie("userid");
		logResult("adfsfsfdfsdfsdsdf");
		include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
		//计算得出通知验证结果
		$alipayNotify = new AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyNotify();
		if($verify_result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			//商户订单号
			$out_trade_no = $_POST['out_trade_no'];
			//支付宝交易号
			$trade_no = $_POST['trade_no'];
			//交易状态
			$trade_status = $_POST['trade_status'];
			logResult("trade_status=$trade_status");
			if($_POST['trade_status'] == 'TRADE_FINISHED') {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
					//如果有做过处理，不执行商户的业务程序

				//注意：
				//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
				//调试用，写文本函数记录程序运行情况是否正常
				//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
			}
			else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
			 $cur=$this->db->find("select * from `#yunyehui_membergroup_orders` where sn='{$out_trade_no}'");
			 if($cur['status']==0){
					$strsql="update `#yunyehui_membergroup_orders`  set  status=1,trade_no='".$trade_no."'  where  sn='".$out_trade_no."'";
					$this->db->query($strsql);
			   }
	/*		   $phone=$cur['phone'];
			   $signName="云业汇";   
			   $templateCode="SMS_78745166"; 
			   $phoneNumbers=$phone;
			   $templateParam=Array(  // 短信模板中字段的值
			   "sn"=>$out_trade_no
				 );
			   sendsms($signName,$templateCode, $phoneNumbers,$templateParam); */
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
					//如果有做过处理，不执行商户的业务程序
				//注意：
				//付款完成后，支付宝系统发送该交易状态通知
				//调试用，写文本函数记录程序运行情况是否正常
				logResult($cur['status'].$out_trade_no);
			}
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			echo "success";		//请不要修改或删除

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
			//验证失败
			echo "fail";
			logResult("fail-{$verify_result}");
			//调试用，写文本函数记录程序运行情况是否正常
			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
		}
}

function mem_returnurl(){
	$cfg=$this->cfg;
	$lang=$this->lang; 
	islogin();
	$userid=ugetcookie("userid");
	$breadcumb=array('0'=>array('title'=>Lan('member_center'),'url'=>url("member/member/index")),
		  '1'=>array('title'=>Lan('pay_success'),'url'=>url("member/membergroup_goods/returnurl"))
		);			
	include_once YUNYECMS_CORE.'extend'.DIRECTORY_SEPARATOR.'alipay'.DIRECTORY_SEPARATOR.'alipay.config.php'; 
	$alipayNotify = new AlipayNotify($alipay_config);
	$verify_result = $alipayNotify->verifyReturn();
	if($verify_result) {//验证成功
		//请在这里加上商户的业务逻辑程序代码
		//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
		//商户订单号
		$out_trade_no = $_GET['out_trade_no'];
		//支付宝交易号
		$trade_no = $_GET['trade_no'];
		//交易状态
		$trade_status = $_GET['trade_status'];
		if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
			//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序
		}
		else {
		    echo "trade_status=".$_GET['trade_status'];
		 }
		 include tpl('returnurl','member');
		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	}
	else {
		//验证失败
		//如要调试，请看alipay_notify.php页面的verifyReturn函数
		 include tpl('group_returnurl','member');

	}
}	

	
	
   
}
?>