订餐系统之自动确认淘点点订单

  最近淘点点好像做了一个重大调整,一个企业帐号只能开10家店,个人帐号只能开5家店,这个对于第三方配送的就有些麻烦了,如果您开的店多了,您就得用多个帐号,如果您要把订单导入自己的平台,统一操作,这个又麻烦了。经过这几天的开发、测试,终于实现多帐号自动确认,导入订单到自己的平台了,自动推送给配送员,再让配送员抢单、配送。之前写过一篇叫订餐系统之获取淘宝外卖订单的文章介绍获取未确认的淘宝外卖订单及确认订单,有兴趣的朋友也可以看下,本文算是那篇文章的一个升级吧。支持多帐号,及自动确认功能。

  点击这里进入淘宝开放平台,添加应用,其他操作基本就是按提示傻瓜操作了。有兴趣的自己点点哦,这里就不细说了。

  背景交代完毕,开始进入今天的主题。

第一步,维护开放平台相关信息

  在开放平台申请应用后会生成两个信息App Key和App Secret。我先把这些信息维护到数据库中,如下图,其中的shopid为此帐号下任意一个商家编号即可。session key在下一步中作介绍

  

第二步,获取Session key

  Session Key获取网址为:http://api.taobao.com/apitools/sessionPage.htm?qq-pf-to=pcqq.c2c,应用上线后,session key的默认过期时间为一个月(也可以申请一年的),也就是过期了,你要重新到这个地址生成,并更新到第一步中的数据表中。

      操作步骤如下(第二张图中session对应的内容就是Session Key了):

    

    

      

  

第三步,具体实现

  大部分代码和订餐系统之获取淘宝外卖订单中的相同,主要就是换了个思路,把其中变化的参数都保存在数据表中,通常循环获取订单,并确认订单。大概代码如下,写得不好,希望大家拍砖哈。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            TBShoplist = SectionProxyData.GetTaoBaoShopList();
            foreach (var account in SectionProxyData.GettaobaoAPIAcountList())
            {
                string shopid = account.Priority.ToString();
                string appkey = account.classname;
                string appsecret = account.pic;
                string top_session = account.hovepic;

                //参数集合
                SortedList<string, string> parameters = new SortedList<string, string>();
                //2.1 应用级输入参数
                parameters.Add("is_all", "true");
                parameters.Add("store_id", shopid);
                parameters.Add("max_size", "20");
                //2.2 系统级参数
                parameters.Add("method", "taobao.trade.waimai.get");
                parameters.Add("session", top_session);
                parameters.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                parameters.Add("format", "json");
                parameters.Add("app_key", appkey);
                parameters.Add("v", "2.0");
                parameters.Add("partner_id", "top-apitools");

                //2.3 生成sign,格式: app_secret参数1值1参数2值2,生成md5后转为大写
                StringBuilder sb = new StringBuilder();
                sb.Append(appsecret);
                foreach (KeyValuePair<string, string> item in parameters)
                {
                    sb.Append(item.Key + item.Value);
                }

                parameters.Add("sign", WebUtility.GetMd5(sb.ToString()).ToUpper());

                //3.生成url
                string url = "http://gw.api.taobao.com/router/rest?";//线上环境: http://gw.api.taobao.com/router/rest  测试环境: http://gw.sandbox.taobao.com/router/rest
                StringBuilder query = new StringBuilder();
                foreach (KeyValuePair<string, string> item in parameters)
                {
                    query.Append(item.Key + "=" + System.Web.HttpUtility.UrlEncode(item.Value, System.Text.Encoding.UTF8) + "&");
                }
                url += query.ToString().TrimEnd(new char[] { '&' });

                ITopClient client = new DefaultTopClient(url, appkey, appsecret, "json");
                TradeWaimaiGetRequest req = new TradeWaimaiGetRequest();
                req.StoreId = Convert.ToInt32(shopid);
                req.IsAll = true;
                req.MaxSize = 20L;

                TradeWaimaiGetResponse response = client.Execute(req,top_session);
                if (response.Result != null && response.Result.ResultList != null)
                {
                    ttOrderlist = response.Result.ResultList;

                    string cbautoconfirm = WebUtility.FixgetCookie("cbautoconfirm");
                    if (cbautoconfirm == "true" || cbautoconfirm == "checked")
                    {
                        //自动确认;
                        foreach (var model in ttOrderlist)
                        {
                            confirmOrder(model, appkey, appsecret, top_session);
                        }
                    }
                }
            }
           
        }
    }

    /// <summary>
    /// 确认订单
    /// </summary>
    protected void confirmOrder(TakeoutThirdOrder model, string appkey, string appsecret, string top_session)
    {
        //1.加到系统,
        ...
        int rs = bll.AddTBOrder(ordermodel, foodlist);

        //2.确认订单
        if (rs > 0)
        {
            //参数集合
            SortedList<string, string> parameters = new SortedList<string, string>();
            //2.1 应用级输入参数
            parameters.Add("order_id", model.Id.ToString());
            //2.2 系统级参数
            parameters.Add("method", "taobao.trade.waimai.confirm");
            parameters.Add("session", top_session);
            parameters.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            parameters.Add("format", "json");
            parameters.Add("app_key", appkey);
            parameters.Add("v", "2.0");
            parameters.Add("partner_id", "top-apitools");

            //2.3 生成sign,格式: app_secret参数1值1参数2值2,生成md5后转为大写
            StringBuilder sb = new StringBuilder();
            sb.Append(appsecret);
            foreach (KeyValuePair<string, string> item in parameters)
            {
                sb.Append(item.Key + item.Value);
            }
            //sb.Append(appsecret);

            parameters.Add("sign", WebUtility.GetMd5(sb.ToString()).ToUpper());

            //3.生成url
            string url = "http://gw.api.taobao.com/router/rest?";
            StringBuilder query = new StringBuilder();
            foreach (KeyValuePair<string, string> item in parameters)
            {
                query.Append(item.Key + "=" + System.Web.HttpUtility.UrlEncode(item.Value, System.Text.Encoding.UTF8) + "&");
            }
            url += query.ToString().TrimEnd(new char[] { '&' });

            ITopClient client = new DefaultTopClient(url, appkey, appsecret, "json");
            TradeWaimaiConfirmRequest req = new TradeWaimaiConfirmRequest();
            req.OrderId = Convert.ToInt64(model.Id);
            TradeWaimaiConfirmResponse response = client.Execute(req, top_session);
        }
    }
View Code

     界面效果如下图,默认30秒访问一次,自动确认(淘宝掌柜确认后,这里就不能再获取了)。

  

第四步,让订单跑起来

  如果在第三步,增加部分代码,把订单推送到我们配送员的Android客户端,让大家去抢单,然后配送。整个流程就变得相当easy了。

  

结语

  此文与之前的文章描述的内容相关,并没有增加多少技术含量,只是增加了一些思路,如多帐号问题、自动确认等,当然推送客户端,让大家抢单,这只是对接了下我们原有的系统。希望对有需要的同学有点帮助,鄙人技术有限,写得不好地方也请大家拍砖哈!

       成为一名优秀的程序员!

原文地址:https://www.cnblogs.com/jijunjian/p/3667608.html