订餐系统之同步美团商家订单

引子   

     早上和往常一样去工商大学打球,除了今天三分比较准外,一切都还是那样的循规蹈矩。

   也许股子里还有那么一些不甘平庸,总想着能改变一下如此无趣的按部就班。

   转过行政楼,一波一波的学生在谈笑风生。哦,是了,又到拍毕业照片的时间了。

   又是一年过去了(也不知从何时起,开始以毕业来计年了),弹指一挥间,已经在这里工作7年半了。

   一份工作越是做得久,反到越羞于提起。也许是羞于现状,也是羞于未来的我吧。说不清,道不明,有点乱...

   脚步也随着不安的思绪加快了频率,迅速的穿过了人群...未来还需多努力,希望明年此时,能多一份从容。

   ——————————触景生情,些许伤感,回归主题——————————

背景

  之前写过一篇关于同步饿了么订单的文章《订餐系统之同步饿了么商家订单》,有不少人加我咨询,感觉有这方面需求的人还是满多的,毕竟现在2家几乎瓜分了市场,再做平台已然机会渺茫了,但是商户毕竟需要服务,订单还得配送出去。然后饿了

么,美团外卖都提供了面向供应商的api的权限的申请,这对我们做配送系统的说,真是一大利好。以前都是让商户手动录入其他平台的订单,费力还容易出错。还得在多个app之间来回切换,商户也是抱怨满天。有了这些接口,商户可以选择自动接单,

自动同步订单,再也不用几个app来回切换了。饿了么同步订单,在上面的文章中已经介绍了,虽然接口现在变成2.0了。有了一些变化,总的来说还是 万变不离其宗。本篇就来详细接受下同步美团订单的相关步奏。写得不对地方,欢迎指正 :)

  具体流程,下图中写得比较详细。

  

   

申请

  去年过年,因娃太小,没能回家,闲在杭州,发现可以申请美团外卖相关接口,欣喜若狂,撸起袖子就动了起了,登录申请网站地址《美团点评 | 聚宝盆餐饮开放平台》,填写相关信息。记得,当时是2月5号,再2天就过年了,想着如果能年前审核好...,当然,后来是想多了,过了一个月都没有审核通过,也不能进行下一步。到时那个心呀,难过,没有还好,现在是看得见,不让用。经过漫长的煎熬,终于在一个不起眼的地方,发现一个邮箱,怀着死马当活马医的想法,发过去了,想不到,还真给回复了,说是过年漏掉了申请。好嘛,审核通过了总是好的,过程是复杂了些。

  这里通过了,他们会加你QQ,确认相关信息,还会快递一份文件,签字盖章,按说明快递回去就OK了。

  审核通过,开放平台里有相关信息了。关键的东西就是 developerId,与SignKey 。调用接口会用到

  

 

  开入平台文档地址:《文档中心》,也许你看了文档,都不用看下面的:)。

回调接口设置

  开始开发前,先要设置好回调,通知接口。美团外卖会根据在开放平台设置的通知地址,发送相关信息,比如新订单通知,商家确认订单通知,及绑定,解绑商家通知等。这里每个通知一个接口,这样程序蛮方便的,可以一个通知,一个url。不用去判断到底是什么通知。

在下图中设置

  

 

门店映射

  所谓映射,就是把你系统的商家编号,与美团商家绑定起来,以后推送都是自己系统的商家编号推送过来。方便操作

  对接第一步,还是绑定商家,并保存Token(后面的操作都会用到)。

    绑定操作就是访问连接 https://open-erp.meituan.com/storemap?developerId=100019&businessId=2&ePoiId=8859&signKey=8bl1g62omy2m5ywp&ePoiName=湘北人家&netStore=1

  输入商家账号,密码选择商家授权即可完成映射

