微信公众号开发---验证服务与回复消息

经过第一个阶段的工作,公众号服务器方面的配置已经完成,接下来就是开发环境的搭建了。

准备工作请看上一篇文章:

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\r\nContent-Length: " << strEchoStr.length() << "\r\n\r\n"
			<< strEchoStr;
	}

至此,验证流程结束。

3. 文本消息的收发

公众号的消息收发采用同一个URL不同请求方式的形式。

比如上一步的验证URL是 https://www.dennisthink.com/WeChat, 请求方式为GET。那么接收消息的URL也是 https://www.dennisthink.com/WeChat, 只是请求方式变成了POST。

从POST接收到的消息是XML格式的,具体的每一个部分的含义,在官方文档 接收普通消息 有定义。

收到消息以后,可以根据 官方文档的被动回复消息 进行消息的回复。

对于订阅号已经支持这样的功能了,如果您有什么问题,欢迎给我留言交流。

猜你喜欢

转载自www.cnblogs.com/Dennis-mi/p/12592231.html