電腦端網頁 微信掃碼支付和支付寶支付


電腦端網頁 微信掃碼支付和支付寶支付

注意:支付完成后的通知地址中,格式要使用a\5\b\3這種的,而不是a=5&b=3這種的,否則通知不到。

電腦端手機端的微信和支付寶支付都已掌握,貼一下代碼備用 ,基於thinkphp

微信:

class WxpayMobile extends Action{
       //在類初始化方法中,引入相關類庫    
    public function _initialize() {
        header("Content-type:text/html;charset=utf-8");
        vendor('WxPayPubHelper.SDKRuntimeException'); 
        define("APPID", C('WX_APPID'));
        define("MCHID", C('WX_MCHID'));
        define("KEY", C('WX_KEY'));
        define("APPSECRET", C('WX_APPSECRET'));
        define("JS_API_CALL_URL", C('site_url').U('Wxpay/wap_dowxpay'));
        define('SSLCERT_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem');
        define('SSLKEY_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_key.pem');
        define('NOTIFY_URL',C('site_url').'/index.php/Wxpay/通知接口');
        define('CURL_TIMEOUT',30);
        vendor('WxPayPubHelper.WxPayPubHelper'); 
    }
    public function index() {
       echo "禁止訪問";
        
    }
    public function dowxpay(){
        //使用統一支付接口
        $unifiedOrder = new UnifiedOrder_pub();
        $fee = $_POST['pay_cash']*100;
        //echo "'".$_POST['mas_id']."'";
        //設置統一支付接口參數
        //設置必填參數
        //appid已填,商戶無需重復填寫
        //mch_id已填,商戶無需重復填寫
        //noncestr已填,商戶無需重復填寫
        //spbill_create_ip已填,商戶無需重復填寫
        //sign已填,商戶無需重復填寫
        $unifiedOrder->setParameter("body","訂單付款");//商品描述
        //自定義訂單號,此處僅作舉例
        $out_trade_no = $_POST['order_no'];
        $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 
        $unifiedOrder->setParameter("total_fee",$fee);//總金額
        $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
        $unifiedOrder->setParameter("trade_type","NATIVE");//交易類型
        //非必填參數,商戶可根據實際情況選填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號  
        //$unifiedOrder->setParameter("device_info","XXXX");//設備號 
        //$unifiedOrder->setParameter("attach","'".$_POST['mas_id']."'");//附加數據 
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間 
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記 
        //$unifiedOrder->setParameter("openid","XXXX");//用戶標識
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
        
        //獲取統一支付接口結果
        $unifiedOrderResult = $unifiedOrder->getResult();
        
        //print_r($unifiedOrderResult);
        //商戶根據實際情況設置相應的處理流程
        if ($unifiedOrderResult["return_code"] == "FAIL") 
        {
            //商戶自行增加處理流程
        //    echo "通信出錯:".$unifiedOrderResult['return_msg']."<br>";
        }
        elseif($unifiedOrderResult["result_code"] == "FAIL")
        {
            //商戶自行增加處理流程
        //    echo "錯誤代碼:".$unifiedOrderResult['err_code']."<br>";
            //echo "錯誤代碼描述:".$unifiedOrderResult['err_code_des']."<br>";
        }
        elseif($unifiedOrderResult["code_url"] != NULL)
        {
            //從統一支付接口獲取到code_url
            $code_url = $unifiedOrderResult["code_url"];
            //商戶自行增加處理流程
            //......
        }
        $this->assign('code_url',$code_url);
        $this->assign('out_trade_no',$out_trade_no);
        $this->display();
     }
     