具体参数可以参考文档, 其中 ePoiId 为自己系统的商家编号,像我就直接用自动编号,这个方便记录,后台绑定也方便,订单通知过来也方便。比如,我们最后的效果就是在商家详情中增加相关设置。

  

  

  在回调接口设置中,设置了url后,会收到通知,处理通知的代码如下。

 Response.Clear();
        Response.Write("{\"data\":\"success\"}");
        Hangjing.AppLog.AppLog.Info("美团门店与ERP绑定接收token回调URL");

        System.IO.Stream stream = Request.InputStream;//这是你获得的流
        if (stream != null && stream.Length > 10)
        {

            Hangjing.AppLog.AppLog.Info("stream.Length :" + stream.Length);
            string jsondata = "";
            using (StreamReader reader = new StreamReader(stream))
            {
                jsondata = reader.ReadToEnd(); ;
            }
            //保存 appAuthToken
            Hangjing.AppLog.AppLog.Info("回调URL信息:" + jsondata);

        }

  

  既然有映射商家,就是有解除绑定的操作,同样,在回调接口设置中,设置了url后,会收到通知,处理通知的代码如下。 这里记录,主要是为了方便后台操作,知道当前商家是否绑定。

        Response.Clear();
        Response.Write("{\"data\":\"success\"}");
        Hangjing.AppLog.AppLog.Info("美团门店与ERP解除绑定token回调URL");

        System.IO.Stream stream = Request.InputStream;//这是你获得的流
        if (stream != null && stream.Length > 10)
        {

            Hangjing.AppLog.AppLog.Info("stream.Length :" + stream.Length);
            string jsondata = "";
            using (StreamReader reader = new StreamReader(stream))
            {
                jsondata = reader.ReadToEnd(); ;
            }
            Hangjing.AppLog.AppLog.Info("解除绑定回调URL信息:" + jsondata);

        }

  

新订单推送

    要推送订单,首先得要设置接收通知的url

    要推送订单,其次得有商家,所以美团为我们设置了测试商家。还可以添加多个。要特别注意的就是:测试门店为一个坐标位于南极洲、配送范围为西藏昌都的线上测试门店,开发者可使用美团外卖APP定位到西藏昌都气象局,根据测试门店名称搜索到测试门店进行下单。

    一定要App定位在西藏昌都气象局方可下订单。

   因为推送的数据格式是json,所以我的做法是:先创建好订单对应的体,收到通知后,转成实体,再做逻辑处理。接收通知,所上面的类似。

  

Response.Clear();
        string order = Server.UrlDecode(Request["order"]);

        Hangjing.AppLog.AppLog.Info("美团订单来了.美团订单内容:" + order);

        apiResultInfo rs = new apiResultInfo();
        System.IO.Stream stream = Request.InputStream;//这是你获得的流
        if (stream != null && stream.Length > 10)
        {

            Hangjing.AppLog.AppLog.Info("stream.Length :" + stream.Length);
            string jsondata = "";
            using (StreamReader reader = new StreamReader(stream))
            {
                jsondata = reader.ReadToEnd(); ;
            }

            Hangjing.AppLog.AppLog.Info("美团订单信息:" + jsondata);

            mtorderInfo model = JsonConvert.DeserializeObject<mtorderInfo>(order);

            if (model.ePoiId == "1015")
            {
                mthelper mt = new mthelper(Context);
                apiResultInfo retuls = mt.confirmOrder(model.orderId, Convert.ToInt32(model.ePoiId));
            }

        }
        else
        {
            rs.state = 0;
            rs.msg = "参数错误";
        }

        Response.Write("{\"data\":\"OK\"}");
        Response.End();

   

