实战项目:通过当当API将订单抓取到SAP(一)
2013-01-31 17:18
316 查看
公司在当当上经营了一家店铺,通过当当提供的API,用C#写代码,通过NCO3.0调用SAP RFC将订单信息抓取到SAP。
如果你是新手,在当当网上有店铺,且你公司使用SAP系统,恭喜你,下面这些代码直接复制过去,改下商家编码和密钥就可以直接抓单了。如果你只是当当网有店铺,没有SAP系统,下面这些代码也同样对你有用,你或许要插入自己的数据库,这更简单了。
需要准备的环境:
1、 Microsoft Visual Studio 2010 开发环境。
2、 NCO3.0 (下载地址:http://download.csdn.net/detail/szlaptop/4635144)
(VS2010环境下必须这个版本:sapnco30dotnet40P_8-20007347.zip)
3、 Log4net (百度下,在官方下载)
4、 在SAP里建2张表,用SAP专业术语,建一个抬头表,建一个行项目表
5、 当当API手册(在商家后台,公告栏处可以看见)
Step1
登录当当网商家后台,设置商家接口密码(这些内容当当API里有)
注意:
1、 商家修改接口密码(key)时,需要提供原key值;如果商家是第一次使用该功能,那么可以不输入原key值;
2、 新key值区分大小写,设置时请特别注意;
3、 新key值长度为8-20位,不能全部为数字,不能全部为小写字母,不能全部为大写字母;
4、 如果商家忘记原key值,请联系当当技术支持,进行key值重置。
Step2
打开VS2010新建一个Windows窗体应用程序,命名:DangDang
在解决方案资源管理器,引用里引用NCO3.0的sapnco.dll和sapnco_utils 及 log4net
右击项目名称DangDang,点击“属性”,打开属性面板:将目标框架里默认的.NET Framework 4 Client Profile 改为:.NET Framework 4。(很重要)
在解决方案资源管理器里打开配置文件APP.CONFIG,配置如下:
Step3
经过Step2的设置,VS环境这边算是搭建OK了。第3步,我们去SAP建表去(建表详细略)
因为我们这里这是抓取当当订单的信息。所以建2张表,表的字段和含义请熟读当当API手册。
上面这张图不是完全的,因为截图截不了那么多,下面还有很多字段,这些字段都是根据API手册来设置的,当然你可以灵活的从这些字段中取认为你需要的信息。
这两张表,我都选了”订单编号”做为主键,方便以后关联查询。
Step4
写RFC(写RFC可以参照我之前写的博客)
Source code里的代码很简单。
Step5
到第5部了,开始在VS里写代码了。首先要解决的是”验证码算法”,API手册了给了解释:
validateString参数是每个API请求中必须发送的参数,由请求中的其它参数以及后台设置的key值两部分,采用MD5加密生成,具体算法如下:
第一步,把请求中的参数(XML文件以及validateString本身除外),按照参数名称进行正向排序
第二步,把各个参数的值按照GBK编码后,按照排序顺序串联起来(不能有空格)
第三步,把后台设置的key值按照GBK编码后,串接到“第二步”得到的字符串尾部(不能有空格)
第四步,采用MD5算法对“第三步”得到的字符串进行加密,生成validateString的值
好了,我直接上C#代码,将这4步翻译成代码:
Step 6
这个验证码有了,就好像有了进当当系统的通行证了,现在我们拿着通行证到当当里把订单信息取出来,代码如下:
Step7
上面这段代码,有个方法就是将XML文件转化成DATASET,这个方法也是我从百度搜来的,懒的自己写了。如下:(你建一个类,类名XmlToData,把这些代码放进去即可)
Step8
如果你按照上面讲的,操作无误的话,设断点,点调试,在DS里就能看到20条订单列表信息了。当当不会那么容易让你一下取很多数据的,默认的就是20条,且1分钟只能请求30次。拿到这个简单的订单列表信息后,你还需要通过订单编号和通行证,再去取一次该订单的详细信息。这第7步,我来说怎么把VS和SAP打通。
首先你得这样:using SAP.Middleware.Connector;
然后这样,直接上代码:
Step9
如果上面都无误的话,点运行。然后到SAP的表里就可以看到20条数据了。
关于log4net是什么,怎么用,请看我的下一篇博文:http://blog.csdn.net/szlaptop/article/details/8561650
如果你是新手,在当当网上有店铺,且你公司使用SAP系统,恭喜你,下面这些代码直接复制过去,改下商家编码和密钥就可以直接抓单了。如果你只是当当网有店铺,没有SAP系统,下面这些代码也同样对你有用,你或许要插入自己的数据库,这更简单了。
需要准备的环境:
1、 Microsoft Visual Studio 2010 开发环境。
2、 NCO3.0 (下载地址:http://download.csdn.net/detail/szlaptop/4635144)
(VS2010环境下必须这个版本:sapnco30dotnet40P_8-20007347.zip)
3、 Log4net (百度下,在官方下载)
4、 在SAP里建2张表,用SAP专业术语,建一个抬头表,建一个行项目表
5、 当当API手册(在商家后台,公告栏处可以看见)
Step1
登录当当网商家后台,设置商家接口密码(这些内容当当API里有)
注意:
1、 商家修改接口密码(key)时,需要提供原key值;如果商家是第一次使用该功能,那么可以不输入原key值;
2、 新key值区分大小写,设置时请特别注意;
3、 新key值长度为8-20位,不能全部为数字,不能全部为小写字母,不能全部为大写字母;
4、 如果商家忘记原key值,请联系当当技术支持,进行key值重置。
Step2
打开VS2010新建一个Windows窗体应用程序,命名:DangDang
在解决方案资源管理器,引用里引用NCO3.0的sapnco.dll和sapnco_utils 及 log4net
右击项目名称DangDang,点击“属性”,打开属性面板:将目标框架里默认的.NET Framework 4 Client Profile 改为:.NET Framework 4。(很重要)
在解决方案资源管理器里打开配置文件APP.CONFIG,配置如下:
Step3
经过Step2的设置,VS环境这边算是搭建OK了。第3步,我们去SAP建表去(建表详细略)
因为我们这里这是抓取当当订单的信息。所以建2张表,表的字段和含义请熟读当当API手册。
上面这张图不是完全的,因为截图截不了那么多,下面还有很多字段,这些字段都是根据API手册来设置的,当然你可以灵活的从这些字段中取认为你需要的信息。
这两张表,我都选了”订单编号”做为主键,方便以后关联查询。
Step4
写RFC(写RFC可以参照我之前写的博客)
Source code里的代码很简单。
IF IT_ZDDITEM[] IS NOT INITIAL. MODIFY ZDDITEM FROM TABLE IT_ZDDITEM[]. IF SY-SUBRC = 0. R_SUBRC = '数据已成功写入ZDDITEM表里'. ENDIF. ENDIF. IF IT_ZDDITEMMAS[] IS NOT INITIAL. MODIFY ZDDITEMMAS FROM TABLE IT_ZDDITEMMAS[]. IF SY-SUBRC = 0. R_SUBRC = '数据已成功写入ZDDITEMMAS表里'. ENDIF. ENDIF.
Step5
到第5部了,开始在VS里写代码了。首先要解决的是”验证码算法”,API手册了给了解释:
validateString参数是每个API请求中必须发送的参数,由请求中的其它参数以及后台设置的key值两部分,采用MD5加密生成,具体算法如下:
第一步,把请求中的参数(XML文件以及validateString本身除外),按照参数名称进行正向排序
第二步,把各个参数的值按照GBK编码后,按照排序顺序串联起来(不能有空格)
第三步,把后台设置的key值按照GBK编码后,串接到“第二步”得到的字符串尾部(不能有空格)
第四步,采用MD5算法对“第三步”得到的字符串进行加密,生成validateString的值
好了,我直接上C#代码,将这4步翻译成代码:
public static string MD5(string str, string encode) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] data = md5.ComputeHash(Encoding.GetEncoding(encode).GetBytes(str)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } public static string SignTopRequest(IDictionary<string, string> parameters, string key) { IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters); string str = string.Empty; foreach (var item in sortedParams) { if (!string.IsNullOrEmpty(item.Value)) { str += System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.Default.GetBytes(item.Value)); } } str += System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.Default.GetBytes(key)); return MD5(str, "UTF-8"); } private static IDictionary<string, string> SplitUrlQuery(string query) { IDictionary<string, string> result = new Dictionary<string, string>(); string[] pairs = query.Split(new char[] { '&' }); if (pairs != null && pairs.Length > 0) { foreach (string pair in pairs) { string[] oneParam = pair.Split(new char[] { '=' }, 2); if (oneParam != null && oneParam.Length == 2) { result.Add(oneParam[0], oneParam[1]); } } } return result; } }
Step 6
这个验证码有了,就好像有了进当当系统的通行证了,现在我们拿着通行证到当当里把订单信息取出来,代码如下:
public void GetOrder() { string getorderdetail = "gShopID=商家编号&o=&productID=&oit=&os=&sm=&pm=&sendMode=&name=&lastModifyTime_start=&" + "lastModifyTime_end=&osd=&oed=&sgsd=&sged=&ol=&pageSize=&p=&validateString="; IDictionary<string, string> Idiction = SplitUrlQuery(getorderdetail); string serverUrl = "http://api.dangdang.com/v2/searchOrders.php?" + getorderdetail; string validateString = SignTopRequest(Idiction, "密钥"); string xmlContent = Get(serverUrl + validateString); ds = XmlToData.CXmlToDataSet(@xmlContent); dsall.Merge(ds); } }
Step7
上面这段代码,有个方法就是将XML文件转化成DATASET,这个方法也是我从百度搜来的,懒的自己写了。如下:(你建一个类,类名XmlToData,把这些代码放进去即可)
public class XmlToData { public static DataSet CXmlToDataSet(string xmlStr) { if (!string.IsNullOrEmpty(xmlStr)) { StringReader StrStream = null; XmlTextReader Xmlrdr = null; try { DataSet ds = new DataSet(); StrStream = new StringReader(xmlStr); Xmlrdr = new XmlTextReader(StrStream); ds.ReadXml(Xmlrdr); return ds; } catch (Exception e) { throw e; } finally { if (Xmlrdr != null) { Xmlrdr.Close(); StrStream.Close(); StrStream.Dispose(); } } } else { return null; } } }
Step8
如果你按照上面讲的,操作无误的话,设断点,点调试,在DS里就能看到20条订单列表信息了。当当不会那么容易让你一下取很多数据的,默认的就是20条,且1分钟只能请求30次。拿到这个简单的订单列表信息后,你还需要通过订单编号和通行证,再去取一次该订单的详细信息。这第7步,我来说怎么把VS和SAP打通。
首先你得这样:using SAP.Middleware.Connector;
然后这样,直接上代码:
#region 通过NCO3.0将数据写入SAP(ZDDHEADER) public void SAP_DANGDANG_RFC(DataSet dsall) { //读取配置文件信息,建立与SAP连接 RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("DEV"); try { RfcRepository SapRfcRepository = SapRfcDestination.Repository; IRfcFunction myfun = SapRfcRepository.CreateFunction("ZDANGDANG_RFC_HEADER"); // Set some input values for the structure. IRfcStructure import = null; IRfcTable table = myfun.GetTable("IT_ZDDHEADER"); for (int i = 0; i < dsall.Tables[3].Rows.Count; i++) { import = SapRfcRepository.GetStructureMetadata("ZDDHEADER").CreateStructure(); import.SetValue("DD1", dsall.Tables[3].Rows[i][0].ToString()); //订单编号 import.SetValue("DD21", dsall.Tables[3].Rows[i][1].ToString()); //收货人姓名 import.SetValue("DD28", dsall.Tables[3].Rows[i][2].ToString()); //固定电话 import.SetValue("DD29", dsall.Tables[3].Rows[i][3].ToString()); //手机号码 import.SetValue("DD22", dsall.Tables[3].Rows[i][4].ToString()); //收货人地址 import.SetValue("DD30", dsall.Tables[3].Rows[i][5].ToString()); //送货方式 import.SetValue("DD63", dsall.Tables[3].Rows[i][7].ToString()); //订单总额 import.SetValue("DD62", dsall.Tables[3].Rows[i][8].ToString()); //下单时间 import.SetValue("DD7", dsall.Tables[3].Rows[i][9].ToString()); //最后修改时间 import.SetValue("DD2", dsall.Tables[3].Rows[i][10].ToString()); //订单状态 import.SetValue("DD5", dsall.Tables[3].Rows[i][11].ToString()); //备注 import.SetValue("DD6", dsall.Tables[3].Rows[i][12].ToString()); //标记 table.Insert(import); } myfun.Invoke(SapRfcDestination); //执行函数 } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { RfcSessionManager.EndContext(SapRfcDestination); SapRfcDestination = null; } } #endregion
Step9
如果上面都无误的话,点运行。然后到SAP的表里就可以看到20条数据了。
关于log4net是什么,怎么用,请看我的下一篇博文:http://blog.csdn.net/szlaptop/article/details/8561650
相关文章推荐
- 实战项目:通过当当API将订单抓取到SAP(二)
- 实战项目:通过当当API将订单抓取到SAP(一)
- 实战项目:通过当当API将订单抓取到SAP(二)
- 一步一步教你写SAP RFC (实战项目)OA通过读取采购订单号获取物料号最近5次变价记录
- 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序
- 微信小程序入门与实战 常用组件 API 开发技巧 项目实战
- 实战DeviceIoControl 之一:通过API访问设备驱动程序
- SAP采购订单抬头、行项目屏幕增强的两种方法
- 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题
- Vue2+VueRouter2+webpack 构建项目实战(四):接通api,渲染列表
- Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表
- 实战DeviceIoControl 之一:通过API访问设备驱动程序
- C# WebApi+Task+WebSocket实战项目演练(四)
- 实战DeviceIoControl 之一:通过API访问设备驱动程序
- 项目实战:RequestUrl的处理(思考 + Sting API > KMP等复杂算法、正则表达式)
- SAP 通过事务代码与屏幕变式(SHD0)控制控制用户界面的某些字段,以控制生产订单的调度类型为例
- 商城项目实战36:订单系统实现
- 实战DeviceIoControl 之一:通过API访问设备驱动程序(学习)
- yii2项目实战之restful api授权验证详解
- 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中