游客发表
微信公众平台的公众开发调试,卡住过不少人。号端你本地跑着一个服务,口映端口是程序8080或者3000,微信那边要求回调URL必须是公众公网可访问的80端口。这中间隔着一道墙,号端你得想办法把墙凿个洞。口映
最土的程序办法是买台云服务器,把代码部署上去。公众但每次改一行代码都要重新部署,号端等着上传、口映重启、程序看日志,公众几分钟就耗掉了。号端我认识一个做公众号开发的口映哥们,他为了调试一个支付回调,一天部署了四十多次,整个人都麻了。后来他换了个思路——本地跑着,用内网穿透把本地端口映射出去。
工具选型上,ngrok是老牌选手,但免费版速度不稳定,而且域名每次重启都会变,你得去公众号后台重新配置URL,很烦。frp稍微折腾一点,不过胜在可控。花生壳也还行,就是免费版限速限得厉害,传个大点儿的图片响应能卡三秒。
我自己的做法是:服务器上跑一个frps,本地跑frpc,把本地8080端口映射到服务器的80端口。这样微信请求打到服务器80,frps转发到本地,本地处理完再原路返回。整个过程对微信来说,它就是访问了一个标准的公网HTTP服务,完全不知道背后其实是你笔记本上的一个进程。
关键细节在配置上。frps那边监听7000端口做控制通道,同时把服务器的80端口绑定给本地转发。frpc这边指定本地IP是127.0.0.1,端口是8080。有个坑——公众号后台要求回调URL必须以http://或https://开头,而且不能带端口号。所以服务器上80端口必须空出来,别让nginx或者Apache占了。
还有token验证的问题。你第一次在公众号后台填URL时,微信会发一个GET请求过来,带个echostr参数,你的程序得原样返回才能通过验证。很多人卡在这一步,其实不是代码问题,是内网穿透没配好,请求根本没到本地。排查办法很简单——本地程序里打个日志,看有没有收到微信的请求。收不到,问题就在穿透链路上;收到了但验证失败,才需要检查签名逻辑。
映射通了之后,调试体验会好很多。改完代码,本地服务自动重启,微信那边再发消息过来,走的还是同一条链路,不用改任何配置。省下的时间够你多写好几个功能模块。
最后提个醒——内网穿透是有安全风险的。你的本地服务暴露在公网上,意味着任何人都能访问到。开发调试用用没问题,别图省事把生产环境也这么搞。真上线了,老老实实部署到正规服务器上,该配HTTPS配HTTPS,该设防火墙设防火墙。工具是拿来提高效率的,不是拿来埋雷的。
友情链接