确认订单

  我们收到新订单通知时,可以调用api直接确认订单,也就是商户接单。到这里,我们才正式去调用api,前面都是美团来调用我们,要调用api,首先要做的就是实现签名。这是我对接这么多系统,签名算法最简单的。直接上代码。

  签名:首先将GETPOST参数除去sign本身以及值为空的参数以及=号和&号,按参数自然排序,(例如a=&c=3&b=1,变为b1c3)然后按参数1值1参数2值2...参数n值n的方式拼接成新字符串,再跟字符串前面加上signKey,做sha1散列,最后将得出字符串转成小写即为sign。

  签名代码

        /// <summary>
        /// sha1签名
        /// </summary>
        /// <returns></returns>
        public string createSHA1Sign()
        {
            StringBuilder sb = new StringBuilder();
            ArrayList akeys = new ArrayList(parameters.Keys);
            akeys.Sort();

            foreach (string k in akeys)
            {
                string v = HttpUtility.UrlEncode((string)parameters[k], Encoding.UTF8);
                if (null != v && "".CompareTo(v) != 0
                       && "sign".CompareTo(k) != 0)
                {

                    sb.Append(k+ v);

                }
            }

            string signstep2 = Constant.mt_SignKey + sb.ToString();

            string sig = Utils.SHA1_Hash(signstep2).ToLower();

            AppLog.AppLog.Info("美团签名=" + "signstep1=" + sb.ToString() + "\r\nsignstep2=" + signstep2 + "\r\n => sign:" + sig);

            return sig;
        }

  

  录入所有参数,得到签名,初始化post参数,调用指定api,即可完成确认。大概代码如下,代码都比较文明,大家一看变懂了。

        public apiResultInfo confirmOrder(string orderId, int shopid)
        {
            apiResultInfo rs = new apiResultInfo();

            meituanbindlogInfo record = new meituanbindlog().GetList(1, 1, "ePoiId=" + shopid + " and mtype=1", "mid", 1).FirstOrDefault();
            if (record == null)
            {
                OperationLog.Warn("商家:" + shopid + "未找到绑定token");
                rs.msg = "商家:" + shopid + "未找到绑定token";
                return rs;
            }

            parameters = new Hashtable();
            parameters.Add("charset", "UTF-8");
            parameters.Add("version", "1");
            parameters.Add("timestamp", Utils.getTimestamp());
            parameters.Add("appAuthToken", record.appAuthToken);
            parameters.Add("orderId", orderId.Replace("m", ""));

            createSHA1Sign();

            HttpItem objHttpItem = new HttpItem()
            {
                Encoding = "utf-8",
                Method = "POST"
            };

            string url = "http://api.open.cater.meituan.com/waimai/order/confirm";
            string returnmsg = queryData(objHttpItem, url);

            mtresult result = Newtonsoft.Json.JsonConvert.DeserializeObject<mtresult>(returnmsg);

            if (result.data != null && result.data.ToLower() == "ok")
            {
                rs.state = 1;

            }
            else
            {

                rs.msg = "确认订单失败";
            }

            return rs;
        }

 public string queryData(HttpItem objHttpItem, string url)
        {
            string sig = createSHA1Sign();
            parameters.Add("sign", sig);

            serverurl = url;
            ArrayList akeys = new ArrayList(parameters.Keys);

            StringBuilder sb = new StringBuilder();
            foreach (string k in akeys)
            {
                string v = context.Server.UrlEncode((string)parameters[k]);
                v = HttpUtility.UrlEncode(v, Encoding.UTF8);
                if (null != v && "".CompareTo(v) != 0)
                {
                    if (sb.Length == 0)
                    {
                        sb.Append(k + "=" + v);
                    }
                    else
                    {
                        sb.Append("&" + k + "=" + v);
                    }
                }
            }

            if (objHttpItem.Method.ToLower() == "get")
            {
                serverurl += "?" + sb.ToString();
            }
            else
            {
                objHttpItem.Postdata = sb.ToString();
            }

            HttpHelper objhttp = new HttpHelper();
            objHttpItem.URL = serverurl;

            objhttp.isToLower = false;
            string returnmsg = objhttp.GetHtml(objHttpItem);

            Hangjing.Common.HJlog.toLog("returnmsg=" + returnmsg + "\r\n url=" + serverurl);
            //  HJlog.toLog(this.getDebugInfo());

            return returnmsg;
        }

  确认订单后,我们设置的订单确认通知接口,也有收到相应的通知,具体代码与新订单通知是一样的,只是你可以根据自己业务处理,比如,商家确认订单后,订单直接进入系统,自动调度,或者人工派单。

设置商家营业状态

  这个接口也是经常用到的,因为测试账号,不能登录美团外卖商户后台,如果商家有一个订单没接,商家就会自动休息,影响我们测试。所以实现这个接口后,可方便修改商家状态。

  这个接口与确认订单接口都是类似的,只是参数不同,url不同而已。由于调用api,我们都是封装在方法:queryData了,我们只用设置好参数即可。代码如下:

