首页 > 开发 > PHP > 正文

php微信公众账号开发之五个坑(二)

2024-05-04 22:52:44
字体:
来源:转载
供稿:网友

上篇说到微信公众账号的几个坑,前面五个,已经说到菜单,宝宝继续往下赘述了。可惜,还不知道宝宝的宝宝到底是不是心疼宝宝呢,完了,我凌乱了。。。 

回到正题,我们就不吐槽其他的了,上一篇说到微信的菜单了,那么,我们现在说说菜单回复等等的吧。 

菜单回复是需要处理XML文件的,我们根据微信返回的XML文件,可以得到每个微信用户相对于微信公众号的唯一标识。微信公众平台的机制简单的将就是我们自己输出固定格式的xml文件,然后微信APP负责解析,得到我们想要的信息,然后对信息统一处理。 

第六坑,如果你看微信文档,那么,绝对坑死你,上图。这里的ToUserName和FromUserName一定特么的要分清楚了,记住,千万不要写反了,用户对于微信而言是A→B,那么微信对于用户就是反着来的,貌似现在应该说清楚了。

/// <summary> /// 接收微信发送的XML消息并且解析 /// </summary> private void ReceiveXml() { try {  Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;  byte[] requestByte = new byte[requestStream.Length];  requestStream.Read(requestByte, 0, (int)requestStream.Length);  string requestStr = Encoding.UTF8.GetString(requestByte);  if (!string.IsNullOrEmpty(requestStr))  {   //封装请求类  XmlDocument requestDocXml = new XmlDocument();  requestDocXml.LoadXml(requestStr);  XmlElement rootElement = requestDocXml.DocumentElement;  WxXmlModel WxXmlModel = new WxXmlModel();  if (rootElement != null)  {   WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName") == null ? "" : rootElement.SelectSingleNode("ToUserName").InnerText;   WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName") == null ? "" : rootElement.SelectSingleNode("FromUserName").InnerText;   WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime") == null ? "" : rootElement.SelectSingleNode("CreateTime").InnerText;   WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType") == null ? "" : rootElement.SelectSingleNode("MsgType").InnerText;   switch (WxXmlModel.MsgType)   {   case "text"://文本    WxXmlModel.Content = rootElement.SelectSingleNode("Content") == null ? "" : rootElement.SelectSingleNode("Content").InnerText;    break;   case "image"://图片    WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl") == null ? "" : rootElement.SelectSingleNode("PicUrl").InnerText;    break;   case "event"://事件    WxXmlModel.Event = rootElement.SelectSingleNode("Event") == null ? "" : rootElement.SelectSingleNode("Event").InnerText;    if (WxXmlModel.Event != "TEMPLATESENDJOBFINISH")//关注类型    {    WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey") == null ? "" : rootElement.SelectSingleNode("EventKey").InnerText;    }    break;   default:    break;   }  }  ResponseXML(WxXmlModel);//回复消息  }  } catch (Exception ee) {  //记录错误日志 } } /// <summary> /// 回复消息 /// </summary> /// <param name="WxXmlModel"></param> private void ResponseXML(WxXmlModel WxXmlModel) { string XML = ""; switch (WxXmlModel.MsgType) {  case "text"://文本回复  var info = oauth.GetUserInfo(Tools.WA_GetAccess_Token.IsExistAccess_Token(), WxXmlModel.FromUserName);  Tools.WAEntity.OAuthUser user = Tools.JsonHelper.ParseFromJson<Tools.WAEntity.OAuthUser>(info);  var content = WxXmlModel.Content.ToUpper();  string NcbActUrl = ConfigurationManager.AppSettings["NcbActUrl"];  string appid = ConfigurationManager.AppSettings["AppID"];  if (content.Contains("T"))//接受的文字如果包含T  {   //业务处理  }  else  {   XML = ResponseMessage.ReText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, "/:rose农场大数据欢迎你!/:rose");  }  break;  case "event":  switch (WxXmlModel.Event.ToLower())  {   case "subscribe":   if (string.IsNullOrEmpty(WxXmlModel.EventKey))   {    XML = ResponseMessage.ReText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, "关注成功!/:rose");   }   else   {    XML = ResponseMessage.SubScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码先关注后推送事件   }   break;   case "scan":   XML = ResponseMessage.ScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码已关注 直接推送事件   break;   case "click"://处理单击事件   if (WxXmlModel.EventKey == "p1")   {    //自己的业务逻辑   }   else   {    //自己的业务逻辑   }   break;   case "unsubscribe"://取消关注   break;  }  break;  default://默认回复  break; } Response.Write(XML);//输出组织的XML信息 }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表