    //支付界面
    public function pay_online(){
        //獲取會員信息
        if(!isset($_SESSION['open_id'])){
            get_code();
        }
        $Apply = D('ApplyView');
        $where = array(
            'id'=>$_GET['out_trade_no'],
            );
        $my_order=$Apply->where($where)->find();
        //$my_order = $Apply->where($where)->find();
        if(empty($my_order)){
           $this->error('該訂單不存在!',U('User/index'));
        }elseif($my_order['pay_state']==1){
           $this->error('該訂單已經支付過!',U('User/index'));
        }else{
            header("Content-type:text/html;charset=utf-8");
            //獲取店鋪微信支付數據
            define("APPID", C('WX_APPID'));
            define("MCHID", C('WX_MCHID'));
            define("KEY", C('WX_KEY'));
            define("APPSECRET", C('WX_APPSECRET'));
             define('NOTIFY_URL','http://'.$_SERVER['HTTP_HOST'].'/index.php/Wxpay/notifyurl');
            define('CURL_TIMEOUT',30);
            vendor('WxPayPubHelper.WxPayPubHelper'); 
            vendor('WxPayPubHelper.SDKRuntimeException');
            $out_trade_no = $my_order['id'];   //訂單號
        
            
            
            $fee = $my_order['cost'];            //應付金額
            //使用jsapi接口
            $jsApi = new JsApi_pub();
            //=========步驟1:網頁授權獲取用戶openid============
            //通過code獲得openid
            $openid = $_SESSION['open_id'];
            //=========步驟2:使用統一支付接口,獲取prepay_id============
            //使用統一支付接口
            $unifiedOrder = new UnifiedOrder_pub();
            /* 2015年10月12日 18:27:53 用戶子商戶付款 ↓*/
            //$Shop = M('Shop'); 
            //$shop = $Shop->where('shopid = '.$my_order['shopid'])->find();
            //$unifiedOrder->setParameter("sub_appid",$shop['wx_appid']);//子商戶號碼
            // echo $shop['wx_appid'];
            
         //    $unifiedOrder->setParameter("sub_mch_id",MCHID);//子商戶號碼
            /* 2015年10月12日 18:27:53 用戶子商戶付款 ↑*/
            //dump($openid);dump($out_trade_no);dump(NOTIFY_URL);
            $unifiedOrder->setParameter("openid","$openid");//商品描述
            $unifiedOrder->setParameter("body","報名付款");//商品描述
            //自定義訂單號,此處僅作舉例
            $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 
            $unifiedOrder->setParameter("total_fee",$fee*100);//總金額
            $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
            $unifiedOrder->setParameter("trade_type","JSAPI");//交易類型
            $prepay_id = $unifiedOrder->getPrepayId();
            
            if($prepay_id==null){
                $this->error('發起支付失敗,請聯系管理員!',U('User/index'));
            }
            
            //=========步驟3:使用jsapi調起支付============
            $jsApi->setPrepayId($prepay_id);
            $jsApiParameters = $jsApi->getParameters();
            $this->assign('jsApiParameters',$jsApiParameters);
            $this->assign('my_order',$my_order);
            
            $this->assign('share_ok_url',U('User/index'));
            $this->assign('title',"微信支付");
            $this->display();
        }
        
    }
     
     
     
    public function wap_dowxpay(){
        if($_POST['order_no']){
            $_SESSION['order_no'] = $_POST['order_no'];
        }
        if($_POST['pay_cash']){
            $_SESSION['pay_cash'] = $_POST['pay_cash'];
        }
        if($_SESSION['order_no']){
            $out_trade_no = $_SESSION['order_no'];
        }        
        if($_SESSION['pay_cash']){
            $fee = $_SESSION['pay_cash'];
        }        
        
        //使用jsapi接口
        $jsApi = new JsApi_pub();
        
        //=========步驟1:網頁授權獲取用戶openid============
        //通過code獲得openid
        if (!isset($_GET['code']))
        {
            //觸發微信返回code碼
            $url = $jsApi->createOauthUrlForCode(JS_API_CALL_URL);
            Header("Location: $url"); 
        }else
        {
            //獲取code碼,以獲取openid
            $code = $_GET['code'];
            $jsApi->setCode($code);
            $openid = $jsApi->getOpenId();
        }
        
        //=========步驟2:使用統一支付接口,獲取prepay_id============
        //使用統一支付接口
        $unifiedOrder = new UnifiedOrder_pub();
        
        //設置統一支付接口參數
        //設置必填參數
        //appid已填,商戶無需重復填寫
        //mch_id已填,商戶無需重復填寫
        //noncestr已填,商戶無需重復填寫
        //spbill_create_ip已填,商戶無需重復填寫
        //sign已填,商戶無需重復填寫
        $unifiedOrder->setParameter("openid","$openid");//商品描述
        $unifiedOrder->setParameter("body","訂單付款");//商品描述
        //自定義訂單號,此處僅作舉例
        $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 
        $unifiedOrder->setParameter("total_fee",$fee*100);//總金額
        $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
        $unifiedOrder->setParameter("trade_type","JSAPI");//交易類型
        //非必填參數,商戶可根據實際情況選填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號  
        //$unifiedOrder->setParameter("device_info","XXXX");//設備號 
        //$unifiedOrder->setParameter("attach","XXXX");//附加數據 
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間 
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記 
        //$unifiedOrder->setParameter("openid","XXXX");//用戶標識
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
    
        $prepay_id = $unifiedOrder->getPrepayId();
        //=========步驟3:使用jsapi調起支付============
        $jsApi->setPrepayId($prepay_id);
        $jsApiParameters = $jsApi->getParameters();
        $this->assign('catename',"微信支付");
        $this->assign('pay_cash',$fee);
        $this->assign('jsApiParameters',$jsApiParameters);
        $this->assign_ur_here('微信支付',array(array('title'=>'微信支付','url'=>U('Index/wap_dowxpay'))));
        $this->display('Index:wap_dowxpay');
    }