public apiResultInfo shopOnline(int shopid)
        {
            apiResultInfo rs = new apiResultInfo();

            meituanbindlogInfo record = new meituanbindlog().GetList(1, 1, "ePoiId=" + shopid + " and mtype=1", "mid", 1).FirstOrDefault();
            if (record == null)
            {
                OperationLog.Warn("商家:" + shopid + "未找到绑定token");
                rs.msg = "商家:" + shopid + "未找到绑定token";
                return rs;
            }

            parameters.Add("appAuthToken", record.appAuthToken);

            createSHA1Sign();

            HttpItem objHttpItem = new HttpItem()
            {
                Encoding = "utf-8",
                Method = "POST"
            };

            string url = "http://api.open.cater.meituan.com/waimai/poi/open";
            string returnmsg = queryData(objHttpItem, url);

            mtresult result = Newtonsoft.Json.JsonConvert.DeserializeObject<mtresult>(returnmsg);

            if (result.data != null && result.data.ToLower() == "ok")
            {
                rs.state = 1;

            }
            else
            {
                rs.msg = "商家上线失败";
            }

            return rs;
        }

设置商家上线

上线

  其他还有很多接口可以按需对接,比如商口数据,评论数据。目前我们用不上,暂未对接。最后一步就上线操作了。

  未上线之前,最多能接5个商家,上线后就没有限制了。

  目前上线要先写一个《上线申请》,然后在开放平台,里点击上线,会有美团人员联系你,确认相关信息就OK了。

  

  最后效果图如下:

      

结语

  对接美团外卖,除了提交审核时间不好,导致审核时间长了些外,其他还是蛮顺利的,他们也蛮配合的,根据接口文档几乎可以完整大部分操作。

  就代码上而言,确定没有太多可以说的,对接过程还是有些曲折的。希望这个文章能给那个正在对接的,想对接的人提供一些帮助,如果真有帮助了,有个赞最好了。

  如果有同在做这个的,欢迎交流哈。

  最后,呼应下开头,7年半,真不是一个短时间,我们能写多少个7年的代码呢。也想借此,听听诸位的心声。

   成为一名优秀的程序员!

时间: 2024-10-19 04:29:09

订餐系统之同步美团商家订单的相关文章

订餐系统之同步口碑外卖商家菜单与点点送订单

2015年饿了么.百度外卖.美团外卖.口碑外卖几家几乎分完了外卖这碗羹,让其他外卖网站几乎举步维艰,也让那些蠢蠢欲动想进入外卖领域的人犹豫不决了(这估计是要砸我饭碗的节奏啊,ヾ(@⌒ー⌒@)ノ).当然了,喝了外卖这碗羹,肯定得有“产物”,不然,还不被撑破了肚皮么.对,这个"产物"就是外卖订单,是大量的外卖订单,商户的配送员能力非常有限,于是第三方的配送公司如雨后春笋般的冒了出来,当然了,市场大,竞争也非常残酷,有些刚冒出头,就被"扼杀"在襁褓里了:估计还有不少的没找

订餐系统之同步饿了么商家订单

背景 之前实时获取口碑外卖商家订单,及点点送订单,再使用的我们的调度系统统一调度各个来源的订单,再结合配送员自主抢单,加上配送员队长线上调度,最大限度的让配送员加”顺路单“,提高效率...这套班子不应该因为口碑没了,就变成破铜废铁.暮然回首,原来饿了么也有商户接口,虽然没有淘宝外卖开放平台那么强大,提供好几种语言的示例代码,没有怎么办?自己动手,丰衣足食! 动手之前,还是偷懒的百度了下,以为能找到一些基础代码,或者借鉴之类的,也不知道是没人用呢,还是没人分享... 真没有,有的话,估计也没有这篇

终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)

又见毕业 对面工商大学的毕业生叕在拍毕业照了,一个个脸上都挂满了笑容,也许是满意自己四年的修行,也许是期待步入繁华的社会... 恰逢其时的连绵细雨与满天柳絮,似乎也是在映衬他们心中那些离别的忧伤,与对未来的憧憬和彷徨. 想起当年毕业时,来去匆匆,只留下一张全班合影照和寝室好友的一句:再见,珍重!有点小遗憾! 又见毕业,又是一年,感慨两句,珍惜时间,好好加油,废话完结,回到主题. 背景 自毕业以来,一直在现在公司做订餐系统的开发,那会儿没有口碑,没有饿了么,更别说美团外卖,百度外卖了...因为规模

美团外卖订单系统演进

