zoukankan      html  css  js  c++  java
  • tp框架集成支付宝,中转页变成gbk编码

    tp框架中集成支付宝的功能,将支付宝的demo例子存在到下图位置ExtendVendorAlipay

    生成支付订单

       /** 
        * 支付订单 
        */  
        public function pay() {  
            header("Content-Type:text/html; charset=utf-8"); 
            $id = I('post.oid','', 'htmlspecialchars');    
            $DAO = M('order');            
            $order = $DAO->where("id=".$id)->find();  
            $error = "";     
            if(!isset($order)){  
                $error = "订单不存在";  
            }else if($order['PaymentStatus'] == 1){  
                $error = "此订单已经完成,无需再次支付!";  
            } else if($order['PaymentStatus'] == 2){  
                $error = "此订单已经取消,无法支付,请重新下单!";  
            }  
            if($error != ""){  
                $this->_FAIL("系统错误",$error,$this->getErrorLinks());  
                return ;  
            }  
            $payType = I('post.payType','', 'htmlspecialchars');
            #支付宝  
            if($payType == 'alipay'){  
                $this->payWithAlipay($order);   
            }  
        }  
    

      支付订单提交

    /**
          * 以支付宝形式支付
          * @param unknown_type $order
          */
        private function payWithAlipay($order){
    
            //引入支付宝相关的文件
            require_once(VENDOR_PATH."Alipay/alipay.config.php");
            require_once(VENDOR_PATH."Alipay/lib/alipay_submit.class.php");
    
            //支付类型
            $payment_type = "1";
            //必填,不能修改
            //服务器异步通知页面路径
            $notify_url = C("HOST")."index.php/Alipay/notifyOnAlipay";
            //页面跳转同步通知页面路径
            $return_url = C("HOST")."index.php/Pay/ok";
            //卖家支付宝帐户
            $seller_email = $alipay_config['seller_email'];
            //必填
            //商户订单号, 从订单对象中获取
            $out_trade_no = $order['OrderNum'];
            //商户网站订单系统中唯一订单号,必填
            //订单名称
    
            $subject = "物流服务";
            //必填
            //付款金额
            #正常金额        
            $price = $order['Price'];
            #测试金额
            #$price = 0.1;
    
            //必填
            $body = $subject;
            //商品展示地址
            $show_url = C('HOST');
    
            //构造要请求的参数数组,无需改动
            $parameter = array(
                "service" => "create_direct_pay_by_user",
                "partner" => trim($alipay_config['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" => $price,
                "body"  => $body,
                "show_url"  => $show_url,
                "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
            );
            Log::write('支付宝订单参数:'.var_export($parameter,true),Log::DEBUG);
            //建立请求
            $alipaySubmit = new AlipaySubmit($alipay_config);
            $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "去支付");
            echo $html_text;
        }
    

      支付宝回调接口

    <?php
    /**
    * 支付宝回调接口
    */
    class AlipayAction extends Action {
        
        /**
          * 支付宝异步通知
          */
        public function notifyOnAlipay(){
            Log::write("notify: ".print_r($_REQUEST, true),Log::DEBUG);
            require_once(VENDOR_PATH."Alipay/alipay.config.php");
            require_once(VENDOR_PATH."Alipay/lib/alipay_notify.class.php");
            $orderLogDao = M('orderlog');
             //计算得出通知验证结果
            $alipayNotify = new AlipayNotify($alipay_config);
            $verify_result = $alipayNotify->verifyNotify();
            Log::write('verify_result:'.var_export($verify_result,true),Log::DEBUG);
            if($verify_result) {//验证成功
                //商户订单号
                $out_trade_no = $_POST['out_trade_no'];
                //支付宝交易号
                $trade_no = $_POST['trade_no'];
                //根据订单号获取订单
                $DAO = M('order');
                $order = $DAO->where("OrderNum='".$out_trade_no."'")->find();
                //如果订单不存在,设置为0
                if(!isset($order)){
                    $orderId = 0;
                }
                else{
                    $orderId = $order['id'];
                }
                //交易状态
                $trade_status = $_POST['trade_status'];
                $log = "notify from Alipay, trade_status=".$trade_status." alipay sign=".$_POST['sign'].' price ='.$_POST['total_fee'] ;
                $orderLog['o_id'] = $orderId;
                if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {
                    #修改订单状态
                    if ((float)$order['Price'] != (float)$_POST['total_fee']) {
                        $data['PaymentStatus'] = '2';    
                    } else {
                        $data['PaymentStatus'] = '1';    
                    }
                    $DAO ->where('id='.$orderId)->save($data);
                }
                   $orderLog['pay_id']  = $trade_no;
                   $orderLog['pay_log'] = $log;
                   $orderLog['pay_type'] = 'alipay';
                   $orderLog['pay_result'] = 'success';
                   
                   $orderLogDao->add($orderLog);
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                echo "success"; //返回成功标记给支付宝
            }
            else {
            //验证不通过时,也记录下来
                $orderLog['pay_log'] = "notify from Alipay, 但是验证不通过,sign=".$_POST['sign'];
                $orderLog['o_id'] = -1;
                $orderLog['pay_type'] = 'alipay';
                   $orderLog['pay_result'] = 'fail';
                $orderLogDao->add($orderLog);
             
               //验证失败
               echo "fail";
            }
        }
    }
    ?>

    今天在tp框架中集成支付宝功能,跳转支付宝的时候出现乱码错误。

     需要设定header("Content-Type:text/html; charset=utf-8"); 

    如果还有乱码查看日志信息 是否出现

    NOTIC: [2] Cannot modify header information - headers already sent by (output started at
    

      上面错误,删除错误文件开始的空格

     
  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/klj123wan/p/3572131.html
Copyright © 2011-2022 走看看