承认有点标题党了。这次开发一个项目遇到问题,以前有两个微信老项目基于yaf,域名为m.baidu.com(做示例),然后网页授权域名填的是m.baidu.com,而这次新开发的项目是基于laravel,那么域名为wechat.baidu.com,但是网页授权域名怎么办,这就坑爹了。当然了,大部分人不会遇到这么蛋疼的事情吧。

前提

laravel5.5php7.1.0nginx1.10overtrue/laravel-wechat

了解微信OAuth

这个过程必须要明白

感谢超神的图片

从流程我们可以看到,回调url域名其实就是我们的网页授权域名。那么既然这样我们是不是可以造个假呢,
在域名为wechat.baidu.com的项目下,我们也把网页授权域名写成m.baidu.com,然后再使用nginx做代理,基于location 转发到wechat.baidu.com下;

改写overtrue/laravel-wechat中间件

为什么要改写这个中间件呢,因为中间件默认会直接获取你的域名,所以如果我使用wechat.baidu.com,那么默认就会回调后跳转到wechat.baidu.com,而实际上我要跳转到m.baidu.com

Middleware文件夹下新建一个中间件OAuthAuthenticate,并且继承 Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate;:

namespace App\Http\Middleware;use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Overtrue\LaravelWeChat\Events\WeChatUserAuthorized;
use Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate as BaseAuthenticate;class OAuthAuthenticate extends BaseAuthenticate
{public function handle($request, \Closure $next, $account = 'default', $scopes = null){// $account 与 $scopes 写反的情况if (is_array($scopes) || (\is_string($account) && str_is('snsapi_*', $account))) {list($account, $scopes) = [$scopes, $account];$account || $account = 'default';}$isNewSession = false;$sessionKey = \sprintf('wechat.oauth_user.%s', $account);$config = config(\sprintf('wechat.official_account.%s', $account), []);$officialAccount = app(\sprintf('wechat.official_account.%s', $account));$scopes = $scopes ?: array_get($config, 'oauth.scopes', ['snsapi_base']);if (is_string($scopes)) {$scopes = array_map('trim', explode(',', $scopes));}$session = session($sessionKey, []);if (!$session) {if ($request->has('code')) {session([$sessionKey => $officialAccount->oauth->user() ?? []]);$isNewSession = true;Event::fire(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account));return redirect()->to($this->getTargetUrl($request));}session()->forget($sessionKey);//本地和测试环境下使用这个if(App::environment()=='local' ||App::environment()=="test"){return $officialAccount->oauth->scopes($scopes)->redirect($request->fullUrl());}$query = $request->getQueryString();$question = $request->getBaseUrl().$request->getPathInfo() == '/' ? '/?' : '?';$url= $query ? $request->getPathInfo().$question.$query : $request->getPathInfo();$url="http://m.baidu.com".$url; //就这一步很重要return $officialAccount->oauth->scopes($scopes)->redirect($url);}Event::fire(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account));return $next($request);}}

然后在kernel.php中的$routeMiddleware添加

"wechat.oauth.baidu.com"=>OAuthAuthenticate::class

然后就可以在路由文件使用了,完工。

nginx 设置代理

这个觉得没有什么好讲的,其实原理很简单,直接上代码

     //在m.baidu.com域名配置下,设置location规则,所有router以/official_account开头的都去wechat.baidu.com下,然后设置跨域location /official_account/{add_header 'Access-Control-Allow-Origin' "$http_origin";add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRF-TOKEN,X-XSRF-TOKEN';add_header 'Access-Control-Allow-Credentials' 'true';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' "$http_origin";add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRF-TOKEN,X-XSRF-TOKEN';add_header 'Access-Control-Allow-Credentials' 'true';#add_header 'Access-Control-Max-Age' 1728000; # 20 天#add_header 'Content-Type' 'text/html charset=UTF-8';#add_header 'Content-Length' 0;return 200;}# 这下面是要被代理的后端服务器,它们就不需要修改代码来支持跨域了proxy_pass http://wechat.m.liaorusanshe.com;#       proxy_set_header Host $host;  proxy_redirect off;#proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 60;proxy_read_timeout 60;proxy_send_timeout 60;}

这个代码配置参考了《Nginx配置实现CORS》,但是直接复制过来,配合proxy_pass会出现400 request header or cookie too large错误, 百度了一下"400 Bad Request Request Header Or Cookie Too Large",<<nginx配置反向代理或跳转出现400问题处理记录>>可以解决,就是如下三个设置有问题,去掉就好了:

         proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

综合分析,应该是nginx在使用proxy_pass做跳转时,如果直接使用域名,且需要向后端提交当前访问的IP地址时,引发nginxbug造成死循环,不知道大家有没有遇到过这种情况。

然后重新启动就好了,完工。

使用nginx代理,支持微信网页授权不同域名相关推荐

  1. 网页授权域名需要加html,如何解决微信网页授权回调域名只能设置一个

    问题 在实际的需求中,我们常常遇到多个部署在不同域名下的业务,想使用同一个「微信服务号」进行微信网页授权.但是微信的网页授权只能设置一个回调地址.为了满足业务需求,有人想到给每个业务部门配置一个微信服 ...

  2. 解决微信服务号授权域名不够用,微信网页授权回调域名只能设置2个的问题!

    前言 最近在做微信网页项目时,发现服务号授权域名只能有两个,而多个项目都需要用到微信授权获取用户信息,这就导致了域名不够用的问题.如果给每个项目都配一个服务号,这显然是不现实的,不仅需要成本而且很浪费 ...

  3. 微信公众号03 微信网页授权

    前提准备 域名 开发微信网页授权时需要一个外网可以访问的域名,因为用户确认进行微信网页授权后微信服务器会通过一个回调URL向开发服务器发送一个回调请求. 开发阶段可以使用一些内网穿透工具来实现,例如: ...

  4. php微信登录代理转发,PHP微信网页授权登录

    PHP微信网页授权登录 2018年04月10日 15:44:03阅读数:601 namespace Org\WeChat; /** * 微信授权相关接口 */ class Wechat { //高级功 ...

  5. 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)

    wechat github 手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP) 概述 公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中 ...

  6. android user-agent iso-8859-1,微信网页授权,错误40163,ios正确,安卓错误?

    2018-07-18:一年时间过去了,我又回来填自己挖的坑了!! 2017年7月,我遇到了这个问题,当时在这里提了问,后来又跟踪了两天,也没彻底搞懂,反正时好时坏,,后来自己主要精力放在H5+开发上, ...

  7. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的" ...

  8. ajax 微信code获取_ajax 实现微信网页授权登录的方法

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个phper ,所以,微信开发采用的是 EasyWeCha ...

  9. 微信wechat.class.php,laravel使用组件实现微信网页授权登入

    laravel框架中的实现简单实现微信网页授权登入 首先引入基于laravel的easywechat的组件,laravel版本5.8 $ cd laravel $ composer require & ...

最新文章

  1. 什么是数据湖(Data Lake)?
  2. ipa包中图片进行了Compress之后的主要处理和作用
  3. Delphi XE5 常见问题解答
  4. 利用运行时设置UITextField 光标颜色
  5. Nexus安装及配置
  6. Winmail邮件服务器
  7. 汽车行驶姿态 -- 初识
  8. c 普通的文本变成注释文本的快捷键_IntelliJ Idea 常用快捷键列表 (2019年总结)
  9. hdu 3401(单调队列优化dp)
  10. java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...
  11. centos普通用户修改文件权限_Linux CentOS更改文件的权限与用户及用户组管理命令...
  12. log4j.properties的配置与详细说明
  13. atitit.提升备份文件复制速度(3) ----建立同步删除脚本
  14. 算法:从有序数组中移除重复的数据26. Remove Duplicates from Sorted Array
  15. 除了迅雷外,还有什么靠谱的BT下载软件?
  16. 未能加载文件或程序集“Microsoft.Web.Infrastructure”
  17. MES如何实现生产过程全追踪
  18. 【方法】Latex多行公式及编号
  19. 秋冬饮品研发没思路?带你看新品5大趋势!
  20. android手机怎么拍月亮,nubia相机怎么拍月亮 努比亚手机相机拍月亮教程

热门文章

  1. [阅读记录]《新ABS_Guide_cn.txt》shell脚本的编写
  2. Com 方法默认参数值设置
  3. 大数据_Flink_数据处理_运行时架构2_作业提交流程_抽象架构---Flink工作笔记0017
  4. C++_类和对象_对象特性_友元_成员函数做友元---C++语言工作笔记054
  5. ES6新特性_浏览器使用ES6模块化引入模块---JavaScript_ECMAScript_ES6-ES11新特性工作笔记042
  6. STM32工作笔记0008---TFT显示屏和LCD显示屏的区别
  7. Git工作笔记004---torisegit使用时Updates were rejected because the tip of your current branch i
  8. pytorch 训练face出现的问题
  9. 用SMO算法实现了SVM的感悟
  10. 杭电5620 KK's Steel