微信接入调试方案

微信接入是个很头疼的东西,主要原因是 webhook 的 url 必须是服务器地址,无法在开发机上调试。
目前为止我用的方案是在服务器上抓包在本地模拟,配合单元测试把功能开发完成后,再放到服务器上调试,但调试过程中难免要对代码做修改,体验很不好。
最近受不了这么折腾,脑洞大开地想把服务器上的请求直接 proxy 到本地,然后发现 ssh 自带了这个功能。

主要的东西就是 ssh 的 -R 参数,这里假设微信后台填的 webhook URL 是 http://wechat.lazybee.me,本地开发环境开的端口是 http://127.0.0.1:8000,整个转发流程是这个样子的

1. Nginx 把 wechat.lazybee.me 的请求转发到其它端口,比如 10000 端口。(因为 80 端口上还有其它服务在跑,不能暴力转发 80 端口所有请求)

server {
    listen 80;
    server_name wechat.lazybee.me;

    location / {
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 在本地开一个到服务器的转发通道。(要求服务器开启 sshd 服务)

ssh lazybee.me -R 10000:127.0.0.1:8000

3. 让本地开发环境监听 8000 端口。

这样就可以直接在本地边开发边测试了,当然别忘了根据微信的规则配置 OAuth2.0网页授权 等参数。

我自己的开发环境通常会改 host,然后在本地开个 dnsmasq 让 iOS 或 Android 设备用本地的 dns,就可以很大程序上模拟真实环境了。