这2天接触了微信服务号的开发, 分享一下我的小技巧
存在问题
由于需要和微信服务器进行主动和被动通信. 在做微信开发进行调试时会比较麻烦
- access token, 的获取需要到微信后台添加服务器ip白名单, 不在白名单中ip 无法获取, 而本地开发端的ip经常变化, 且添加ip到白名单还需要惊动公众号管理员
- 微信需要主动推消息给我们后台配的服务器地址, 而本地网络端通常不能被公网中其他端, 直接访问到.
- 开发中有时需要给其他人测试, 又是公网问题
解决方法
由于以上问题的存在, 很多人直接选择在服务器端调试. 不过这真的很烦, 每次改动都要上传. 首先去申请个测试公众号, 当然, 如果你开发的公众号还没开始运营,也可以不申请.
- 把本地端口暴露到公网, 且绑定一个固定公网ip
在开发端执行(如果是win下, putty也有建立隧道的方法,请自行百度之)
ssh -N -v -R 3000:127.0.0.1:80 [email protected]
app.dev.peterq.cn 是我的一台拥有公网ip的服务器
这个命令会让app.dev.peterq.cn监听127.0.0.1:3000, 并把所有数据传给本机ssh, shh再把数据转发到127.0.0.1:80(这里可以是任何你电脑能访问的ip和端口)
由于app.dev.peterq.cn监听的是它的本地端口, 外网还是访问不到这个代理端口的. 我们借助nginx(其他服务器软件也行啦)实现,新增nginx虚拟主机:
server {
listen 80;
listen [::]:80;
server_name app.dev.peterq.cn;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
}
这样就能通过 http://app.dev.peterq.cn 直接访问到你本地开发的项目啦,而且不影响你服务器原有web应用, 你可以在微信后台把相关配置填写app.dev.peterq.cn这个域名的了, 微信将能正常的主动向你的开发端发起通信
- 解决获取access_token的ip限制. 由于本地开发端的公网ip时常变动, 而添加ip至白名单又不方便, 所以我们把app.dev.peterq.cn的服务器ip地址加入白名单并让其代理获取.
app.dev.peterq.cn 这里可以写个脚本(这个脚本你就不要在转发到3000端口啦, 不然数据转一圈又回来了)例如:
然后本地端, 如果你使用easy wechat 包的话, 可以这样设置
$wechat = new \EasyWeChat\Foundation\Application($options);
$wechat->access_token->setToken(json_decode(file_get_contents('http://app.dev.peterq.cn/token.php?secret=your_secret'))->access_token);
- 同一份代码区分开发环境和线上环境.
上面代理获取token是在开发环境下, 线上是不需要代理获取的, 那么怎么在用同一份代码的情况下区分呢. 可以用不同的配置文件. 而我是这样解决的:
在开发端的nginx配置添加:
location ~ \.php$ {
fastcgi_param APP_DEV_MODE true;
}
修改上述提到的代码:
$wechat = new \EasyWeChat\Foundation\Application($options);
isset($_SERVER['APP_DEV_MODE']) and $wechat->access_token->setToken(json_decode(file_get_contents('http://app.dev.peterq.cn/token.php?secret=your_secret'))->access_token);
The end!
欢迎阅读及投稿: laravel5.5框架解析 (ps: 最近太忙, 好多天没更新了)