打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
微信公众号第三方平台全网发布问题(公众号登录授权)

还在公测阶段,在开发平台的时候遇到了一个问题,在此向各位请教一下:

在平台开发完成后需要全网接入检测,检测的时候微信平台会发送一个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?
1
<xml><ToUserName><![CDATA[gh_3c884a361561]]></ToUserName> <FromUserName><![CDATA[ozy4qt1eDxSxzCr0aNT0mXCWfrDE]]></FromUserName> <CreateTime>1426561271</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[LOCATION]]></Event> <Latitude>111.000000</Latitude> <Longitude>222.000000</Longitude> <Precision>333.000000</Precision> </xml>

我回复的XML如下:
Plain Text code?
1
<xml><ToUserName><![CDATA[ozy4qt1eDxSxzCr0aNT0mXCWfrDE]]></ToUserName><FromUserName><![CDATA[gh_3c884a361561]]></FromUserName><CreateTime>1426561271</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[LOCATIONfrom_callback]]></Content><FuncFlag>0</FuncFlag></xml>

 但是一直提示失败:








楼主:【发送事件消息】只需要直接回复一个文本消息(格式参考开发文档,必须加密),只不过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?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//全网发布:3、模拟粉丝发送文本消息给专用测试公众号[返回Api文本消息]
            if (response.MsgType == "text" && response.Content.IndexOf("QUERY_AUTH_CODE") > -1)
            {
                XmlDocument doc = new XmlDocument();
                XmlNode xnRoot;
                doc.LoadXml(receiveMessage.XmlForDecrypt);
                xnRoot = doc.FirstChild;
                string query_auth_code = xnRoot["Content"].InnerText;
                query_auth_code = query_auth_code.Replace("QUERY_AUTH_CODE:""");
 
                //调用接口:使用授权码换取公众号的授权信息
                string data = string.Empty;
                data += "{";
                data += "\"component_appid\":\"" + weixinPlatformConfig.AppId + "\" ,";
                data += "\"authorization_code\": \"" + query_auth_code + "\"";
                data += "}";
                string json = HttpHelper.Post("https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=" + weixinPlatformConfig.ComponentAccessToken, data);
                Whir.Foundation.Context.AppService.LogService.Log(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "使用授权码换取公众号的授权信息", json);
 
                string authorizerAccessToken = new Regex(
                            "(?i)\"authorizer_access_token\":\"(?<data>[^\"]*)\"",
                            RegexOptions.IgnoreCase
                            | RegexOptions.CultureInvariant
                            | RegexOptions.IgnorePatternWhitespace
                            | RegexOptions.Compiled
                            ).Match(json).Groups["data"].Value;
 
                //调用发送客服消息api回复文本消息给粉丝
                string accesstoken = authorizerAccessToken;
                string openid = response.FromUserName;
                var dataMessage = string.Empty;
                dataMessage += "{";
                dataMessage += "\"touser\":\"" + openid + "\",";
                dataMessage += "\"msgtype\":\"text\",";
                dataMessage += "\"text\":";
                dataMessage += "{";
                dataMessage += "\"content\":\"" + query_auth_code + "_from_api" "\"";
                dataMessage += "}";
                dataMessage += "}";
                string jsonMessage = HttpHelper.Post("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accesstoken, dataMessage);
                Whir.Foundation.Context.AppService.LogService.Log(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "发送客服消息", jsonMessage);
 
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.Write(string.Empty);//回复空字符串
                Whir.Foundation.Context.AppService.LogService.Log(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "全网发布:3、模拟粉丝发送文本消息给专用测试公众号"string.Empty);
                HttpContext.Current.Response.End();
            }






【微信开发平台---全网发布文档地址】
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');
      }
    };
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[Python]web.py连接新浪微博
做时间的朋友 —— 用印象笔记打造时间记录工具
Excel一个单元格里有多个数字,怎么让每个数字加100?
Flask 用户名密码登录获取token
rest架构+跨域访问+JWT校验
微信开发平台全网发布
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服