订餐系统之微信点餐

  经过几天的开发、测试微信点餐demo终于完成了,特在此分享下,不好的地方请大家多指正下哈!一开始,就想这东西出来这么久了,网上应该有很多现成的东西,于是,baidu、google了半天,基本没发现现成的东西,也许是我搜索不得其道,也有可能大家都不愿意分享吧...于是,还得自己动手,丰衣足食!

  还是先交代下背景:所谓“微信点餐”,其实就是用户通过微信app,关注公众号,发送指定类型的信息,如地理位置信息,网站返回相关链接到微信上,通过这些链接进入wap或者html5网站,然后开始选择商家、点餐、提交订单等。关于微信app,与订餐网站的关系,我简单的画了一个图,比较潦草,请别喷得太厉害了!如图1,说简单点:微信app通过微信服务器,传给订餐网站(申请公众号时,会输入一个地址,微信服务器就是通过此地址post,get消息的),网站根据收到的消息,返回具体信息,再通过某些信息的链接进入wap或者html5站点。微信公众平台地址:https://mp.weixin.qq.com/ ,这几天好像升级了,不叫公众号了,叫订阅号。

    

                                  (图1)

  至于,如何申请、如何关注,这里就不赘述了,你懂的。要说明的是:关注后,订餐网站会收到一个用户关注的消息,网站返回一段说明文字,提示如何操作等信息,如图2:

          

                                                 (图2)

  

  下面,我就把我自己设计的处理微信消息的代码介绍下吧,不好的地方,请大伙儿多给我指正指正。还是先上一张UML模型图吧,关于依赖和关联的关系,真不怎么弄得明白,所以都有依赖的关系表示了下,这张图片不是很清晰,有兴趣的可以下载源文件看下uml.rar,见图3:

      

  

  下面还是简单对几个类进行说明下吧,这样大家看得明白点。

  BaseNotice.cs,此类表示消息基类,因为每个消息都有几个字段是相同的,如ToUserName、FromUserName、CreateTime、MsgType等,所有抽象出一个基类,此类还有一个抽象方法LoadXml,根据xml返回类的对像的实例。其他具体消息继承此类,加上自己特定的信息。

     text.cs ,此类表示文本消息类,除了有BaseNotice中有的属性外,还有一个Content,表示文本信息内容。且实现LoadXml方法,返回一个text实例,代码如下:

/// <summary>/// 文本消息/// </summary>public class text : BaseNotice{/// <summary>/// 根据xml返回对像/// </summary>/// <param name="xml"></param>/// <returns></returns>public override BaseNotice LoadXml(string xml){text notice = new text();//<xml>//<ToUserName><![CDATA[toUser]]></ToUserName>//<FromUserName><![CDATA[fromUser]]></FromUserName> //<CreateTime>1348831860</CreateTime>//<MsgType><![CDATA[text]]></MsgType>//<Content><![CDATA[this is a test]]></Content>//<MsgId>1234567890123456</MsgId>//</xml>
System.Xml.XmlDocument d = new System.Xml.XmlDocument();d.LoadXml(xml);System.Xml.XmlCDataSection n = d.SelectSingleNode("/xml/ToUserName").FirstChild as System.Xml.XmlCDataSection;notice.ToUserName = n.Value;n = d.SelectSingleNode("/xml/FromUserName").FirstChild as System.Xml.XmlCDataSection;notice.FromUserName = n.Value;//n = d.SelectSingleNode("/xml/CreateTime").FirstChild as System.Xml.XmlCDataSection;//notice.CreateTime = n.Value;
n = d.SelectSingleNode("/xml/MsgType").FirstChild as System.Xml.XmlCDataSection;notice.MsgType = n.Value;n = d.SelectSingleNode("/xml/Content").FirstChild as System.Xml.XmlCDataSection;notice.Content = n.Value;//n = d.SelectSingleNode("/xml/MsgId").FirstChild as System.Xml.XmlCDataSection;//notice.MsgId = n.Value;return notice;}/// <summary>/// 消息内容  /// </summary>public string Content{get;set;}}
View Code

  location.cs,此类表示地理位置消息类,除了有BaseNotice中有的属性外,还有Location_X(纬度),Location_Y(经度)等信息。实现代码与text.cs差不多,这里就不再贴了。

    BaseHandler.cs,表示处理消息的基类,定义了一个抽象方法HandleNotice,由具体处理类,去实现,代码比较简单,如下:

 /// <summary>/// 处理消息基类/// </summary>public abstract class BaseHandler{protected BaseNotice notice;public BaseHandler(BaseNotice _notice){notice = _notice;}/// <summary>/// 处理消息,每个子类重写此法/// </summary>/// <returns></returns>public abstract string HandleNotice();}
View Code

  TextHandler.cs,此类表示处理文本信息的类,对用户发送的文本进行处理,然后返回相关信息。按上面的描述,发送“d”或者“订单”,返回今天的订单,其他文本,直接返回说明信息。代码如下:

/// <summary>/// 文本信息处理类/// </summary>public class TextHandler : BaseHandler{public TextHandler(BaseNotice _notice): base(_notice){}/// <summary>/// 文本信息处理方法,如果文本信息 = d,返回今天订单/// </summary>/// <returns></returns>public override string HandleNotice(){StringBuilder backmsg = new StringBuilder();text model = (text)base.notice;backmsg.Append("<xml>");backmsg.Append("<ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName>");backmsg.Append("<FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName>");backmsg.Append("<CreateTime>" + DateTime.Now.Ticks + "</CreateTime>");string Content = "";if (model.Content.ToLower().Trim() == "d" || model.Content.ToLower().IndexOf("订单") >= 0){ETogoOrder dal = new ETogoOrder();StringBuilder ordermsg = new StringBuilder("");IList<ETogoOrderInfo> orderlist = dal.GetList(3, 1, " tempcode='" + model.ToUserName + "' and ordertime > '"+DateTime.Now.ToShortDateString()+"' ", "dataid", 1);if (orderlist.Count > 0){ordermsg.Append("今日订单");foreach (var item in orderlist){ordermsg.Append("\r\n订单号:");ordermsg.Append("\r\n" + item.OrderID);ordermsg.Append("\r\n订单时间:" + item.orderTime.ToShortTimeString());ordermsg.Append("\r\n订单状态:" + ConfigHelper.TurnOrderState(item.State));IList<FoodInOrderInfo> foodlist = new EOrderFood().GetAllByOrderID(item.OrderID);foreach (var food in foodlist){ordermsg.Append("\r\n" + food.FoodName + "(" + food.FoodPrice + "x" + food.Num + ")");}ordermsg.Append("\r\n==================");}}else{ordermsg.Append("您今天还没有订餐点哦");ordermsg.Append("\r\n==================");}Content = ordermsg.ToString();}else//其他地方返回原信息
            {Content = ConfigHelper.GetConfigBackMsg();}backmsg.Append("<Content><![CDATA[" + Content.ToString() + "]]></Content>");backmsg.Append(" <MsgType><![CDATA[text]]></MsgType>");backmsg.Append(" </xml> ");return backmsg.ToString();}}
View Code

  LocationHandler.cs,此类用于处理地理位置信息,和TextHandler.cs代码差不多,就是实现了HandleNotice方法。

    NoticeFactory.cs,此类表示根据消息类型,返回具体处理类,用了简单工厂,每次要增加具体消息处理类,这还要加个分支,有点纠结,代码如下:

/// <summary>/// 根据消息类型,返回对像/// </summary>public class NoticeFactory{const string AssemblyPath = "Hangjing.Weixin";//用于反射public static BaseHandler CreateInstance(string xml){BaseHandler handler = null;//解析数据System.Xml.XmlDocument d = new System.Xml.XmlDocument();d.LoadXml(xml);System.Xml.XmlCDataSection n = d.SelectSingleNode("/xml/MsgType").FirstChild as System.Xml.XmlCDataSection;HJlog.toLog("MsgType=" + n.Value);Type type = Type.GetType(string.Format(AssemblyPath + ".{0}," + AssemblyPath, n.Value.Trim()), false, true);BaseNotice noticemodel = (BaseNotice)Activator.CreateInstance(type);if (noticemodel != null){noticemodel = noticemodel.LoadXml(xml);switch (noticemodel.MsgType){case "text":handler = new TextHandler(noticemodel);break;case "event":handler = new EventHandler(noticemodel);break;case "location":handler = new LocationHandler(noticemodel);break;default:break;}}else{HJlog.toLog("noticemodel=mull");}return handler;}}
View Code

 weixinHelper.cs,此类封装了一些基本操作,如验证消息是否来来自微信服务器,获取微信服务器post来的消息,最主要的还是处理消息的地方,不管添加多少消息类型,这里都不用修改,代码如下:

 /// <summary>/// 根据接到的信息,返回内容/// </summary>/// <returns></returns>public string HandleData(){string userdata = reciveData();string backmsg = "";BaseHandler handler = NoticeFactory.CreateInstance(userdata);//根据不同消息类型,返回具体处理类,if (handler != null){backmsg = handler.HandleNotice();HJlog.toLog("handler != null " + backmsg);}else{HJlog.toLog("handler == null ");}return backmsg.ToString();}