美团外卖从2013年9月成交第一单以来,已走过了三个年头.期间,业务飞速发展,美团外卖由日均几单发展为日均500万单(9月11日已突破600万)的大型O2O互联网外卖服务平台.平台支持的品类也由最初外卖单品拓展为全品类. 随着订单量的增长.业务复杂度的提升,外卖订单系统也在不断演变进化,从早期一个订单业务模块到现在分布式可扩展的高性能.高可用.高稳定订单系统.整个发展过程中,订单系统经历了几个明显的阶段,下面本篇文章将为大家介绍一下订单系统的演进过程,重点关注各阶段的业务特征.挑战及应对之道.

订餐系统之获取淘宝外卖订单

当时的情况是这样的:我们一个客户用了我们的订餐系统,也在淘宝外卖上开了店,但是订餐系统中的订单都要通过调度系统,根据配送员的位置,把订单发送给合适的配送员,所以要把淘宝外卖的订单加到订餐系统中(据说淘宝外卖也是因为味捷外卖才开发这个接口的). 淘宝外卖提供的接口我知道的有三个,1.获取未确认的订单:2.确认订单:3.拒绝订单.所以订餐系统要做的就是从淘宝外卖获取未确认的订单.确认订单并加入订餐系统. 开放平台地址: http://open.taobao.com/doc/api_cat_detai

轻流订餐系统上线,商家做外卖生意更简单

大家好,我是每周为你们送餐的严阿姨, 为了保障每一位同事一上午辛苦的工作后可以准时吃上香喷喷的午饭, 我们特地更新了后厨的:订餐系统 从今天起,部门负责订餐的同学们,可以轻松提交订餐了- 我们将从以下几个方面重点把关, 做到: 1.不晚单 2.不错单 3.好服务 4.好味道 您有新的午餐订单 请及时处理哦~ 有了这个系统,我们后厨的工作人员都会第一时间收到每位同事下的订餐,不仅是短信收到提醒,邮件.微信都能收到哦- 您的订餐已确认 等着上菜吧~ 收到订单后,我们在后台进行确认,确认后我们的新系统

网上订餐系统需求分析报告

一.研究意义 随着计算机和网络的日趋发展,网上店铺如雨后春笋般出现,就连沃尔玛,金拱门这一类老品牌的商家都开拓了自己的网上购物渠道,有调查表明:无论是中国还是西方国家,越来越的用户已经习惯于网络购物.人们的消费平台逐渐开始向虚拟世界转移,而网上订餐是其中重要的一环,发展网络订餐平台已经成为了新的时代的新的需求. 餐饮业也要顺应时代进行发展,早在古代,因为人们在外做饭不便,市场便推出了饭店来解决人们的吃饭问题,这一行业在时代的发展中不断进化,随着网络购物的出现,许多人倾向于足不出户而吃到各种美食,

微铺子点单系统详细介绍 - 争做国内最专业的微信商店平台,微信外卖订餐系统!

什么是微铺子? 微铺子是国内专业的微信点单系统,集成了外卖.点餐.订座等众多功能.通过微铺子,店家可以在微信上建立店铺,消费者只需关注店家的帐号,即可浏览商品与店家的信息,消费者关注到商家后,根据提示,进行点击点单,简单三步,15秒内,即可完成订餐.店家可以通过电脑后台.电子邮件.短信或无线打印机多种方式即时查看订单,并提供相应的服务. 微铺子系统适用于:餐饮.酒店.水果店.蛋糕店.花店.零售.超市等. 微铺子从创立到与合作商家的长期测试,再到正式投入商用,期间不断根据客户的需求完善产品,不断开

订餐系统之按距离[根据经纬度]排序、搜索

上周六,写了第一篇博客<订餐系统之权限设计>,在此感谢那些鼓励.关注我的园友们,更要感谢那些提出宝贵建议的朋友们.看了你们的评论,才真切的感受到:朋友们的评论往往会让文章更有看点.上篇文章中 郑明.人生就是赌 等几个园友的留言让我对我们系统的权限优化有了方向.当然,这样的优化肯定不是一天两天的事,做技术的朋友应该都知道:一个难题经常啃啃,某天也许就有了好的方案了(近段时间啃掉了几个2.3年前未处理好的的问题,才想起初中数学老师让我们经常啃一些竞赛题的良苦用心),今天的文章说的就是一个从2010