WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台

公众号服务端模拟器 (WEMOCK)

参照微信的公开文档,使用 Golang 模拟了部分微信公众平台的接口,方便开发者在测试环境、离线环境下对微信公众号应用的接口和业务逻辑进行脚本化测试,同时也可以对回调接口进行带业务数据的性能测试.

WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台_第1张图片

用途:

  • 模拟沙箱环境
  • 内网自动化测试
  • 接口性能测试
  • 离线开发

已实现的模拟接口:

  • 获取 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 加密模式

截图

WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台_第2张图片

WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台_第3张图片

WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台_第4张图片

WEMock, 公众号服务端模拟器,一个可以随身带走的微信公众平台_第5张图片

使用

  • 项目需要使用 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 及自签名证书

为了能让我们的程序可以访问模拟服务器,我们需要做如下两件事情:

  1. 将如下域名指向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

  1. 因 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 证书

  1. Mac

打开钥匙串,左侧选择 [系统], 种类选择 [证书],
将 rootCA.pem 拖入当前窗口.
将其设置为信任(SSL 和 X.509 这两项是必须)

  1. 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
  1. 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
  1. Red Hat / CentOS 5
cat rootCA.pem >> /etc/pki/tls/certs/ca-bundle.crt
  1. 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

免责

  • 所有接口内容和业务逻辑均来自腾讯公开文档.
  • 使用本程序后对业务系统产生影响或损失由使用者自行承担.

你可能感兴趣的:(测试环境搭建,微信公众平台,微信开发,微信公众号开发)