You've already forked qlg.tsgz.moe
							
							
		
			
				
	
	
		
			623 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			623 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace wstmart\app\controller;
 | 
						|
 | 
						|
use think\Loader;
 | 
						|
 | 
						|
use wstmart\common\model\Payments as M;
 | 
						|
 | 
						|
use wstmart\app\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 ( 'app_alipay.aop.AopClient' );
 | 
						|
 | 
						|
    	Loader::import ( 'app_alipay.aop.request.AlipayTradeAppPayRequest' );
 | 
						|
 | 
						|
    	$m = new M();
 | 
						|
 | 
						|
    	$payment = $m->getPayment("app_alipays");
 | 
						|
 | 
						|
    	$this->alipayConfig = array(
 | 
						|
 | 
						|
            'app_id'                =>trim($payment['appId']),
 | 
						|
 | 
						|
            'rsaPrivateKey'         =>trim($payment['rsaPrivateKey']),//'请填写开发者私钥去头去尾去回车,一行字符串'
 | 
						|
 | 
						|
            'alipayrsaPublicKey'    =>trim($payment['alipayrsaPublicKey']),//公钥 
 | 
						|
 | 
						|
            'format'    =>'json',//格式
 | 
						|
 | 
						|
            'charset'    =>'UTF-8',
 | 
						|
 | 
						|
            'signType'    =>'RSA2',
 | 
						|
 | 
						|
    		'seller_email'=>'ect@ect99.com'   			
 | 
						|
 | 
						|
    	);
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
 | 
						|
    /**
 | 
						|
 | 
						|
     * 支付宝支付跳转方法
 | 
						|
 | 
						|
     */
 | 
						|
 | 
						|
    public function toAliPay(){
 | 
						|
 | 
						|
// echo "<span style='font-size:40px;'>暂停APP支付,请选择WAP端支付宝支付</span>";
 | 
						|
 | 
						|
//                     return;
 | 
						|
 | 
						|
    	$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("app/users/index","",true,true);
 | 
						|
 | 
						|
	    	$notify_url = url("app/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)){
 | 
						|
 | 
						|
	    		echo "<span style='font-size:40px;'>找不到此订单!</span>";
 | 
						|
 | 
						|
                return;
 | 
						|
 | 
						|
	    	}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("app/orders/index","",true,true);
 | 
						|
 | 
						|
	    	$notify_url = url("app/alipays/aliNotify","",true,true);
 | 
						|
 | 
						|
	    	$subject = '支付购买商品费用';
 | 
						|
 | 
						|
    	} 	
 | 
						|
 | 
						|
    	$data = array();
 | 
						|
 | 
						|
    	$data["userId"] = $userId;
 | 
						|
 | 
						|
    	$data["transId"] = $transId;
 | 
						|
 | 
						|
    	$data["paramsVa"] = json_encode($payParams);
 | 
						|
 | 
						|
    	$data["payFrom"] = 'alipays';
 | 
						|
 | 
						|
    	$m = new PM();
 | 
						|
 | 
						|
    	$m->addPayLog($data);
 | 
						|
 | 
						|
    	
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    	//建立请求
 | 
						|
 | 
						|
        $aop = new \AopClient;
 | 
						|
 | 
						|
        $aop->gatewayUrl            = "https://openapi.alipay.com/gateway.do";
 | 
						|
 | 
						|
        $aop->appId                 = $this->alipayConfig['app_id'];
 | 
						|
 | 
						|
        $aop->rsaPrivateKey         = $this->alipayConfig['rsaPrivateKey'];
 | 
						|
 | 
						|
        $aop->alipayrsaPublicKey    = $this->alipayConfig['alipayrsaPublicKey'];
 | 
						|
 | 
						|
        $aop->apiVersion            = '1.0';  
 | 
						|
 | 
						|
        $aop->signType              = "RSA2";
 | 
						|
 | 
						|
        $aop->postCharset           = $this->alipayConfig['charset'];
 | 
						|
 | 
						|
        $aop->format                = $this->alipayConfig['format'];
 | 
						|
 | 
						|
        //$aop->charset               = $this->alipayConfig['charset'];
 | 
						|
 | 
						|
        
 | 
						|
 | 
						|
        
 | 
						|
 | 
						|
        
 | 
						|
 | 
						|
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
 | 
						|
 | 
						|
        $request = new \AlipayTradeAppPayRequest();
 | 
						|
 | 
						|
        // 异步通知地址
 | 
						|
 | 
						|
        //$notify_url = urlencode($notify_url);
 | 
						|
 | 
						|
        // 订单标题
 | 
						|
 | 
						|
        $subject = $subject;
 | 
						|
 | 
						|
        // 订单详情
 | 
						|
 | 
						|
        $body = $subject; 
 | 
						|
 | 
						|
        //SDK已经封装掉了公共参数,这里只需要传入业务参数
 | 
						|
 | 
						|
        $bizcontent = "{\"body\":\"".$body."\","
 | 
						|
 | 
						|
                        . "\"subject\": \"".$subject."\","
 | 
						|
 | 
						|
                        . "\"out_trade_no\": \"".$out_trade_no."\","
 | 
						|
 | 
						|
                        . "\"timeout_express\": \"30m\","
 | 
						|
 | 
						|
                        . "\"total_amount\": \"".$total_fee."\","
 | 
						|
 | 
						|
                        . "\"product_code\":\"QUICK_MSECURITY_PAY\""
 | 
						|
 | 
						|
                        . "}";
 | 
						|
 | 
						|
        $request->setNotifyUrl($notify_url);
 | 
						|
 | 
						|
        $request->setBizContent($bizcontent);
 | 
						|
 | 
						|
        //这里和普通的接口调用不同,使用的是sdkExecute
 | 
						|
 | 
						|
        $response = $aop->sdkExecute($request);
 | 
						|
 | 
						|
        // 注意:这里不需要使用htmlspecialchars进行转义,直接返回即可
 | 
						|
 | 
						|
        echo $response;
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
 | 
						|
     * 验签
 | 
						|
 | 
						|
     * @param  [type] $postParams [description]
 | 
						|
 | 
						|
     * @return [type]             [description]
 | 
						|
 | 
						|
     */
 | 
						|
 | 
						|
    public function checkSign($postParams){
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        $aop = new \AopClient;
 | 
						|
 | 
						|
        $aop->alipayrsaPublicKey = $this->alipayConfig['alipayrsaPublicKey'];
 | 
						|
 | 
						|
        $flag = $aop->rsaCheckV1($postParams, NULL, "RSA2");
 | 
						|
 | 
						|
        return $flag;
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
 | 
						|
     * 服务器异步通知页面方法
 | 
						|
 | 
						|
     *
 | 
						|
 | 
						|
     */
 | 
						|
 | 
						|
    function alinotify() {
 | 
						|
 | 
						|
        //验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
 | 
						|
 | 
						|
        /**
 | 
						|
 | 
						|
        ①验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id
 | 
						|
 | 
						|
        ②修改订单表
 | 
						|
 | 
						|
        **/
 | 
						|
        // if(!isset($_POST['app_id'])){
 | 
						|
        //     $_POST = $_GET;
 | 
						|
        // }
 | 
						|
        if(!$this->checkSign($_POST)){//验签
 | 
						|
 | 
						|
            return false;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        //验证app_id是否为该商户本身
 | 
						|
 | 
						|
        if($this->alipayConfig['app_id'] != $_POST['app_id']){
 | 
						|
 | 
						|
            return false;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        //校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方
 | 
						|
 | 
						|
        if(isset($_POST['seller_email']) && ($_POST['seller_email'] != $_POST['seller_email'])){           
 | 
						|
 | 
						|
            return false;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        $out_trade_no = $_POST['out_trade_no'];//获取交易号
 | 
						|
 | 
						|
        $tradeNo = explode("a",$out_trade_no);//实际订单号
 | 
						|
 | 
						|
        $om = new OM();
 | 
						|
 | 
						|
        //商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号
 | 
						|
 | 
						|
        $orderInfo = $om->getOrderByOrderNo($tradeNo['0'],'needPay,isPay');//取订单信息;
 | 
						|
 | 
						|
        if(empty($orderInfo)){
 | 
						|
 | 
						|
            return false;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        //判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额)
 | 
						|
 | 
						|
        // if ($_POST['total_amount'] != $orderInfo['needPay']){
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        //     return false;
 | 
						|
 | 
						|
        // }     
 | 
						|
 | 
						|
        if(0==$orderInfo["isPay"] && ($_POST['trade_status']=="TRADE_SUCCESS" || $_POST['trade_status']=="TRADE_FINISHED")){
 | 
						|
 | 
						|
            //处理订单
 | 
						|
 | 
						|
            $obj["trade_no"] = $_POST['trade_no'];//支付宝交易号          
 | 
						|
 | 
						|
            $obj["out_trade_no"] = $tradeNo[0];//实际订单号
 | 
						|
 | 
						|
            $obj["payFrom"] = 'alipays';
 | 
						|
 | 
						|
            $obj["total_fee"] = $_POST['total_amount'];//订单金额
 | 
						|
 | 
						|
            
 | 
						|
 | 
						|
            $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";// 请不要修改或删除    	
 | 
						|
 | 
						|
    	// // 计算得出通知验证结果
 | 
						|
 | 
						|
    	// $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";
 | 
						|
 | 
						|
    	// }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
}
 | 
						|
 |