今天记录一个微信公众号后端开发中遇到的问题。
一、问题描述
客户希望能动态生成带参数的微信二维码,用户扫描后,服务端能接收二维码中的参数进行逻辑处理。
先简单梳理一下流程:
- 调用微信的生成带参数的二维码接口,生成二维码。
- 服务端提供回调接口,用于接收微信发送的扫描带参数二维码事件
步骤1的开发没有难度,直接调用相应接口就能完成。重点说一下步骤2,既然是回调接口,那就意味着需要提供一个接口,供微信服务器来调用。可是本地环境在局域网内,微信无法访问到,开发的时候怎么才能方便的调试呢?
本地开发通常都是使用微信测试号,在测试号里也是可以配置服务器地址的。那能把本机地址配上去吗?显然是不能的。
二、解决方案
先说结论:借助ngrok工具进行内网穿透。ngrok的文档中有这样一句话:
Expose a local web server to the internet。
翻译过来就是“把本地的web服务器暴露在公网上”,那就着能通过公网访问本地的web服务器,我们不就是希望能在本地环境方便的开发、调试吗?这就达到了目的。
步骤:
-
从ngrok的官网上下载好,然后启动。我这里映射到了本地环境的8000端口。
image.png -
在测试号中配置好服务器信息,提交。
image.png
扩展知识
-
微信测试号的消息传递只支持明文传输,如果有消息加密的需求,那该怎么办?这时就要借助微信公众平台接口调试工具了,接口类型选消息接口调试,接口列表选事件消息,加密调试选安全模式,输入参数就可以进行接口调用了。
image.png
-
有的开发者有真实的微信公众号,想基于微信公众号在本地环境直接开发。由于ngrok的域名被微信限制,所以是无法直接配置的。在配置之前,开发者可以在微信中随机访问一下。比如我这里在微信中访问了上面用到的域名http://7fdb639cca98.ngrok.io。
image.png
那这种情况是不是就不能用ngrok了呢?办法也是有的。首先你得有一台独立的外网服务器,然后安装好nginx,配置一个反向代理。配置极其简单。
location / {
proxy_pass http://7fdb639cca98.ngrok.io;
}
然后用你外网服务器的域名或者ip替换掉ngrok的域名就可以了。这是我配置好之后的结果。我们会发现域名发生了改变,不是ngrok的地址,变成了我外网服务器的ip地址。
image.png
小结
- 接收、处理微信的消息、事件可以借助内网穿透工具解决,对于主动发起调用微信接口的方式不会受限制。
- 进行服务器配置时,微信会向服务器发起一个验证消息的请求,开发者需要提前实现该接口,否则也是配置不成功的。
- 消息加解密传输的代码,微信官方提供了实现。可以直接前往微信公众平台开发-接入查看和下载,更具体的消息加解密方案可以查看消息加解密接入指引。
网友评论