laravel开发微信公众号里的坑

编辑于 2017-04-14


我们都知道laravel框架是默认开启post请求的防Csrf攻击的,在进行post请求时需要进行token验证,可是微信服务端的post请求我们没办法加入自己的token,所以必须关闭框架的Csrf验证,这里有两种方式:

  • 全局关闭防Csrf攻击的token验证

app/Http/kernel.php文件里注释掉下面这行即可全局关闭Csrf攻击的token验证

//\App\Http\Middleware\VerifyCsrfToken::class,


  • 局部关闭防Csrf攻击的token验证

app/Http/Middleware/VerifyCsrfToken.php文件里$except数组里填写要排除的url,比如关闭home路由下的token验证

protected $except = [
        'home'
    ];

以前很多微信开发在我们的服务端获取微信服务器post传过来的xml数据时,一般都用$HTTP_RAW_POST_DATA全局变量来获取post的原生数据,要使用这个全局变量要在配置文件php.ini中把always_populate_raw_post_data设置成on这在php5.6以前这都是没问题的,但新版本的php中官方已经废止了这个选项。现在都php7时代了,所以啊,还得与时俱进呐。官方建议使用php://input代替$HTTP_RAW_POST_DATA。

解决方法使用php://input来获取原生数据

$message = file_get_contents("php://input")

上面这行代码就可以把post原生数据放入$message变量中了

  • JS-SDK开发中的注意事项

生成签名时所填写的url不要用框架url函数去生成,在微信端的url会自动加入微信那边的参数,会导致签名与微信端生成的签名不一致

在生成签名时获取url地址还是通过原生的超全局变量$_SERVER去获取

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

在填写js接口安全域名时,不要带上http://活着www直接写域名就行

JS-SDK里的域名必须备案,不然,你就试试吧

暂时写这么多,等我遇到坑的时候在填补上去。