购物车页Smart Payment Button中的PayPal账户支付按钮点击后的报错问题解决

bug问题 · chrispoo · 于 2年前 发布 · 1597 次阅读

系统升级到最新的2.17.1,fecro升到到最新的1.7.1,配置之后,在购物车页点击“PayPal Buy Now”按钮,弹窗打开后会瞬间关闭,异步请求中有报错。

  1. 购物车页点击按钮

  2. 异步请求中的报错 URL: http://xxx.com/payment/paypal/express/button

    "EC-0E965223CB5085024"
    An Error occurred while handling another error:
    yii\web\HeadersAlreadySentException: Headers already sent in xxxx\vendor\fancyecommerce\fecshop\app\appfront\modules\Payment\block\paypal\express\Start.php on line 34. in xxxx\vendor\yiisoft\yii2\web\Response.php:373
    Stack trace:
    #0 xxxx\vendor\yiisoft\yii2\web\Response.php(346): yii\web\Response->sendHeaders()
    #1 xxxx\vendor\yiisoft\yii2\web\ErrorHandler.php(136): yii\web\Response->send()
    #2 xxxx\vendor\yiisoft\yii2\base\ErrorHandler.php(135): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
    #3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
    #4 {main}
    Previous exception:
    yii\web\HeadersAlreadySentException: Headers already sent in xxxx\vendor\fancyecommerce\fecshop\app\appfront\modules\Payment\block\paypal\express\Start.php on line 34. in xxxx\vendor\yiisoft\yii2\web\Response.php:373
    Stack trace:
    #0 xxxxx\vendor\yiisoft\yii2\web\Response.php(346): yii\web\Response->sendHeaders()
    #1 xxxxx\vendor\yiisoft\yii2\base\Application.php(398): yii\web\Response->send()
    #2 xxxx\appfront\web\index.php(66): yii\base\Application->run()
    #3 {main}
    
  3. 修复方法 文件路径:vendor/fancyecommerce/fecshop/app/appfront/modules/Payment/block/paypal/express/Start.php

     public function startButtonPayment()
     {
         $methodName_ = 'SetExpressCheckout';
         $nvpStr_ = Yii::$service->payment->paypal->getExpressTokenNvpStr();
         //echo $nvpStr_;exit;
         $checkoutReturn = Yii::$service->payment->paypal->PPHttpPost5($methodName_, $nvpStr_);
         //var_dump($checkoutReturn);
         if (strtolower($checkoutReturn['ACK']) == 'success') {
             $token = $checkoutReturn['TOKEN'];
             if($token){
                 if(!Yii::$service->order->generatePPExpressOrder($token)){
                     return false;
                 }
                 echo '"'.$token.'"';
             }
                
         } elseif (strtolower($checkoutReturn['ACK']) == 'failure') {
             echo $checkoutReturn['L_LONGMESSAGE0'];
         } else {
             var_dump($checkoutReturn);
         }
     }
    

    ===>

     public function startButtonPayment()
     {
         $methodName_ = 'SetExpressCheckout';
         $nvpStr_ = Yii::$service->payment->paypal->getExpressTokenNvpStr();
         //echo $nvpStr_;exit;
         $checkoutReturn = Yii::$service->payment->paypal->PPHttpPost5($methodName_, $nvpStr_);
         //var_dump($checkoutReturn);
         if (strtolower($checkoutReturn['ACK']) == 'success') {
             $token = $checkoutReturn['TOKEN'];
             if($token){
                 if(!Yii::$service->order->generatePPExpressOrder($token)){
                     return false;
                 }
                 echo '"'.$token.'"';
             }
                
         } elseif (strtolower($checkoutReturn['ACK']) == 'failure') {
             echo $checkoutReturn['L_LONGMESSAGE0'];
         } else {
             var_dump($checkoutReturn);
         }
    	exit;
     }
    

    startButtonPayment函数最后添加exit;就正常了。

本文由 chrispoo 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

共收到 3 条回复 技术分享
Fecmall#12年前 0 个赞

OK,收到

chrispoo#22年前 0 个赞

@Fecmall [#1楼](#comment1) 手机端也有这个问题,修复方式一样。 要修改的文件和函数: vendor/fancyecommerce/fecshop/app/apphtml5/modules/Payment/block/paypal/express/Start.php::startButtonPayment()

Fecmall#32年前 0 个赞

@chrispoo #2楼 OK。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics