分类归档

网站开发

FWQ
小程序
微信开发之接收事件推送和消息排重
在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型。包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜单相关事件等。本篇一一进行讲解。 上一篇也提到了,微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。这样的话,问题就来了。有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中。类似于pc端网站的注册。可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂。如送积分啊,写用户日志啊,分配用户组啊。等等……一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完成,微信服务器又给我们的服务器推送了一条相同的关注事件,我们将再次执行我们的那些逻辑,这样就有可能导致数据库中出现重复的数据(有的童鞋就会说了,我在之前先判断当前是否已经存在了,如果存在了就不执行插入的操作。我想说的是,我当初也是这样想的,但真实的运行环境和我们的调试环境还是有差距的,直到发现数据库中有不少重复的用户信息时,我才发现消息去重的重要性。)。 消息的去重普通消息和事件消息是有区别的。普通消息使用msgid,而事件消息使用FromUserName + CreateTime。我的思路是: 新建类BaseMsg,有三个分别是FromUser,MsgFlag,CreateTime。代码如下: public class BaseMsg     {        /// <summary>         /// 发送者标识        /// </summary>         public string FromUser { get; set; }        /// <summary>         /// 消息表示。普通消息时,为msgid,事件消息时,为事件的创建时间        /// </summary>         public string MsgFlag { get; set; }        /// <summary>         /// 添加到队列的时间        /// </summary>         public DateTime CreateTime { get; set; }     } 登录后复制 创建个列表_queue,用来存储消息列表,列表的类型是List . 在处理微信消息体前,首先判断列表是否实例化,如果没有实例化则实例化,否则判断列表的长度是否大于或等于50(这个可以自定义,用处就是微信并发的消息量),如果大于或等于50,则保留20秒内未响应的消息(5秒重试一次,总共重试3次,就是15秒,保险起见这里写20秒)。 获取当前消息体的消息类型,并根据_queue判断当前消息是否已经请求了。如果是事件则保存FromUser和创建时间。如果是普通消息则保存MsgFlag。下面是代码: if (_queue == null)             {                 _queue = new List<basemsg>();             }            else if(_queue.Count&gt;=50)             {                 _queue = _queue.Where(q =&gt; { return q.CreateTime.AddSeconds(20) &gt; DateTime.Now; }).ToList();//保留20秒内未响应的消息            }             XElement xdoc = XElement.Parse(xml);            var msgtype = xdoc.Element("MsgType").Value.ToUpper();            var FromUserName = xdoc.Element("FromUserName").Value;            var MsgId = xdoc.Element("MsgId").Value;            var CreateTime = xdoc.Element("CreateTime").Value;             MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype);            if (type!=MsgType.EVENT)…
2024-11-25 阅读全文 →
FWQ
小程序
微信如何将小程序放入聊天顶部
如何将小程序放入聊天顶部? 首先打开微信客户端,点击底部的【发现】按钮,步骤截图如下所示: 点击【小程序】,步骤截图如下所示: 点击右上角的【搜索】按钮,步骤截图如下所示: 小编这里以“美团外卖”为例来演示操作。输入“美团外卖”后点击键盘右下角上的【搜索】按钮,步骤截图如下所示: 点击搜索到的小程序,进入小程序界面,步骤截图如下所示: 进入小程序后,点击界面右上角的【自定义】按钮,步骤截图如下所示: 点击【显示在聊天顶部】,步骤截图如下所示: 可以看到小程序直接显示在了聊天界面,而且还是置顶显示,以后再次使用该小程序,就非常的方便了,步骤截图如下所示: 以上就是如何将小程序放入聊天顶部的详细内容,更多请关注米云其它相关文章!
2024-11-25 阅读全文 →
FWQ
小程序
微信开发之列表渲染多层嵌套循环
入门教程之列表渲染多层嵌套循环,目前官方的文档里,主要是一维数组列表渲染的案例,还是比较简单单一,给刚入门的童鞋还是无从入手的感觉。 <view>  {{index}}: {{item.message}} </view> 登录后复制   还有一个九九乘法表把数据直接写到wxml里的,并不是动态二维数组的列表渲染。 <view>  <view>  <view>  {{i}} * {{j}} = {{i * j}}  </view>  </view></view> 登录后复制 那么今天,我们主要来讲讲动态多维数组和对象混合的列表渲染。 讲解 何为多维数组和对象混合,给个很简单的例子 twoList:[{  id:1,  name:'应季鲜果',  count:1,  twodata:[{ 'id':11, 'name':'鸡脆骨'  },{ 'id':12, 'name':'鸡爪'  }]…
2024-11-25 阅读全文 →
FWQ
CMS教程
phpcms如何配置数据库
数据库配置文件位置:caches/configs/database.php 打开这个配置文件,加入我们的数据库配置信息。数据库配置信息为二维数组结构,默认为default,可以根据default结构配置多个数据库链接(如:extended_1) 具体如下:  <?php return array (   'default' => array (      'hostname' =&gt; 'localhost',      'database' =&gt; 'phpcms',      'username' =&gt; 'admin',      'password' =&gt; 'admin',      'tablepre' =&gt; 'v9_',      'charset' =&gt; 'gbk',      'type' =&gt; 'mysql',      'debug' =&gt; true,      'pconnect' =&gt; 0,      'autoconnect' =&gt; 0    ),     /* 以下默认不存在 */    'extended_1' =&gt; array (      'hostname' =&gt; '10.10.125.2',      'database' =&gt; 'phpcms',      'username' =&gt; 'admin',      'password' =&gt; 'admin',      'tablepre' =&gt; 'v9_',      'charset' =&gt; 'gbk',…
2024-11-25 阅读全文 →
FWQ
小程序
开发小程序遇到403错误怎么解决
问题分析: 我们知道当前端程序向后台服务器发送请求时,如果服务器不允许跨域请求,就会发生403错误(错误信息为:“Invalid CORS request”)。那么该怎么解决这个问题呢? (学习视频分享:) 解决方法: 将信任的域配置到CORS允许的源地址列表中,如下代码所示: @Bean public CorsFilter corsFilter() {    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    CorsConfiguration config = new CorsConfiguration();    config.setAllowCredentials(true);    config.addAllowedOrigin("http://localhost:3000");    config.addAllowedOrigin("http://127.0.0.1:3000");    config.addAllowedOrigin("http://127.0.0.1:55135");    config.addAllowedHeader(CorsConfiguration.ALL);    config.addAllowedMethod(CorsConfiguration.ALL);    source.registerCorsConfiguration("/**", config);    CorsFilter bean = new CorsFilter(source);    return bean; } 登录后复制 对于微信小程序的开发,情况有点不一样,由于微信小程序只允许以域名方式的https连接,因此通过花生壳等内网穿透工具,搭建了一个外部可访问的公网域名,公网域名指向内部地址。 在调试时,就遇到了非法的跨域请求这个问题。其原因是在向后台服务器请求时,微信开发者工具在请求头中,带上了Origin字段,因此服务器判断是一个跨域请求。通过Fiddler等工具可以抓包看到如下信息: POST https://xxx.xxx.net/public/login HTTP/1.1Host: sharework.gicp.netConnection: keep-aliveContent-Length: 50Pragma: no-cacheCache-Control: no-cacheOrigin: http://127.0.0.1:55135User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/1.02.1902010 MicroMessenger/6.7.3 Language/zh_CN webview/ token/e011a64b71b385130aa1f595fe48521ccontent-type: application/jsonAccept: */*Referer: https://servicewechat.com/wx955fc9354838fd46/devtools/page-frame.htmlAccept-Encoding: gzip, deflate, br {"account":"user","password":"defaultPassword123"} 登录后复制 原因就在这里了。如果直接在手机上预览或调试则不会遇到这个问题。…
2024-11-25 阅读全文 →
FWQ
小程序
微信小程序必须买域名吗
微信小程序必须自己申请域名的是因为: 目前小程序代bai码包限制在2M之内,好多du东西都没法在代码包中加载zhi,只能通过第三方web后台管理,后台是第三方的,是一个web网站,网站必须有服务器,然后注册域名,把第三方web网站建好之后,然后去小程序后台,配备服务器域名,再把你开发好的小程序上传、审核、发布,最后去web后台去装修小程序。 资料拓展: 微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。 四大特性 1.无需安装随时可用,这是它最技术的特性。  2.触手可及。  3.用完即走。  4.无需卸载。 推荐教程:《》 以上就是微信小程序必须买域名吗的详细内容,更多请关注米云其它相关文章!
2024-11-25 阅读全文 →
FWQ
小程序
微信用户与姓名不匹配是什么意思?
微信用户与姓名不匹配是指实名认证中填写的身份证号和姓名与微信号绑定信息的不一致。解决方法:打开微信,点击“我的”,再点击“支付选项”,然后点击页面右上角的三个点图标,打开后点击“实名认证”选项,进行修改“实名认证”即可。 微信用户与姓名不匹配是指填写的身份证号和姓名与微信号绑定信息的不一致。 以微信7. 0. 13版本为例,在使用微信的时候,提示微信用户与姓名不匹配,首先可能是用户微信绑定的信息需要与注册页面填写的信息没有保持一致导致的,建议用户查看填写的身份证号和姓名是否与微信号绑定信息的一致。 其次,可能是用户将姓名写成了身份证号码导致的,建议用户检查一下是不是填写错了,若错了,只需修改一下再重新提交就可以了。 微信使用技巧:在使用手机微信的时候,若用户想要查看自己微信账号认证的个人信息,只需打开手机,从手机桌面找到微信app并打开。 进入app后点击切换到我的页面,接着点击支付选项,然后点击页面右上角的三个点图标,打开后点击实名认证选项,进入到实名认证中心页面就可以看到自己账号的个人信息了。 更多相关知识,请访问 !! 以上就是微信用户与姓名不匹配是什么意思?的详细内容,更多请关注米云其它相关文章!
2024-11-25 阅读全文 →
FWQ
小程序
微信小程序之换肤功能的实现方法
pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css;把当前皮肤类型存入本地;然后通过js读取并判断当前应该加载哪套css。本文主要和大家详细介绍了微信小程序实现换肤功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 由于微信小程序没有操作wxss的api,所以实现的方式有点不一样,大致如下:   1.需要换肤的wxss,正常的wxss。   2.每个页面都引入换肤的wxss(因为换肤每个页面都需要改变)。   3.在app.js的globalData里设置默认的皮肤类型。   4.每个页面onload的时候,读取storage里的数据并设置当前皮肤类型的值。 例子: 第一步:结构 <view>  <view>   <view></view>    </view></view> 登录后复制 备注:由于不能直接操作微信小程序的根节点page,要实现全屏背景色的修改,只能模仿一个高度宽度都是100%的p(view)。上面就是class为page的这个p(view)。    id='{{SkinStyle}}’,设置id是为了根据当前皮肤类型,让皮肤的wxss样式的权重大于正常wxss样式的权重,这样有时候就没必要加上!important了。    根节点page需要在wxss中设置width:100%;height:100%。然后设置class为page的p(view)宽高都是100%。这样就相当于有个能操作的根节点page了。    {{SkinStyle!==”normal”?”icon-moon”:”icon-sun”}}这句是判断当前的皮肤类型,如果是normal就是icon-sun,否则就是icon-moon。  第二步:样式wxss 皮肤wxss: #dark {  background: #333; } #dark .header .h-skin{  color: white; } 登录后复制 正常wxss: .page .header .h-skin {…
2024-11-25 阅读全文 →
FWQ
小程序
用Java设计模式中的观察者模式开发微信公众号的实例代码
这篇文章主要介绍了用Java中的开发微信公众号的例子,这里Java的微信SDK等部分便不再详述,只注重关键部分和开发过程中观察者模式优点的体现,需要的朋友可以参考下 还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总有一两个人在门口把风——如果有什么风吹草动,则会立即通知里面的同伙紧急撤退。也许放风的人并不一定认识里面的每一个同伙;而在里面也许有新来的小弟不认识这个放风的。但是这没什么,这个影响不了他们之间的通讯,因为他们之间有早已商定好的暗号。呵呵,上面提到的放风者、偷窃者之间的关系就是观察者模式在现实中的活生生的例子。 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义间的一种一对多的依赖关系,当一个对象的发生改变时,所有依赖于它的对象都得到通知并被自动更新。在这里先讲一下设计的一个重要原则——单一职责原则。因此系统的每个对象应该将重点放在问题域中的离散抽象上。因此理想的情况下,一个对象只做一件事情。这样在开发中也就带来了诸多的好处:提供了重用性和维护性,也是进行重构的良好的基础。因此几乎所有的设计模式都是基于这个基本的来的。观察者模式的起源我觉得应该是在GUI和业务数据的处理上,因为现在绝大多数讲解观察者模式的例子都是这一题材。但是观察者模式的应用决不仅限于此一方面。 好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。看一张图: 其中每个使用者都有上图中的3条线,为了使图片清晰省略了。如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:1、服务号就是主题,业务就是推送消息2、观察者只需要订阅主题,只要有新的消息就会送来3、当不想要此主题消息时,取消订阅4、只要服务号还在,就会一直有人订阅好了,现在我们来看看观察者模式的类图: 接下来就是代码时间了,我们模拟一个微信3D彩票服务号,和一些订阅者。首先开始写我们的主题,和观察者接口: package com.zhy.pattern.observer; /** * 主题接口,所有的主题必须实现此接口 * * @author zhy * */ public interface Subject { /** * 注册一个观察着 * * @param observer…
2024-11-25 阅读全文 →
FWQ
小程序
微信公众平台开发历史上的今天
一、历史上的今天 回顾历史的长河,历史是生活的一面镜子;以史为鉴,可以知兴衰;历史上的每一天,都是喜忧参半;可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的。 这里你可以阅读每一天的历史故事,每天发生了哪些大事,历史上谁诞生和逝世了,每天都是什么纪念日、节日,在这里你都可以容易浏览到!在我们生活中,日历是一个简单而重要的工具,只要翻开不同年份的日历,你会发现日期的排布总是一样的,在每一年我们都会经历相同的一天,比如元旦或圣诞节,就好像我们每一天出门,总会从门口经过一样。就在这简单的一天里,在历史上曾经发生过许多不同寻常的事情,甚至是改变世界历史的事情。这些历史事件发生的时间和意义被牢牢地记录在历史书籍上,也许你会碰巧发现一些重要的历史事件发生的日期就是你出生的那一天。如果幸运的话,也许你的生日会和某一个重要节日重合,这是多么有趣的事情啊!因此我们编写了这一套以日期为顺序的阅读百科书籍,让读者知道在自己生日那一天,或者是在自己感兴趣的那一天里,在历史上都发生过什么重要的事情,使读者为自己出生的那天而自豪,激励读者为自己的理想而努力奋斗   二、数据源 下列一年三百六十六天(含闰年2月29日)。点击某天,可查阅以往该日历史。 1月12345678910111213141516171819202122232425262728293031     2月1234567891011121314151617181920212223242526272829       3月12345678910111213141516171819202122232425262728293031     4月123456789101112131415161718192021222324252627282930      5月12345678910111213141516171819202122232425262728293031     6月123456789101112131415161718192021222324252627282930      7月12345678910111213141516171819202122232425262728293031     8月12345678910111213141516171819202122232425262728293031     9月123456789101112131415161718192021222324252627282930      10月12345678910111213141516171819202122232425262728293031     11月123456789101112131415161718192021222324252627282930      12月12345678910111213141516171819202122232425262728293031         三、预览      实现代码: <?php define("TOKEN", "weixin"); $wechatObj…
2024-11-25 阅读全文 →