View Code

  客户端(指在公众平台设置的那个链接)代码就相对简单了(不过判断是否网站接入的不知道是什么时间调用的),代码如下:

protected void Page_Load(object sender, EventArgs e){weixinHelper wx = new weixinHelper(Context);if (wx.isJoin())//如果是网站接入
        {Response.Write(wx.isValidRequest());Response.End();//HJlog.toLog("如果是网站接入");return;}else//接收消息
        {Response.Write(wx.HandleData());//HJlog.toLog("接收消息");
            Response.End();return;}}
View Code

  通过返回的链接,进入网站后,就全是html5的事儿了,第一次写,还真是用了不少时间。写得不好,代码就不贴了,上几个截图吧【html5界面为我家妞妞制作,妞妞辛苦了^_^】:

  

 

  

  以上就是微信点餐相关内容了,其实也就那点事儿,写得不好,见谅,有兴趣的就扫一扫吧,如果你也开发这方便的,一起交流下:

                        

 

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点餐系统测试

一、设计测试用例 二、提交BUG a)BUG 一 标题:兼容性差&#xff0c;只能在Chrome浏览器和火狐浏览器上使用 1.版本号&#xff1a;V0009 2.测试环境&#xff1a;Chrome 浏览器 版本号 96.0.4664.45 火狐 浏览器 版本号 97.0.1 操作系统&#xff1a;win10 3.测试数据…

点餐系统详解

一、项目简介 “民以食为天”餐饮行业作为传统行业&#xff0c;传承着中国五千年来的饮食文化&#xff0c;现如今互联网发展迅速&#xff0c;随着餐厅的规模扩大&#xff0c;并伴随年轻消费者的崛起&#xff0c;网上点餐&#xff0c;逐渐成为一项必不可少的功能&#xff0c;传…

【Android】线上自助点餐系统

【Android】线上自助点餐系统 效果视频商品选购界面效果图商品数据商品标题文件商品详细文件信息商品图片 添加商品数据解析左侧标题数据解析右侧商品数据 左侧标题与右侧商品双向绑定加减按钮监听所选商品存入数据库 商品复选效果图取出商品数据商品清空商品增删 支付界面效果…

点餐系统的开发,php后台+微信小程序 实现完整的餐厅点餐系统。

对于我们的日常生活来说&#xff0c;微信点餐小程序使用十分广泛&#xff0c;使用微信小程序进行点餐已经成为如今的新餐饮消费方式之一&#xff0c;小程序的入口就隐藏在微信中&#xff0c;背靠微信大流量平台&#xff0c;坐拥数以万计的用户。对于商家来说&#xff0c;使用微…

chatgpt弄的 简单的点餐系统 不知道怎么样

点餐系统可以提高餐厅的效率和客户的体验&#xff0c;因此在许多情况下非常有用。 对于餐厅&#xff0c;点餐系统可以帮助管理顾客的订单&#xff0c;包括快速和准确地获取顾客的点餐信息&#xff0c;避免了人工点餐的错误&#xff0c;减少服务员的工作负担&#xff0c;提高服务…

17行python代码,openai帮你实现下班自由

chatgpt最近火到不行&#xff0c;AI受到了前所未有的关注&#xff0c;openai作为开发团队不仅仅开发了一个在线尝鲜的聊天机器人&#xff0c;也提供API并且提供了python语言的的pypi库。 火出圈的聊天机器人是chatgpt3,既然排行老三&#xff0c;就说明这个张飞的前面还有大哥刘…

安卓手机超强的悬浮窗工具

看到一个挺好用的安卓悬浮窗工具&#xff0c;仅作分享 该款工具是安卓上的一款应用&#xff0c;名字叫fooView 安装之后便会出现在手机主界面中的左下方或者是右下方&#xff01; 怎样操控球球&#xff1f; 按住它&#xff0c;向上滑动即可打开程序和文件管理器。也可以直接…

[日常折腾之码上归一]多种编程语言打印当前系统时间

