经过第一个阶段的工作,公众号服务器方面的配置已经完成,接下来就是开发环境的搭建了。
准备工作请看上一篇文章:
0. 消息的传递路径
1. 启动XShell,开启端口转发
按照上一篇文章对XShell进行配置,启动到服务器的连接以后,端口转发也就在工作了,这样就可以将请求到服务器的操作转发到本地来。
2. 启动HTTP服务,接受公众号服务器发送过来的请求
在本地开启一个HTTP服务,端口要和第一步配置的本地接收端口一致。在点击公众号服务器验证的时候,公众号官方会发送一个GET请求过来,相关的参数如下。
1、signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
2、timestamp 时间戳
3、nonce 随机数
4、echostr 验证成功后,返回的字符串。
5、token 为在公众号设置的token。
在收到GET请求以后,从GET请求中解析出这四个参数。经过如下步骤的运算来完成。
验证流程图
C++的代码示例如下
void CHttpServer::Get_Chat(std::shared_ptr<HttpServer::Response> response, std::shared_ptr<HttpServer::Request> request) {
std::string strSignature = GetHttpParamValue(request, "signature");
std::string strTimeStamp = GetHttpParamValue(request, "timestamp");
std::string strNonce = GetHttpParamValue(request, "nonce");
std::string strEchoStr = GetHttpParamValue(request, "echostr");
{
std::vector<std::string> strArray;
strArray.push_back(strTimeStamp);
strArray.push_back(strNonce);
strArray.push_back(g_strTOKEN);
std::sort(strArray.begin(), strArray.end());
std::string strSHA1Src = strArray[0] + strArray[1] + strArray[2];
SHA1Util util;
util.update(strSHA1Src);
std::string strSha1 = util.final();
if (strSha1 == strSignature)
{
LOG_INFO(ms_loger, "My Base64:{} Org Base 64:{}", strSha1, strSignature);
}
else
{
LOG_ERR(ms_loger, "My Base64:{} Org Base 64:{}", strSha1, strSignature);
}
}
*response << "HTTP/1.1 200 OK
Content-Length: " << strEchoStr.length() << "
"
<< strEchoStr;
}
至此,验证流程结束。
3. 文本消息的收发
公众号的消息收发采用同一个URL不同请求方式的形式。
比如上一步的验证URL是 https://www.dennisthink.com/WeChat, 请求方式为GET。那么接收消息的URL也是 https://www.dennisthink.com/WeChat, 只是请求方式变成了POST。
从POST接收到的消息是XML格式的,具体的每一个部分的含义,在官方文档 接收普通消息 有定义。
收到消息以后,可以根据 官方文档的被动回复消息 进行消息的回复。
对于订阅号已经支持这样的功能了,如果您有什么问题,欢迎给我留言交流。