• 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
    

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

     
  • 相关阅读:
    hdu4554 A Famous Game 概率期望
    【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂
    【BZOJ】【1007】【HNOI2008】水平可见直线
    【BZOJ】【1025】【SCOI2009】游戏
    【BZOJ】【1024】【SCOI2009】生日快乐
    【BZOJ】【1023】【SHOI2008】cactus仙人掌图
    【BZOJ】【3504】【CQOI2014】危桥
    【BZOJ】【1021】【SHOI2008】Dept循环的债务
    【BZOJ】【1020】【SHOI2008】安全的航线flight
    【BZOJ】【1019】【SHOI2008】汉诺塔
  • 原文地址:https://www.cnblogs.com/klj123wan/p/3572131.html
Copyright © 2020-2023  润新知