之前做PIC粒子模拟时程序通常跑好几天&#xff0c;为了对比不同网格、粒子数等条件下的运行天数&#xff0c;我养成了一个在程序运行程序开始和程序运行结束分别打印当前时间戳的习惯&#xff0c;并坚持了3个多月。下面结合自己的实践经历&#xff0c;分别使用不同编程语言打印…

chatgpt赋能python:Python免费编程软件介绍

Python免费编程软件介绍 Python是一种功能强大且易于学习的编程语言&#xff0c;因此在全球范围内受到广泛使用。除了许多付费的编程软件外&#xff0c;Python还拥有许多优秀的免费编程软件&#xff0c;为用户带来了更多的选择和方便。以下将扼要介绍几个著名的Python免费编程…

线性插值和双线性插值

先讲一下线性插值: 已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值(反过来也是一样,略) 上面比较好理解吧,仔细看就是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。离哪个点近,那个点对最后的值共享越多。双线性插值本质上就是…

MATLAB复习高等数学下册(8.0)

Matlab是一款科学计算软件&#xff0c;可用于数据分析、图形绘制、模型建立、算法设计和数值计算等方面。Matlab使用MATrix LABoratory的缩写&#xff0c;即矩阵实验室&#xff0c;最初是为数值计算和线性代数而设计的&#xff0c;但后来也扩展到了其他领域&#xff0c;如图像和…

C++调用matlab编译动态库方法及相关问题解决

目录 参考链接&#xff1a;1、C调用matlab代码的方法1.1、Library Compiler 方法1.1.1、功能1.1.2、参考链接1.1.3、matlab编译动态库方法1.1.4、C 使用matlab编译动态库的传参方法1.1.4.1、演示把一个cv::Mat单通道影像传入matlab编译的dll中,解析matlab返回的变量1.1.4.2、下…

【Matlab】画一只简单的小猫

这个其实是用ChatGPT生成的 % 定义猫的轮廓点坐标 x [-1 -1 -0.5 -0.5 0.5 0.5 1 1]; y [0.5 -0.5 -1 -0.5 -0.5 -1 -0.5 0.5];% 绘制猫的轮廓 plot(x, y, LineWidth, 2);% 添加猫的眼睛 hold on; plot(-0.4, 0.2, ko, MarkerFaceColor, k, MarkerSize, 6); plot(0.4, 0.2, …

MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、语法二、变量声明三、目标函数四、约束条件五、函数六、cvx特有的数学运算表达式七、常见错误八、进阶阅读参考资料 前言 本文是在最近学习MATLAB CVX工具…

记一次累累累的过往:在Linux环境下的项目实现

写在前面&#xff1a;当你看到这篇文章的时候&#xff0c;我有可能已经完成了这个实训&#xff0c;这是边做边写的一个叙事流&#xff0c;或者是什么私心分享流&#xff09;。 大书记官艾尔海森为你写诗:) 任务背景&#xff1a; 在任意环境下实现ARP欺骗&#xff08;主&#…

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

Prompt learning 教学[技巧篇]&#xff1a;通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案 技巧1&#xff1a;To Do and Not To Do 在问答场景里&#xff0c;为了让 AI 回答更加准确&#xff0c;一般会在问题里加条件。比如让 AI 推荐一部电影给你 Recomme…

对含有中英文的文本去除停用词 结巴分词

对含有中英文的文本去除停用词 分词 这里的停用词表可以自己定义或者采用网上的 是文本分类 情感分析进行预处理的步骤 from collections import Counter import jieba**# jieba.load_userdict(userdict.txt) **# 创建停用词list**** def stopwordslist(filepath):stopwords …

一、(4) 结巴分词词性提取

一、&#xff08;4&#xff09; 结巴分词词性提取 代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Tue May 14 14:45:01 2019author: sun """ import jieba.posseg as psg import codecs# 建立结果保存路径 result codecs.ope…

结巴分词加字典分词词性标注

1 代码 import jieba import jieba.posseg as pseg jieba.load_userdict("data/entity_noun_dic.txt") jieba.add_word(word"重置", tag"v") jieba.del_word("送别") jieba.del_word("人流量")result pseg.cut("请问光…

使用斯坦福分词器进行词性标注

使用斯坦福分词器进行词性标注 文章目录 使用斯坦福分词器进行词性标注前言一、斯坦福分词器是什么&#xff1f;二、使用步骤1.去官网下载工具包2.导入库3.斯坦福模型功能的介绍4.分词结果展示5.分词结果进行分析 三、总结 前言 中文分词是中文文本处理的一个基础步骤&#xf…