Response.Clear(); Response.Write(); Hangjing.AppLog.AppLog.Info(); System.IO.Stream stream = Request.InputStream;(stream != null && stream.Length > 10) { Hangjing.AppLog.AppLog.Info(+ stream.Length); string jsondata = ""; using (StreamReader reader = new StreamReader(stream)) { jsondata = reader.ReadToEnd(); ; } Hangjing.AppLog.AppLog.Info(+ jsondata); }
View Code
新订单推送
要推送订单,首先得要设置接收通知的url
要推送订单,其次得有商家,所以美团为我们设置了测试商家。还可以添加多个。要特别注意的就是:测试门店为一个坐标位于南极洲、配送范围为西藏昌都的线上测试门店,开发者可使用美团外卖APP定位到西藏昌都气象局,根据测试门店名称搜索到测试门店进行下单。
一定要App定位在西藏昌都气象局方可下订单。
因为推送的数据格式是json,所以我的做法是:先创建好订单对应的体,收到通知后,转成实体,再做逻辑处理。接收通知,所上面的类似。
Response.Clear(); ]); Hangjing.AppLog.AppLog.Info(+ order); apiResultInfo rs = new apiResultInfo(); System.IO.Stream stream = Request.InputStream;(stream != null && stream.Length > 10) { Hangjing.AppLog.AppLog.Info(+ stream.Length); string jsondata = ""; using (StreamReader reader = new StreamReader(stream)) { jsondata = reader.ReadToEnd(); ; } Hangjing.AppLog.AppLog.Info(+ jsondata); mtorderInfo model = JsonConvert.DeserializeObject<mtorderInfo>(order); ) { mthelper mt = new mthelper(Context); apiResultInfo retuls = mt.confirmOrder(model.orderId, Convert.ToInt32(model.ePoiId)); } } else { rs.state = 0; rs.msg = ; } Response.Write(); Response.End();
View Code
确认订单
我们收到新订单通知时,可以调用api直接确认订单,也就是商户接单。到这里,我们才正式去调用api,前面都是美团来调用我们,要调用api,首先要做的就是实现签名。这是我对接这么多系统,签名算法最简单的。直接上代码。
签名:首先将GET、POST参数除去sign本身以及值为空的参数以及=号和&号,按参数自然排序,(例如a=&c=3&b=1,变为b1c3)然后按参数1值1参数2值2...参数n值n的方式拼接成新字符串,再跟字符串前面加上signKey,做sha1散列,最后将得出字符串转成小写即为sign。
签名代码
sha1签名 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 && .CompareTo(k) != 0) { sb.Append(k+ v); } } string signstep2 = Constant.mt_SignKey + sb.ToString(); string sig = Utils.SHA1_Hash(signstep2).ToLower(); AppLog.AppLog.Info(+ + sb.ToString() + + signstep2 + + sig); return sig; }
View Code
录入所有参数,得到签名,初始化post参数,调用指定api,即可完成确认。大概代码如下,代码都比较文明,大家一看变懂了。
public apiResultInfo confirmOrder(string orderId, int shopid) { apiResultInfo rs = new apiResultInfo(); meituanbindlogInfo record = + shopid + , , 1).FirstOrDefault(); if (record == null) { OperationLog.Warn(+ shopid + ); rs.msg = + shopid + ; return rs; } parameters = new Hashtable(); parameters.Add(, ); parameters.Add(, ); parameters.Add(, Utils.getTimestamp()); parameters.Add(, record.appAuthToken); parameters.Add(, orderId.Replace(, "")); createSHA1Sign(); HttpItem objHttpItem = new HttpItem() { Encoding = , Method = }; ; string returnmsg = queryData(objHttpItem, url); mtresult result = Newtonsoft.Json.JsonConvert.DeserializeObject<mtresult>(returnmsg); ) { rs.state = 1; } else { rs.msg = ; } return rs; } public string queryData(HttpItem objHttpItem, string url) { string sig = createSHA1Sign(); parameters.Add(, 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); } } } ) { 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 + + serverurl); returnmsg; }
View Code