公司在当当上经营了一家店铺,通过当当提供的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里的代码很简单。

  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 = ; 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 > )
{
foreach (string pair in pairs)
{
string[] oneParam = pair.Split(new char[] { '=' }, );
if (oneParam != null && oneParam.Length == )
{
result.Add(oneParam[], oneParam[]);
}
}
} return result;
}
}

Step 6

这个验证码有了,就好像有了进当当系统的通行证了,现在我们拿着通行证到当当里把订单信息取出来,代码如下:

上面这段代码,有个方法就是将XML文件转化成DATASET,这个方法也是我从百度搜来的,懒的自己写了。如下:(你建一个类,类名XmlToData,把这些代码放进去即可)

如果你按照上面讲的,操作无误的话,设断点,点调试,在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 = ; i < dsall.Tables[].Rows.Count; i++)
{
import = SapRfcRepository.GetStructureMetadata("ZDDHEADER").CreateStructure();
import.SetValue("DD1", dsall.Tables[].Rows[i][].ToString()); //订单编号
import.SetValue("DD21", dsall.Tables[].Rows[i][].ToString()); //收货人姓名
import.SetValue("DD28", dsall.Tables[].Rows[i][].ToString()); //固定电话
import.SetValue("DD29", dsall.Tables[].Rows[i][].ToString()); //手机号码
import.SetValue("DD22", dsall.Tables[].Rows[i][].ToString()); //收货人地址
import.SetValue("DD30", dsall.Tables[].Rows[i][].ToString()); //送货方式
import.SetValue("DD63", dsall.Tables[].Rows[i][].ToString()); //订单总额
import.SetValue("DD62", dsall.Tables[].Rows[i][].ToString()); //下单时间
import.SetValue("DD7", dsall.Tables[].Rows[i][].ToString()); //最后修改时间
import.SetValue("DD2", dsall.Tables[].Rows[i][].ToString()); //订单状态
import.SetValue("DD5", dsall.Tables[].Rows[i][].ToString()); //备注
import.SetValue("DD6", dsall.Tables[].Rows[i][].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

原文:http://blog.csdn.net/szlaptop/article/details/8560430

实战项目:通过当当API将订单抓取到SAP(一)的更多相关文章

  1. 实战项目:通过当当API将订单抓取到SAP(二)

    上一篇博客,我们引用了log4net 这个.这里简单介绍下,为什么引用这个. log4net是记录程序日志信息的,是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控 ...

  2. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  3. vue+websocket+express+mongodb实战项目(实时聊天)(二)

    原项目地址:[ vue+websocket+express+mongodb实战项目(实时聊天)(一)][http://blog.csdn.net/blueblueskyhua/article/deta ...

  4. FaceRank,最有趣的 TensorFlow 入门实战项目

    FaceRank,最有趣的 TensorFlow 入门实战项目 TensorFlow 从观望到入门! https://github.com/fendouai/FaceRank 最有趣? 机器学习是不是 ...

  5. TensorFlow 中文资源全集,官方网站,安装教程,入门教程,实战项目,学习路径。

    Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...

  6. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  7. .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

    写在前面 上面文章我给大家介绍了Dapper这个ORM框架的简单使用,大伙会用了嘛!本来今天这篇文章是要讲Vue的快速入门的,原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现.但 ...

  8. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

    前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...

  9. .NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

    这两天比较忙,周末也在加班,所以更新的就慢了一点,不过没关系,今天我们就进行千呼万唤的系统开发框架的设计.不知道上篇关于架构设计的文章大家有没有阅读,如果阅读后相信一定对架构设计有了更近一部的理解,如 ...

随机推荐

  1. c/c++ 编译器内存对齐问题

    C语言结构体对齐问题详解 转载自:http://blog.csdn.net/tiany524/article/details/6295551 测试环境32位机 WinXP: 编译器VC6(MS cl. ...

  2. nodejs ctrl+B 快捷键设置

    开发 nodejs 的时候,要使用 sublime 软件,其中的启动方式有很多中.可以通过 supersivor 当然也可以 利用nodejs 的自身功能通过 ctrl+B来直接启动. 具体设置方式, ...

  3. git 操作大全

    Git 以下内容整理自廖雪峰的git教程,主要用于个人方便使用git命令 git忽略已经被纳入版本库的文件 使用 git update-index –-skip-worktree [file] 可以实 ...

  4. 闲谈Future模式-订蛋糕

    一. Future模式简介 Future有道翻译:n. 未来:前途:期货:将来时.我觉得用期货来解释比较合适.举个实际生活中例子来说吧,今天我女朋友过生日,我去蛋糕店准备给女朋友定个大蛋糕,超级大的那 ...

  5. jquery cookie用法(获取cookie值,删除cookie)

    1.引入文件 2.具体操作 $.cookie('the_cookie'); // 读取 cookie $.cookie('the_cookie', 'the_value'); // 存储 cookie ...

  6. SQL Server UDF用户自定义函数

    UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数, ...

  7. RFID第二次作业

    1.简述智能卡的发展,以及射频电子标签在其中所处的位置. 智能卡(Smart Card)又称为集成电路卡(IC卡),内部带有微处理器和存储单元等部件. 射频电子标签是一种非接触式的IC卡,是后期发展起 ...

  8. excel分组求和

    =SUMPRODUCT((C2:C99=F2)*(B2:B99)) 说明: C2:C99=F2 找到C2到C99之间的等于F2的值 如果有多个判断条件,采用*来管理 B2:B99 求和

  9. Java(07)转化流

    查看API得知: public class OutputStreamWriter extends Writer public class InputStreamReader extends Reade ...

  10. POJ-2785 4 Values whose Sum is 0(折半枚举 sort + 二分)

    题目链接:http://poj.org/problem?id=2785 题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数. 其中一个数列有多个相同的数字时 ...