    /******************************
    服務器異步通知頁面方法
    其實這里就是將notify_url.php文件中的代碼復制過來進行處理
    
    *******************************/
    public function notifyurl(){
       
        //使用通用通知接口
        $notify = new Notify_pub();
    
        //存儲微信的回調
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];    
        $notify->saveData($xml);
        
        //驗證簽名,並回應微信。
        //對后台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,
        //微信會通過一定的策略(如30分鍾共8次)定期重新發起通知,
        //盡可能提高通知的成功率,但微信不保證通知最終能成功。
        if($notify->checkSign() == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回狀態碼
            $notify->setReturnParameter("return_msg","簽名失敗");//返回信息
        }else{
            $notify->setReturnParameter("return_code","SUCCESS");//設置返回碼
        }
        $returnXml = $notify->returnXml();
        echo $returnXml;
        
        //==商戶根據實際情況設置相應的處理流程,此處僅作舉例=======
        //$log_name="notify_url.log";//log文件路徑
        //$this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
    
        if($notify->checkSign() == TRUE)
        {
            if ($notify->data["return_code"] == "FAIL") {
                //此處應該更新一下訂單狀態,商戶自行增刪操作
                //$this->log_result($log_name,"【通信出錯】:\n".$xml."\n");
            }
            elseif($notify->data["result_code"] == "FAIL"){
                //此處應該更新一下訂單狀態,商戶自行增刪操作
                //$this->log_result($log_name,"【業務出錯】:\n".$xml."\n");
            }
            else{
                //此處應該更新一下訂單狀態,商戶自行增刪操作
                //買家支付成功,開始修改訂單的支付方式和付款狀態
                //$this->log_result($log_name,$out_trade_no."【支付成功0000】:\n".$xml."\n");
                $out_trade_no = $notify->data["out_trade_no"];
                $Apply=M('Apply');
                $data['pay_state']=1;
                $data['pay_type']='wxpay';
               $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                if($ret){
                    echo "success";
                }
            }
        }
                
    }
        
    //查詢訂單的支付狀態
    public function order_query(){
    
        //退款的訂單號
        if (!isset($_POST["out_trade_no"]))
        {
            $out_trade_no = " ";
        }else{
            $out_trade_no = $_POST["out_trade_no"];
    
            //使用訂單查詢接口
            $orderQuery = new OrderQuery_pub();
            $orderQuery->setParameter("out_trade_no","$out_trade_no");//商戶訂單號 
            //獲取訂單查詢結果
            $orderQueryResult = $orderQuery->getResult();
            
            //商戶根據實際情況設置相應的處理流程,此處僅作舉例
            if ($orderQueryResult["return_code"] == "FAIL") {
                echo json_encode($orderQueryResult["return_code"]);
            }
            elseif($orderQueryResult["result_code"] == "FAIL"){
                echo json_encode($orderQueryResult["result_code"]);
            }
            else{
               echo json_encode($orderQueryResult['trade_state']);
            }    
            
        }
    }

    
    //空操作處理,所有空操作都指向空模塊
    public function _empty(){
        $this->redirect('Empty/index');
    }
    //獲取面包屑標題
    protected function assign_ur_here($title,$bread){
       //$bread  是一個數組   array   $bread = array('title'=>'ThinkPHP','url'=>'ThinkPHP@gmail.com');
       $breadcrumb = "<a href=".U('Index/index').">首頁</a>";
       foreach($bread as $key=>$v){
          $breadcrumb.= "><a href='".$v['url']."'>".$v['title']."</a>";
       }
       $this->assign('breadcrumb',$breadcrumb);
       $this->assign('seo_title',$title);
    }
}

 

 

