公众号服务端模拟器 (WEMOCK)
参照微信的公开文档,使用 Golang 模拟了部分微信公众平台的接口,方便开发者在测试环境、离线环境下对微信公众号应用的接口和业务逻辑进行脚本化测试,同时也可以对回调接口进行带业务数据的性能测试.
用途:
- 模拟沙箱环境
- 内网自动化测试
- 接口性能测试
- 离线开发
已实现的模拟接口:
- 获取 access_token
- 获取微信服务器IP
- 发送模板消息
-
获取用户列表
- 获取单个用户信息
- 获取多个用户信息
-
接收普通消息
- 文本消息
-
接收事件推送
- 关注/取关
- 扫码
- 菜单点击
-
被动回复消息
- 文本消息
-
OAuth
- 获取 code (为方便测试,简化掉了用户确认步骤)
- 获取 access_token
- 获取用户信息
- 刷新 access_token
- 校验 access_token
-
JsSDK
- 获取 Ticket
本程序对 access_token 和 appid 等参数的对应关系做了校验,以求最大程度上对公众平台进行模拟.
API
- 验证开发者回调接口
- 创建App
- 模拟用户关注
- 模拟生成关注用户
- 模拟用户向开发者发送文本消息
-
模拟发送事件
- 关注/取关
- 扫码
- 菜单点击
- 模拟接收模板消息
- 模拟发送模板消息回执
-
回调接口性能测试
- 关注事件
- 扫码事件
- 文本消息事件
- 菜单点击事件
接口 | 用途 | 参数 |
---|---|---|
/api/app/create | 创建或配置APP | appid / secret / token / url(需urlencode) |
/api/interface | 验证开发者接口 | appid |
/api/user/subscribe | 模拟用户关注 | appid |
/api/user/mock | 模拟生成用户 | appid |
/api/message | 发送文字消息 | appid / to / type / content(需urlencode) |
/api/event | 发送事件消息 | appid / to /type |
/api/message/template | 发送模板消息 | appid / |
/api/message/receipt | 发送模板消息回执 | appid / openid |
备注:暂不支持 AES 加密模式
截图
使用
- 项目需要使用 redis 数据库,请先安装并配置本项目的 config.toml
-
在测试机上将如下域名指向 WeMock 的部署机IP
- api.weixin.qq.com
- 部署项目并配置反向代理和自签名的 HTTPS 证书
- 启动服务
./wemock-server
- 调用接口创建App
- 编写测试脚本
示例
- 创建 App
curl -X GET "https://api.weixin.qq.com/api/app/create?url=http%253A%252F%252F192.168.33.33%252Fwechat%252Fhandler"
Response:
{
"AppID": "wx2f8b270c957f329a",
"Secret": "E7EB221D4DB4C325244D474A9A054B41",
"Token": "69FDC610B891CCA00408FEC98B452D6C",
"EncodingAESKey": "",
"SafeMode": false,
"ServerURL": "http://192.168.33.33/wechat/handler"
}
- 获取 AccessToken
curl -X GET "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx2f8b270c957f329a&secret=E7EB221D4DB4C325244D474A9A054B41"
Response:
{
"access_token": "23_8Z8S686KLkIZ0PYkL28LTlsVqMNTZyLKMIFSD3x39MlgPJ1SDZVHnHJPxMKi1tWxu4pQJ82N6GWfOIGTdSWXbRLGAwD2IkzuZ6G2pEDzqqm4sncCYry12AuHiK8FDcCc46S5IzoOjgm3v9KyBpNlS63Dyh",
"expires_in": 7200
}
- 创建用户
curl -X GET "https://api.weixin.qq.com/wemock/user?appid=wx2f8b270c957f329a"
Response:
{
"code": 0,
"data": [
"MplJ3PWH2jLR8NkKfRtdu1XWfnQE",
"MplJ3Py9ZU1eXeeYaTt96DYWBgPt",
"MplJ3PdyhSsm3PP6S4KCZxQ5IOGt",
"MplJ3PRh4E0LWZVlwipDcLrgzPrG",
"MplJ3PxAE89gN1Qm8obmGu0NgsPM",
"MplJ3P5safgO80H40nCxeCHEYiiK",
"MplJ3PSMrMYqtXi3nOLxYXiGvoYE",
"MplJ3PgcS6FFOqjso2snJB9Ot1UW",
"MplJ3PikgPgDqht7bzEuO9UdY6DK",
"MplJ3PtgMMM5Q17Cs41dfBnHOFf3"
],
"msg": "Generate 10 users."
}
- 验证接口
curl -X GET "https://api.weixin.qq.com/wemock/interface?appid=wx2f8b270c957f329a"
Response:
{
"errcode": 0,
"errmsg": "ok"
}
- 发送文字消息
curl -X GET "https://api.weixin.qq.com/message?appid=wx2f8b270c957f329a&to=rfBd67aBNgOOduDkdg4imfJmQt8K&type=text&content=Hello%2520world%2520%2521"
Response:
{
"errcode": 0,
"errmsg": "1563533818 "
}
- 获取用户信息
curl -X GET "https://api.weixin.qq.com/cgi-bin/user/info?access_token=23_rfBd67ti3SMtYvSgD6xAV1YU00zampta8Z8S686KLkIZ0PYkL28LTlsVqMNTZyLKMIFSD3x39MlgPJ1SDZVHnHJPxMKi1tWxu4pQJ82N6GWfOIGTdSWXbRLGAwD2IkzuZ6G2pEDzqqm4sncCYry12AuHiK&openid=rfBd67aBNgOOduDkdg4imfJmQt8K"
Response:
{
"subscribe": 1,
"openid": "rfBd67aBNgOOduDkdg4imfJmQt8K",
"nickname": "会员_Qt8K",
"sex": 1,
"language": "zh_CN",
"city": "长沙",
"province": "湖南",
"counrty": "中国",
"headimgurl": "",
"subscribe_time": 1563533402,
"unionid": "ti3SMtUKtwtISTcIFOAXlck2SNYk",
"remark": "",
"groupid": 0,
"tagid_list": [],
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 61588,
"qr_scene_str": "WeMock"
}
更改 /etc/hosts 及自签名证书
为了能让我们的程序可以访问模拟服务器,我们需要做如下两件事情:
- 将如下域名指向wemock部署服务器的IP地址
- api.weixin.qq.com
- api2.weixin.qq.com
- sh.api.weixin.qq.com
- sz.api.weixin.qq.com
- hk.api.weixin.qq.com
- open.weixin.qq.com
如果不使用网页授权,可以不添加 open.weixin.qq.com
- 因 api.weixin.qq.com 使用了 https 协议,为减少代码修改量, 我们需要为模拟沙箱环境创建一个自签名的证书并信任它. 您有两种选择:
- 使用我们已经签署好的证书
- 自己创建
自签名SSL证书
为了创建域名证书,我们需要先自己建立一个可以颁发域名证书的机构(rootCA),首先要生成 rootCA 的私钥和根证书.
创建 rootCA Key
openssl genrsa -des3 -out rootCA.key 2048
# echo "myRootCaPassWd" > ./rootCA_password.txt
# openssl genrsa -des3 -out test.key -passout file:rootCA_password.txt 2048
注意牢记密码
创建 rootCA 的 pem 证书
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem
Import rootCA 证书
- Mac
打开钥匙串,左侧选择 [系统], 种类选择 [证书],
将 rootCA.pem 拖入当前窗口.
将其设置为信任(SSL 和 X.509 这两项是必须)
- Debian
Install
cp rootCA.pem /usr/local/share/ca-certificates/mock-mp.crt
sudo update-ca-certificates
remove
rm /usr/local/share/ca-certificates/mock-mp.crt
sudo update-ca-certificates --fresh
- Red Hat / CentOS 6
yum install ca-certificates
update-ca-trust force-enable
cp rootCA.pem /etc/pki/ca-trust/source/anchors/mock-mp.crt
update-ca-trust extract
- Red Hat / CentOS 5
cat rootCA.pem >> /etc/pki/tls/certs/ca-bundle.crt
- Windows
Windows 真的不太会玩,大家自行解决好不好.
为 mp.weixin.qq.com 颁发域名证书
创建 v3.ext 描述文件
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@domain
[domain]
DNS.1 = mp.weixin.qq.com
创建域名证书密钥
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key
创建域名证书
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
至此证书创建完成,
Nginx 可用的域名证书及密钥:
- server.crt
- server.key
妥善保管 rootCA 证书及密钥:
- rootCA.pem
- rootCA.key
免责
- 所有接口内容和业务逻辑均来自腾讯公开文档.
- 使用本程序后对业务系统产生影响或损失由使用者自行承担.