好长一段时间没在博客上写文章了哈(///▽///),这段时间确实好多事啊……现在在素质课上写了这篇文章,记录下我下午做的一些尝试。

为什么做这件事呢?这段时间里,我以开发者的身份被安大小白这个校园公众号组织接受,他们的后台现在是瘫的,目前存在的一些功能全部是靠腾讯微校+人工回复+安大通引流撑着,想自己做一些查询功能,是完全没门的。他们把我招进来,是希望我能在还在百事通(小白以前的名字)的时间里,把公众号的后台复活一下,然后能在下一次招新之后带好几位能承担之后往公众号加功能的新人。我就把这个任务接受了呗。他们已经给了我不少物质之外的东西,我也很愿意尽心帮他们做好复活这件事,当成回报吧。

该进入说技术部分的环节了。后台之前有一位16的学长在写,不过他的进度,不敢让人恭维。之前问他进度的问题,他也直接说了,我可以从零开始,自己搞一套。学长之前是用Golang复活后台。我接触了一下Go之后发现这款语言的确在web、并发这种特定环境下挺优秀,所以就决定后台沿用下来Go。学长自己是想把后台的网络交互手写一下,不过这点我和他想法就不一样,我更倾向选一款成熟的框架,把需要的功能“填”出来就行。只要最后结果做的出来,用框架又不低人一等(ーー;),抓到老鼠就是好猫呗。于是我选了这个框架:WeChat SDK for Go (微信SDK:简单、易用)。GitHub上采用Go语言的微信公众号服务段框架中,它的star数是第二,并且last commit的时间最靠前,所以就选了它,作为之后很多工作的基础框架。

之后是要把这个框架部署到服务器。公众号云服务器的登录信息,我不知道该怎么催才能从学长那里要过来了……所以这次尝试我直接用了自己的服务器。开始的过程差不多描述如下 😂:

git clone ...
cd ... 
ls ... 
vim ...
cd ... 
ls ... 
vim ...
...

之后问题来了,我想编译它给的例程http.go,却怎么都编译不过去了,错误信息就是编译器在GOPATH下找不到这个源文件里用到的package。最后搜索发现,有两点问题让我在编译环节卡住了:

  • 源文件里写的包名称github.com/…/…并不是让编译器自动从往网上下载包去满足依赖问题的,而是让编译器从本地名为github.com/…/…的文件夹里,去找到需要的包的。而这个文件夹,是通过这个命令:
go run github.com/silenceper/wechat

把需要的包下载到GOPATH中。

  • 但很不幸,还有问题。报错中的路径挺混乱的,不过观察一下错误路径会发现问题在哪:GOPATH中,应该是按照Go的project structure,在该文件夹中预先建好子文件夹src、pkg、bin,然后把GOPATH指向这个文件夹。改过GOPATH后,重新跑一下go run …命令,这次处理的挺不错,包、源代码都在GOPATH中该在的位置。

能跑起来它的例程之后,下面是看微信公众平台这边的配置了。给微信公众号指定服务器时,需要完成一次由原先腾讯的公众号管理后台对自己的服务器的功能验证。这个验证的过程就是:公众号给自己的服务器提交一个HTTP/GET请求,然后自己的服务器按照微信公众号开发文档的约定,对这个GET请求进行回复。如果腾讯的管理后台收到了恰当的回复,那么判定自己的服务器是能工作的。否则会给出验证失败的结果。通过在浏览器中看开发者页面里的流量监视,还能看到具体的全局错误号,知道到底验证过程中有没有出问题,出了什么问题。这个过程中,腾讯只认目标服务器的80端口……如果自己硬去用其他端口,那只会收到一个“System Error”的返回错误。这个设置其实还挺聪明,和国内运营商对80端口的管制恰恰是吻合的。不过我用的是国外的服务器啊,所以开启80端口本身对我并不是问题。不过,我还是被各种错误返回码锤到怀疑人生……在第n次翻http.go不到100行的例程时,我发现它是在监听服务器的8001端口。而腾讯后台这里一直尝试在向80端口发送它的特殊GET请求。而我80端口在跑着自己的博客,并不知道应该怎么去处理腾讯后台的GET请求,所以导致了一次又一次的报错。我换了自己的另一台80端口没有被占用的服务器,安装上Go环境,把例程发送到那台机器上,之后让腾讯后台的请求发送到这台服务器,emm,得到成功的提示了。

但光是在那台服务器上成功并不够。那台服务器所在的网络环境算是比较恶劣的,肯定支撑不起来后面把大量功能都往上面放。我还是得想办法在跑自己博客的机器上同时跑起来公众号后台。但我又不想改动自己网站的任何参数。于是我有了这个需求:我可以在服务器上原先博客的文件夹中另行建一个文件夹,比如ylinknest.top/wx,wx就是我在原先的根路径新建的文件夹。然后把通过服务器外部的80端口发起的对wx文件夹中任何资源的请求,转换为服务器内通过8001端口(例程里用的8001,换成6666也不是不可以,当然如果是1024以下的端口,需要root权限)对wx内资源的请求。这样就避免了80端口的冲突问题,同时满足了公众号和博客对外部80端口访问的需求。能满足吗?(不行的话也就没这篇博文了)我的网站后台的http框架是用了nginx。nginx是支持反向代理的,这个问题的解决就是在它的配置文件里加进去反向代理的描述。直接上我在nginx配置文件中加入的代码:

location /wx 
{
		proxy_pass http://localhost:8001; 
		proxy_set_header  Host  $host; 
		proxy_set_header  X-Real-IP  $remote_addr; 
		proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
}

这段代码加载了server语句块里面。大意就是把对根目录下/wx文件夹内资源的请求转到对服务器自身8001端口的请求。保存之后,跑起来例程,然后从腾讯的管理后台再去做验证,OK,成功了。公众号后续的开发就有了一个比较良好的运行环境,我也算完成掉了小白这边一周里想做掉的工作目标。