首页 > PHP资讯 > 工具库 > php微信公众账号开发遇到的五个坑总结

php微信公众账号开发遇到的五个坑总结

工具库
这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

///  /// 接收微信发送的XML消息并且解析 ///  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) {  //记录错误日志 } } ///  /// 回复消息 ///  /// 
/// 返回目标字节数组是否位于源字节数组的开始private bool StartsWithBytes(byte[] source, byte[] target){ if (source == null && target == null) return true; if (source == null && target != null || source != null && target == null) return false; if (source.Length < target.Length) return false; bool startsWith = true; for (int i = 0; i < target.Length; i++) { if (source[i] != target[i]) {  startsWith = false;  break; } } return startsWith;}

是不是以为这就算完事了,我的乖乖,头像上传了,微信摄像头也特么该调用的调用了,宝宝好幸福,宝宝也是牛人一个了,记住前面的东东,宝宝还没有说坑呢。
来重复我们的第九个坑,特么的,你JS写个for循环要是能循环把图片上传到后台,宝宝也服气,真的,宝宝服气。

直接说吧,最后我自己想了下,也和队友讨论了下,可能是因为微信有什么验证,导致之后一张图片上传成功之后,才能进行一张,但是我们Iphone就是特么的特例,大Android没用问题的,就是Iphone有了问题,而且问题不小,上传四张图片吧,老特么是最后一张,最后,找到了万能的网友,感谢你,不过宝宝已经忘记了在哪里找到的了,尴尬了。。。。。。。。。。。


<script type="text/javascript"> var types = 2; var urlList=""; var i = 0; function up(resurl) {  if (i < resurl.localIds.length) {  // 上传照片resu.localIds[i]  wx.uploadImage({   localId: '' + resurl.localIds[i],   isShowProgressTips: 1,   success: function (res) {   // alert("res.serverId:" + res.serverId);   mediaId = res.serverId;   $.ajax({    async: false,    type: "post",    url: "/ActivityRegistration/DownloadWxPhoto",    data: { mediaId: mediaId, types: types },    success: function (data) {    $("#picPath").append('
  • '); $("#picture" + i).attr('src', data.result); $("#picPath").append(''); i++; if (i == resurl.localIds.length - 1) { $("#picPath").append('
  • '); } up(resurl); } }); } }); } else { i = 0; } } //上传图片 wx.config(@Html.Raw(ViewBag.config)); wx.ready(function () { $("#picPath").click(function () { wx.chooseImage({ count: 3, // 默认9 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有'original', sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (resu) { var localIds = resu.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 if (localIds.indexOf("wxlocalresource") != -1) { localIds = localIds.replace("wxlocalresource", "wxLocalResource"); } @(index += 1) if (localIds != '') { $("#picPath").html(""); var sear = new RegExp(','); if (sear.test(localIds)) { up(resu); } else { $("#picPath").append('
  • '); $("#picture" + "@index").attr('src', localIds); // 上传照片 wx.uploadImage({ localId: '' + localIds, isShowProgressTips: 1, success: function (res) { mediaId = res.serverId; $.ajax({ async: false, type: "post", url: "/ActivityRegistration/DownloadWxPhoto", data: { mediaId: mediaId, types: types }, success: function (data) { $("#picPath").append(''); $("#picPath").append('
  • '); } }); } }); } // $("#picPath").append('
  • '); } } }); }); }); wx.error(function (res) { alert("接口验证失败,详细信息:n" + JSON.stringify(res)); }); 《script》

    请记住,递归就特么可以了。

    说到这里,宝宝已经不想多说什么了,特么的产品你能不能不装逼,你特么见过那个微信能回复一个信息直接跳转网页的,你咋不去屎呢,联想到前几天大阿里的月饼时间,突然感觉我们程序员挺悲剧的,成功的都是特么的产品,然后出问题的都是我们程序员的锅?试问一下,这个锅真心我们程序员该背么。

    算了,还是不吐槽了,已经无力了。。。。宝宝92年降临,现在确实82年的皮肤呀,唉,宝宝累了,真的。

    顺便给点H5页面的建议吧。比如当点击返回键的时候,我们需要刷新页面的时候,就是所谓的判断页面要不要刷新,这里有很多种方法,但是微信里面宝宝还是觉得这么干靠谱。


    <script type="text/javascript"> if (window.name != "hasLoad") { location.reload(); window.name = "hasLoad"; } else { window.name = ""; }《script》

    还有,那个微信执行完成之后想直接退出当前界面进入微信公众号界面的,直接调用微信的一个内置的方法即可。记得写到《script》《script》里面。

    WeixinJSBridge.call('closeWindow'); //这是微信关闭当前网页

    这么自信的以为自己搞定了所有,你跑呀,你要跑起来,嗯哼,别不服气。

    微信公众账号指第十坑,我自己加的,哈哈,就是前面的JS验证的时候,你不要头文件,怎么搞定这些事情,哈哈。是不是宝宝赢了。Oh perfect,I like it。

    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js">《script》

    以上就是php微信公众账号开发遇到的五个坑总结的详细内容,更多请关注php中文网其它相关文章!

    工具库

    本文由欣才IT学院整理发布,未经许可,禁止转载。
    支持32不支持0