支付寶:

class AlipayMobile extends Action{
          
    public function _initialize() {
        header("Content-type:text/html;charset=utf-8");
    }
    public function index() {
        echo "禁止訪問";
    }
    //doalipay方法
    /*該方法其實就是將接口文件包下alipayapi.php的內容復制過來
      然后進行相關處理
    */
    public function doalipay(){
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');   
        /**************************請求參數**************************/
        //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config;
        $alipay_config = array(
        'partner'             =>   C('alipay_partner'),   //這里是你在成功申請支付寶接口后獲取到的PID;
        'key'                 =>   C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key
        'private_key_path'      => 'key/rsa_private_key.pem',
        'ali_public_key_path' => 'key/alipay_public_key.pem',
        'sign_type'           => strtoupper('MD5'),
        'input_charset'       => 'utf-8',
        'cacert'              => getcwd().'\\cacert.pem',
        'transport'           => 'http',
        );
        $notify_url = C('site_url').'/index.php/Alipay/通知接口'; //服務器異步通知頁面路徑
        $return_url = C('site_url').U('User/index'); //頁面跳轉同步通知頁面路徑
        
        $payment_type = "1"; //支付類型 //必填,不能修改
        $seller_email = C('alipay_seller_email');//賣家支付寶帳戶必填
        $out_trade_no = $_POST['order_no'];//商戶訂單號 通過支付頁面的表單進行傳遞,注意要唯一!
        $subject =  "對訂單".$_POST['order_no'].'付款';  //訂單名稱 //必填 通過支付頁面的表單進行傳遞
        $total_fee = $_POST['pay_cash'];   //付款金額  //必填 通過支付頁面的表單進行傳遞
        $body = '訂單付款';
        $anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數
        $exter_invoke_ip = get_client_ip(); //客戶端的IP地址 
        /************************************************************/
        $extra_common_param = $_SESSION['master']['mas_id'];
        //構造要請求的參數數組,無需改動
        $parameter = array(
        "service" => "create_direct_pay_by_user",
        "partner" => trim(C('alipay_partner')),
        "payment_type"    => $payment_type,
        "notify_url"    => $notify_url,
        "return_url"    => $return_url,
        "seller_email"    => $seller_email,
        "out_trade_no"    => $out_trade_no,
        "subject"    => $subject,
        "total_fee"    => $total_fee,
        "body"            => $body,
        "extra_common_param" => $extra_common_param,
        "anti_phishing_key"    => $anti_phishing_key,
        "exter_invoke_ip"    => $exter_invoke_ip,
        "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
        );
        //建立請求
        
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "確認");
        echo $html_text;
     }
    //手機端支付
    public function wap_doalipay(){
        header("Content-type:text/html;charset=utf-8");
        vendor('Wap_alipay.Corefunction');
        vendor('Wap_alipay.Md5function');
        vendor('Wap_alipay.Notify');
        vendor('Wap_alipay.Submit');

        $alipay_config = array(
        'partner'             =>   C('alipay_partner'),   //這里是你在成功申請支付寶接口后獲取到的PID;
        'key'                 =>   C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key
        'private_key_path'      => 'key/rsa_private_key.pem',
        'ali_public_key_path' => 'key/alipay_public_key.pem',
        'sign_type'           => strtoupper('MD5'),
        'input_charset'       => 'utf-8',
        'cacert'              => getcwd().'\\cacert.pem',
        'transport'           => 'http',
        );

        //返回格式
        $format = "xml";
        //必填,不需要修改
        //返回格式
        $v = "2.0";
        //必填,不需要修改
        //請求號
        $req_id = date('Ymdhis');
        //必填,須保證每次請求都是唯一
        
        //**req_data詳細信息**
        
        //服務器異步通知頁面路徑
        $notify_url = C('site_url').'/index.php/Alipay/wap_notifyurl'; //服務器異步通知頁面路徑
        //需http://格式的完整路徑,不允許加?id=123這類自定義參數
        
        //頁面跳轉同步通知頁面路徑
        $call_back_url = C('site_url').'/index.php/User/index'; //頁面跳轉同步通知頁面路徑
        //需http://格式的完整路徑,不允許加?id=123這類自定義參數
        
        //操作中斷返回地址
        $merchant_url = C('site_url').'/index.php/User/index'; //頁面跳轉同步通知頁面路徑
        //用戶付款中途退出返回商戶的地址。需http://格式的完整路徑,不允許加?id=123這類自定義參數
        
        //賣家支付寶帳戶
        $seller_email = C('alipay_seller_email');
        //必填
        
        //商戶訂單號
        $out_trade_no = $_GET['order_no'];
        //商戶網站訂單系統中唯一訂單號,必填
        
        //訂單名稱
        $subject = "對訂單".$out_trade_no.'付款';
        //必填
        //查詢付款金額
        $where=array(
            "is_del"=>'0',
            "id"=>$out_trade_no
            );
        $Apply=M('Apply');
        $data=$Apply->where($where)->find();
       
        $total_fee = $data['cost']; //必填 通過支付頁面的表單進行傳遞$acount
        
        //dump($out_trade_no);dump($subject);dump($data);dump($total_fee);
        //return;
        //付款金額
        //$total_fee = $_POST['pay_cash']; //必填 通過支付頁面的表單進行傳遞$acount
        //必填
        $pay_expire    = 3;  //三分鍾有效
        //請求業務參數詳細
        $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><pay_expire>'.$pay_expire.'</pay_expire></direct_trade_create_req>';
        //必填
        /************************************************************/

        //構造要請求的參數數組,無需改動
        $para_token = array(
                "service" => "alipay.wap.trade.create.direct",
                "partner" => trim($alipay_config['partner']),
                "sec_id" => trim($alipay_config['sign_type']),
                "format"    => $format,
                "v"    => $v,
                "req_id"    => $req_id,
                "req_data"    => $req_data,
                "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
        );
        
        //dump($para_token);
        //return;
        //建立請求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $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($alipay_config['partner']),
                "sec_id" => trim($alipay_config['sign_type']),
                "format"    => $format,
                "v"    => $v,
                "req_id"    => $req_id,
                "req_data"    => $req_data,
                "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
        );
        //建立請求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '確認');
        echo $html_text;
    }
    /******************************
    手機支付寶的異步接收
    
    *******************************/
    public function wap_notifyurl(){
        vendor('Wap_alipay.Corefunction');
        vendor('Wap_alipay.Md5function');
        vendor('Wap_alipay.Notify');
        vendor('Wap_alipay.Submit');
        
        //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config;
        $alipay_config = array(
        'partner'             =>   C('alipay_partner'),   //這里是你在成功申請支付寶接口后獲取到的PID;
        'key'                 =>   C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key
        'private_key_path'      => 'key/rsa_private_key.pem',
        'ali_public_key_path' => 'key/alipay_public_key.pem',
        'sign_type'           => strtoupper('MD5'),
        'input_charset'       => 'utf-8',
        'cacert'              => getcwd().'\\cacert.pem',
        'transport'           => 'http',
        );
        //計算得出通知驗證結果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        
        if($verify_result) {//驗證成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //請在這里加上商戶的業務邏輯程序代
        
            
            //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
            //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表
            
            //解析notify_data
            //注意:該功能PHP5環境及以上支持,需開通curl、SSL等PHP配置環境。建議本地調試時使用PHP開發軟件
            $doc = new DOMDocument();    
            if ($alipay_config['sign_type'] == 'MD5') {
                $doc->loadXML($_POST['notify_data']);
            }
            
            if ($alipay_config['sign_type'] == '0001') {
                $doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));
            }
            
            if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
                //商戶訂單號
                $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->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') {
                    //判斷該筆訂單是否在商戶網站中已經做過處理
                        //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                        //如果有做過處理,不執行商戶的業務程序
                            
                    //注意:
                    //該種交易狀態只在兩種情況下出現
                    //1、開通了普通即時到賬,買家付款成功后。
                    //2、開通了高級即時到賬,從該筆交易成功時間算起,過了簽約時的可退款時限(如:三個月以內可退款、一年以內可退款等)后。
            
                    //調試用,寫文本函數記錄程序運行情況是否正常
                    //logResult("這里寫入想要調試的代碼變量值,或其他運行的結果記錄");
                    
                    echo "success";        //請不要修改或刪除
                }
                else if ($trade_status == 'TRADE_SUCCESS') {
                    //買家支付成功,開始修改訂單的支付方式和付款狀態
                    //買家支付成功,開始修改訂單的支付方式和付款狀態
                        /*$Apply=M('Apply');
                        $data['pay_state']=1;
                        $data['pay_type']='alipay';
                       $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                        if($ret){
                            echo "success";
                        }*/
                
                }
                    echo "success";        //請不要修改或刪除
            }
        
            //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
            
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //驗證失敗
            echo "fail".$_SESSION['master']['mas_id'];
        
            //調試用,寫文本函數記錄程序運行情況是否正常
            //logResult("這里寫入想要調試的代碼變量值,或其他運行的結果記錄");
        }
    }
    /******************************
    服務器異步通知頁面方法
    其實這里就是將notify_url.php文件中的代碼復制過來進行處理
    
    *******************************/
    public function notifyurl(){
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');   
        //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config;
        $alipay_config = array(
        'partner'             =>   C('alipay_partner'),   //這里是你在成功申請支付寶接口后獲取到的PID;
        'key'                 =>   C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key
        'private_key_path'      => 'key/rsa_private_key.pem',
        'ali_public_key_path' => 'key/alipay_public_key.pem',
        'sign_type'           => strtoupper('MD5'),
        'input_charset'       => 'utf-8',
        'cacert'              => getcwd().'\\cacert.pem',
        'transport'           => 'http',
        );

        //計算得出通知驗證結果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if($verify_result) {
           //驗證成功
           //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表
           $out_trade_no   = $_POST['out_trade_no'];      //商戶訂單號
           $extra_common_param = $_POST['extra_common_param'];
           $trade_no       = $_POST['trade_no'];          //支付寶交易號
           $trade_status   = $_POST['trade_status'];      //交易狀態
           $total_fee      = $_POST['total_fee'];         //交易金額
           $notify_id      = $_POST['notify_id'];         //通知校驗ID。
           $notify_time    = $_POST['notify_time'];       //通知的發送時間。格式為yyyy-MM-dd HH:mm:ss。
           $buyer_email    = $_POST['buyer_email'];       //買家支付寶帳號;
           $parameter = array(
             "out_trade_no"     => $out_trade_no, //商戶訂單編號;
             "trade_no"         => $trade_no,     //支付寶交易號;
             "total_fee"        => $total_fee,    //交易金額;
             "trade_status"     => $trade_status, //交易狀態
             "extra_common_param" => $extra_common_param,
             "notify_id"     => $notify_id,    //通知校驗ID。
             "notify_time"   => $notify_time,  //通知的發送時間。
             "buyer_email"   => $buyer_email,  //買家支付寶帳號;
           );
           if($_POST['trade_status'] == 'TRADE_FINISHED') {  
           }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           
                //買家支付成功,開始修改訂單的支付方式和付款狀態
                $Apply=M('Apply');
                $data['pay_state']=1;
                $data['pay_type']='alipay';
               $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                if($ret){
                    echo "success";
                }
                
           }
           echo "success";        //請不要修改或刪除
         }else {
                
                //驗證失敗
                echo "fail".$_SESSION['master']['mas_id'];
        }    
    }
    
    /*
    頁面跳轉處理方法;
    這里其實就是將return_url.php這個文件中的代碼復制過來,進行處理; 
    */
    public function returnurl(){
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');   
        //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config;
        $alipay_config = array(
        'partner'             =>   C('alipay_partner'),   //這里是你在成功申請支付寶接口后獲取到的PID;
        'key'                 =>   C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key
        'private_key_path'      => 'key/rsa_private_key.pem',
        'ali_public_key_path' => 'key/alipay_public_key.pem',
        'sign_type'           => strtoupper('MD5'),
        'input_charset'       => 'utf-8',
        'cacert'              => getcwd().'\\cacert.pem',
        'transport'           => 'http',
        );
        $notify_url = C('site_url').'/index.php/Alipay/notifyurl'; //服務器異步通知頁面路徑
        $return_url = C('site_url').U('User/order'); //頁面跳轉同步通知頁面路徑
        
        $alipayNotify = new AlipayNotify($alipay_config);//計算得出通知驗證結果
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {
            //驗證成功

           if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {

                $this->success('支付成功',$return_url);
           }else {
                $this->error('支付失敗,'.$_GET['trade_status'],$return_url);
           }
       }else {
           //驗證失敗
           //如要調試,請看alipay_notify.php頁面的verifyReturn函數
           $this->error('支付失敗,'.$_GET['trade_status'],$return_url);
       }
       
       
    }
    //空操作處理,所有空操作都指向空模塊
    public function _empty(){
        $this->redirect('Empty/index');
    }
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM