0

目前在做微信登录的网页,使用的是微信提供的接口,用户访问的index/index的时候,跳转到微信指定的url上:

function index(){
    $wxService = \App::make('App\Http\Service\WXActivityService');
    $target_url = route('Index/Activity');
    $redirect_url = $wxService->getWxRedirectUrl($target_url);
    return redirect()->intended($redirect_url);
}

这段代码很简单,就是根据微信指定的url格式来拼接url,然后重定向到这个url($target_url)上.微信会根据其中的redirect_uri来重定向回我设置的$target_url 页面.
但是现在的问题是,微信那边带着code重定向回我的页面以后,我这边服务器会收到两次同样的请求,这就很奇怪,请问大神这是什么情况?是不是laravel的跨站重定向有问题?header函数来重定向也不能实现,实在是非常郁闷...
我记录了日志,发现index方法是只执行了一次的,但是$target_url 却被访问了两次...


日志记录如下:

[2017-06-20 10:43:52] local.INFO: 请求方法:GET  
[2017-06-20 10:43:52] local.INFO: 请求方法:GET  
[2017-06-20 10:43:53] local.INFO: 发送红包成功:用户openid:xxxxxx  本次微信回执:发放成功  suc_des: 发放成功
[2017-06-20 10:43:53] local.INFO: 发送红包成功:用户openid:xxxxxxI  本次微信回执:发放成功  suc_des: 发放成功

按照我的日志记录方式,我是先记录请求的方法,然后进行微信红包发放,发放后结果再记录一次,所以对于一次请求的日志记录格式应该是:

[2017-06-20 10:41:30] local.INFO: 请求方法:GET  
[2017-06-20 10:41:32] local.INFO: 发送红包成功:用户openid:xxxxxxx  本次微信回执:发放成功  suc_des: 发放成功

但是上面的日志记录是先出现2次"请求方法:GET ",这就说明了这两次请求是同时进来的,第一个请求在调用微信红包接口的时候第二个请求的请求方法被记录,最后处理完微信红包接口再记录结果,这就说明微信发送了两次请求,可是这是为什么呢?而且每次都是get请求.

最后,我发现这个问题是在微信PC端上打开连接才有时候出现,在手机端的微信上打开从来没有出现过这个问题!
会不会是这个原因呢??

1个回答

2

检查一下,两次请求分别的 Request Method:
因为是跨域请求,客户端发先发送一个OPTIONS 请求
Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。

很有可能是这个问题,
我现在用axios 作为我的网络请求库,也遇到了这个问题,跨域访问的时候 ,都会先发送一个OPTIONS请求,用来判断接下来的请求是否安全和被允许

我现在的做法是,在index.php 入口文件中,检测,是否为OPTIONS 请求,如果是就返回一个状态
具体代码

if ($_SERVER['REQUEST_METHOD']=='OPTIONS') {
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
    header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');
    return;
}

撰写答案