关于内网穿透解决企微本地调试微回调问题
在做企微开发时,本地系统需要做到与企微数据进行实时的同步,以保证本地数据是最新的,保证企业服务人员获取到的客户信息都是最新的,提供更好的服务;
对此,我们就必须要对接企微回调,简单的说,就是企微数据发生变更后,会对我们配置的回调服务地址(回调处理接口)发送请求,并携带变更数据,在本地系统收到请求后进行处理,同步数据,最终达到目的;
问题
回调服务地址必然是需要一个外网可调用地址,自然而然常规的配置下,你本地开发基本就与此绝缘了;
开发过程中还是有很多东西需要进行调试的,如果采用发布线上+日志跟踪的形式进行开发,不是不行,但是效率低的可怕,时间基本都花在了日志分析以及构建发布上,得不偿失;
方案
方案 1:使用本机外网IP
不推荐
使用本地外网IP进行配置,校验可用性请求始终请求不进来,这种方式可能本来就无效,亦或者是我操作有误,最总放弃了;尽管说成功了也无用,毕竟我们使用外网IP是会动态变化的,今天能通过,明天就未必了;
方案 2:使用三方内网穿透服务
不推荐,但无云服务器的可以使用
使用提供内网穿透服务的工具,例如花生壳,上来就给你个免费的外网域名,配置也简单,你并不需要做很多的操作,即可实现内网穿透,此时是已经满足需求了,但是,对,转折来了,源于企微对服务商域名的限制,如果被检测出来你用的域名被列为服务商,则无法继续完成配置,很有可能你从花生壳那拿到的域名就是已经被列为服务商的,所以也无法使用(听朋友说他可以,但是我的确实被标注为服务商的);
方案 3:使用穿透工具搭建
推荐
使用开源的内网穿透工具自己搭建代理环境,实现回调转发到本地,实现目的;自己搭建的弊端就在于你需要准备一些必要资源,例如:拥有外网ip的云服务,但是,很稳定,很安全;
解决
本文就以方案3展示配置;
必要资源:
- 云服务器一台(主要是需要外网IP以及转发)
- 内网穿透工具:fatedier/frp
案例中以Linux作为服务端,windows作为客户端;
服务端frp配置
下载frp包
centos为例,下载如下压缩包,对应系统下载对应包即可:
解压后文件如下:
编辑服务端配置文件
我们需要进行服务端配置文件修改,编辑frps.ini
文件,配重如下:
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的
token = 1a64d751c9b399aa752036609
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
注意:需要调整云服务器的安全组规则,进行端口放行
注册frp系统服务
为了避免每次重启系统都要手动启动frp,这里进行服务注册:
编辑frps.service
文件
sudo vim /lib/systemd/system/frps.service
键入内容如下:
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/{path}/frps -c /{path}/frps.ini
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
注意:需要根据frp目录补全{path}路径
启动、注册frp服务
# 启动frps服务
sudo systemctl start frps
# 注册frps服务
sudo systemctl enable frps
# 查看frps服务状态
sudo systemctl status frps
查看状态如下则表明注册、启动完成
以及管理后台界面打开正常
客户端frp配置
客户端使用的是windows,下载对应的包,解压对frpc.ini
进行配置,配置如下:
编辑客户端配置文件
[common]
# 服务器的公网地址
server_addr = 1xx.1xx.1xx.4x
# 7000为服务端frp与客户端frp相互通信的端口就是我们服务端配置的监听端口
server_port = 7000
# token需要对应到服务端配置
token = 1a64d751c9b399aa752036609
[smb]
# win10文件共享smb协议通过tcp通信
type = tcp
local_ip = 127.0.0.1
# smb协议的本地端口
local_port = 9000
# 设定远程端口,当访问服务器的7002端口时,数据会被转发到本地445端口
remote_port = 7002
注意:以上配置说明本地使用9000端口映射到远程端(服务端)的7002端口,也就是当7002端口发生http请求时,则会映射到本地9000端口,实现穿透;
配置环境变量
为了方便启动,这里进行了环境变量的配置:
启动frpc
frpc -c 'C:\{path}\frpc.ini'
注意:需要根据frp目录补全{path}路径
如下则表明内网穿透成功:
企微回调配置
源于我本就有一个域名,此处就是用了域名进行回调地址配置,当然,你直接使用ip:port问题也不大;
此处我也使用了nginx对域名请求的转发,直接使用ip:port的可以忽略
配置Nginx
添加server
,使得 wework.memoyu.com
域名的请求转发到localhost:7002
server {
listen 80;
server_name wework.memoyu.com;
location / {
proxy_pass http://localhost:7002;
}
}
配置回调地址
需要确保地址是可以检验通过的,否则保存失败
至此,你就可以愉快的在本地进行回调调试了,简直不要太舒服!
当然,这样的方式不仅仅局限于企微开发,同样需要回调调试的都是可以这样进行调试的。
题外话
企微回调题外话(坑)
如果对接过企微回调的都晓得,企微回调URL需要同时支持get、post请求;
当进行url可用性检验时,需要对get接口发起请求,同时,校验加密参数echostr
会通过query进行传输,并且校验加密参数echostr
为base64字符串;
好死不死,base64字符串在query传输的过程中会出现 '+' 变 '空格' 的情况:base64码通过http传输 +号变 空格 问题解决;进而导致解密echostr
失败,校验不通过;也就导致了出现配置同样的回调接口有时候校验通过(当base64中没有'+'时,则不会出现问题),有时候校验失败的诡异现象;