还在公测阶段,在开发平台的时候遇到了一个问题,在此向各位请教一下: 在平台开发完成后需要全网接入检测,检测的时候微信平台会发送一个XML过来,然后开发的平台需要以指定的格式回应,具体文档如下: 1、模拟粉丝触发专用测试公众号的事件,并推送事件消息到专用测试公众号,第三方平台方开发者需要提取推送XML信息中的event_type值,并在5秒内立即返回按照下述要求组装的文本消息给粉丝。 1)微信推送给第三方平台方: 事件XML内容(与普通公众号接收到的信息是一样的) 2)服务方开发者在5秒内回应文本消息并最终触达到粉丝:文本消息的XML中Content字段的内容必须组装为为:event_type + “from_callback”(假定event_type为5,则Content为: 5from_callback) 在发布的时候,微信后台推送过来的XML如下: Plain Text code?
我回复的XML如下: Plain Text code?
但是一直提示失败: | ||||
楼主:【发送事件消息】只需要直接回复一个文本消息(格式参考开发文档,必须加密),只不过Content的内容需要改为:event + “from_callback” 7 8 10楼:【返回Api文本消息】这个比较多步骤: 第一步:获取到query_auth_code的值(query_auth_code将用于第三步接口的调用) 第二步:使用授权码换取公众号的授权信息(授权信息中的authorizer_access_token将用于第三步接口的调用) 第三步:调用发送客服消息api回复文本消息给粉丝(调用接口时的openid为原始数据的FromUserName,content的值为query_auth_code,url参数access_token的值为authorizer_access_token) 第四步:直接返回空字符串 可参考以下代码: C# code?
| |||
【微信开发平台---全网发布文档地址】 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318611&token=&lang=zh_CN NODE实现(java同理) 1.【事件】模拟粉丝触发专用测试公众号的事件,并推送事件消息到专用测试公众号,第三方平台方开发者需要提取推送XML信息中的event值,并在5秒内立即返回按照下述要求组装的文本消息给粉丝。 全部处理代码: console.log("wechat event query:", req.query); logger.debug("wechat event: ", message); var text = message.Event + "from_callback"; logger.log("reply event:", text); //res.reply(""); 全网发布的时候,关键注意不要回复空串(这个比较挫, 跟正常开发时不一样, 相当于接受到事件不通过response回复, 通过api回复文本消息) var wechatApi = WechatAPIFactory.getWechatApi(appid); wechatApi.sendText(message.FromUserName, text, function (err, data) { if(err) { logger.error("事件消息发送失败! text: ", text, " err: ", err); } logger.debug("事件消息发送成功! data:", data); }); 2. 【立即回复普通文本消息】 模拟粉丝发送文本消息给专用测试公众号,第三方平台方需根据文本消息的内容进行相应的响应: 全部处理代码: console.log("wechat text query: ", req.query); logger.debug("wechat text: ", message); if (message.Content === "TESTCOMPONENT_MSG_TYPE_TEXT") { logger.debug("message.Content", message.Content); //本人封装根据授权方appid获取WechatAPI实例。底层实际调用的是开源项目 https://github.com/node-webot/wechat-api var wechatApi = WechatAPIFactory.getWechatApi(appid); var text = "TESTCOMPONENT_MSG_TYPE_TEXT_callback"; wechatApi.sendText(message.FromUserName, text, function (err, data) {//github上的开源项目wechat-api if(err) { logger.error("文本消息发送失败! text: ", text, " err: ", err); } logger.debug("文本消息发送成功! data:", data); }); //sendText 发出去的文本消息报文如下: //var url = this.prefix + 'message/custom/send?access_token=' + this.token.accessToken; //var data = { // "touser": openid, // "msgtype": "text", // "text": { // "content": text // } // }; } 3. 【异步回复普通文本消息】模拟粉丝发送文本消息给专用测试公众号,第三方平台方需在5秒内返回空串表明暂时不回复,然后再立即使用客服消息接口发送消息回复粉丝 全部处理代码: //1. 先直接回复空串 res.reply(""); //2.异步回复 //2.1文本消息中截取query_auth_code var authCode = message.Content.slice(message.Content.indexOf(":") + 1); if (authCode) { logger.debug("authCode: " + authCode); //2.2. 根据query_auth_code换取公众号授权信息 var queryAuth = Q.nbind(openApi.queryAuth, openApi); queryAuth(authCode).then(function (data) { logger.debug("queryAuth callback data:", data); //转换成驼峰的参数名 var authorizationInfo = util.convertToStandardJSON(data[0].authorization_info); logger.debug("authorization info :", authorizationInfo); //2.3. 将token存储到全局,跨进程、跨机器级别的全局,比如写到数据库、redis等 var accessToken = authorizationInfo.authorizerAccessToken; var expiresIn = authorizationInfo.expiresIn; openApi.saveAuthorizerToken(authorizationInfo.authorizerAppid, accessToken, expiresIn, function (err, data) { if (err) { logger.error("access token 保存redis失败!"); } logger.info("access token 保存redis成功!"); //2.4. 通过客户Api消息借口发送文本消息给粉丝 var wechatApi = WechatAPIFactory.getWechatApi(appid); var text = authCode + "_from_api"; wechatApi.sendText(message.FromUserName, text, function (err, data) { if(err) { logger.error("文本消息发送失败! text: ", text, " err: ", err); } logger.debug("文本消息发送成功! data:", data); }); }); //2.5. 保存refresh_token至redis redis.setValue... }).catch(function (err) { logger.error("使用授权码换取公众号的授权信息失败 err:" + err); return; }); } 3. 【接受component_verify_ticket】模拟推送component_verify_ticket给开发者,开发者需按要求回复(接收到后必须直接返回字符串success)。 全部处理代码: //1.保存COMPONENT_VERIFY_TICKET redis.setValue... //2.回复success res.reply(""); PS: reply不是response自带的方法是WechatApi自定义的。 底层实现如下: res.reply = function (content) { res.writeHead(200); // 响应success,用于响应慢的情况,避免微信重试 if (!content) { return res.end('success'); } }; | |
联系客服