求救!通过Paypal快速支付进来,表单不能返回Paypal支付...

bug问题 · Blueyii · 于 6年前 发布 · 5795 次阅读

点击paypal快速购买,进入到paypal支付页确认返回后,再从这个页面点击Place order now提交,就返回不到Paypal的支付页了,也没有提示信息: (左边的地址信息填写完整也不行,上面也没有提示信息)...

共收到 26 条回复
Fecmall#16年前 1 个赞

你看下官网的演示,没有问题啊,支付成功后,应该要跳转到支付成功页面,你加断点试试,找找原因。

打印 paypal 的返回信息,看看具体原因在哪里

Blueyii#26年前 0 个赞

@Terry #1楼 在本地虚拟机上测试也是正常,但是部署到服务器上就出现了这个问题...

Blueyii#36年前 0 个赞

这个CSRF接收不到参数...

Fecmall#46年前 0 个赞

如果有报错,会报错:

如果没有报错,会跳转到支付成功页面:

Fecmall#56年前 1 个赞
public function actionReview()
    {
        $_csrf = Yii::$app->request->post('_csrf');
        if ($_csrf) {
            $status = $this->getBlock('placeorder')->getLastData();
            if ($status) {
                return;
            }
        }
        $data = $this->getBlock()->getLastData();
        if (is_array($data) && !empty($data)) {
            return $this->render($this->action->id, $data);
        } else {
            return $data;
        }
    }

从paypal跳转回来是没有csrf参数的,因此执行的是下面的部分:

$data = $this->getBlock()->getLastData();
        if (is_array($data) && !empty($data)) {
            return $this->render($this->action->id, $data);
        } else {
            return $data;
        }
Fecmall#66年前 0 个赞

然后你点击Place Order Now 按钮,提交地址是当前地址,就会有csrf参数 ,然后执行的代码为:

if ($_csrf) {
            $status = $this->getBlock('placeorder')->getLastData();
            if ($status) {
                return;
            }
        }
Blueyii#76年前 0 个赞

@Terry #5楼 点击提交按钮后,在本地会返回csrf参数,在服务器上就没有

Fecmall#86年前 0 个赞

paypal express 跳转回到网站后。

用google浏览器查看一下源代码看看,是否有csrf

Fecmall#96年前 0 个赞

代码位置在:

https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/theme/base/front/payment/paypal/express/review.php

<form action="<?= Yii::$service->url->getCurrentUrl(); ?>" method="post" id="onestepcheckout-form">
			<?= \fec\helpers\CRequest::getCsrfInputHtml(); ?>
			<fieldset style="margin: 0;" class="group-select">

<?= \fec\helpers\CRequest::getCsrfInputHtml(); ?>: 这个代码用于生成csrf

Blueyii#106年前 0 个赞

有_csfr参数

Blueyii#116年前 0 个赞

本地参数接收得到: 服务器上接收不到:

Fecmall#126年前 0 个赞

@Blueyii #10楼 剩下的,你自己找找问题吧,思路已经说明白了

解决后,贴下解决思路

Fecmall#136年前 0 个赞

@Blueyii #11楼 难道你的服务器有特殊的配置或者拦截?

Blueyii#146年前 0 个赞

@Terry #13楼 我有个widget文件名大小写错误,在本地虚拟机上没有报错,放到服务器上就报错...那天也是找了一个下午才找到原因

Blueyii#156年前 0 个赞

服务器也是centos6.5,配置和虚拟机一样

Fecmall#166年前 1 个赞

你本地是linux吗?都是一样的环境,怎么会出大小写错误?

你先自己尝试解决下把

  1. form是否传递了_csrf
  2. 传递的_csrf为什么接收不到。
Fecmall#176年前 0 个赞

@Blueyii #15楼 你说的那个大小写,是你自己的代码,还是fecshop的bug?

Blueyii#186年前 0 个赞

@Terry [#16楼](#comment16) 嗯嗯 我检查一下提交的参数 本地也是linux centos6.8,我也奇怪为什么没有报错... :joy:

newproduct.php首字母写成小写的了本地没报错,上传到服务器上报错了

Blueyii#196年前 0 个赞

@Terry #17楼 是自己写的

Blueyii#206年前 0 个赞

原因已经找到了,因为我的域名是 www.fecshop.com 这样的形式(有www),我在store里配置的也是 www.fecshop.com, 表单提交的地址是 https://fecshop.com (Yii::$service->url->getCurrentUrl(); 接收到的URL去掉了www,没有www前缀接收不到POST...)

还有一个问题,如果是在store配置的是 fecshop.com 那么用 www.fecshop.com 打开就会报错,如果配置的是 www.fecshop.com 用 fecshop.com 打开也会报错,把 www.fecshop.com 和 fecshop.com 都写上才行,但是都写上,在顶部菜单语言栏下拉列表里就会多出2个选项...

Fecmall#216年前 1 个赞

nginx做一个跳转就可以了

server {
        listen       80;
        listen 443 ssl http2;
        #ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        #ssl_certificate ssl/market_onfancy_com.crt;
        #ssl_certificate_key ssl/server.key;
        server_name fecshop.com;
        return 301 $scheme://www.fecshop.com$request_uri;
}
Blueyii#226年前 0 个赞

@Terry #21楼 太感谢了 多谢指点 :clap:

Fecmall#236年前 0 个赞

@Blueyii #3楼 你的网站搞的怎么样了?有线上地址发下观摩观摩。

Blueyii#246年前 0 个赞

@Terry #23楼 https://www.wishbuy.shop 目前大概的效果已经出来了,细节还在继续完善中... :bowtie:

Fecmall#256年前 0 个赞

@Blueyii #24楼 可以当个案例发布出来吗?

Blueyii#266年前 0 个赞

@Terry #25楼 嗯嗯 可以的,感谢@Terry :blush:

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