wenmo8 发布的文章

在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF、Word、Excel等文档,有时候是通过分布式的WCF技术实现数据的显示和处理,因此希望直接预览而不需要下载文件,这样能够给我们提供很多的方便。在DevExpress里面,提供了相应的控件来显示和处理这些文档,本文主要介绍如何利用DevExpress的控件实现对PDF、Word、Excel文档的预览和操作处理。

1、PDF的预览和操作

在较早的DevExpress的控件里面,已经提供了对应的PDF文档的显示控件,不过由于其对PDF格式支持不是很好,有些文档是Office导出的,也不是很正常阅读,因此很少使用,本文介绍的DevExpress的PDF查看控件是基于14.1的,测试过很多文档,好像都能正常打开,因此也想在系统中广泛使用了。

为了演示这些控件的处理,我单独编写了一个例子,用来实现对PDF、Word、Excel等文档的处理。

为了显示PDF文档,我们需要在界面里面添加一个XtraPdfViewer.PdfViewer的控件,这个主要是用来显示PDF的,它有很多属性方法,用来实现对PDF的处理操作,测试界面设计好如下所示。

对PDF,我们一般主要是用来打开文件,另存为,或者预览就可以了。相关的操作代码如下所示。

    /// <summary>
    ///PDF测试显示窗体/// </summary>
    public partial classPDFViewer : Form
{
//记录窗体的名称 readonly stringmainFormText;publicPDFViewer()
{
InitializeComponent();
//记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称 mainFormText = this.Text;
pdfViewer1.DocumentChanged
+= newDevExpress.XtraPdfViewer.PdfDocumentChangedEventHandler(pdfViewer1_DocumentChanged);
}
/// <summary> ///PDF文档变化后,实现对新文件名称的显示/// </summary> void pdfViewer1_DocumentChanged(objectsender, DevExpress.XtraPdfViewer.PdfDocumentChangedEventArgs e)
{
string fileName =Path.GetFileName(e.DocumentFilePath);if(String.IsNullOrEmpty(fileName))
{
Text
=mainFormText;
}
else{
Text
= fileName + "-" +mainFormText;
}
}
/// <summary> ///打开PDF文件/// </summary> private void btnOpenFile_Click(objectsender, EventArgs e)
{
string filePath =FileDialogHelper.OpenPdf();if (!string.IsNullOrEmpty(filePath))
{
this.pdfViewer1.LoadDocument(filePath);
}
}
/// <summary> ///另存为PDF文件/// </summary> private void btnSaveAs_Click(objectsender, EventArgs e)
{
string dir =System.Environment.CurrentDirectory;string filePath = FileDialogHelper.SavePdf("", dir);if (!string.IsNullOrEmpty(filePath))
{
try{this.pdfViewer1.SaveDocument(filePath);
MessageUtil.ShowTips(
"保存成功");
}
catch(Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}
}
/// <summary> ///PDF文件打印/// </summary> private void btnPreview_Click(objectsender, EventArgs e)
{
this.pdfViewer1.Print();
}
}

从上面的代码,我们可以看到,对于PDF,我们操作起来很方便,主要就是在界面里面加载文件后,就可以对PDFViewer对象实现相关的操作了。

2、WORD文档的预览和操作

类似于PDF文档,我们对WORD文档,也是通过使用RichEditControl实现文档的显示,不过和PDFViewer不同,这个控件可以实现对文档的修改和保存操作,这种对于我们提供用户对文档进行编辑很方便。

测试例子的界面如下所示。

相关的操作代码,也和PDF的操作类似,不同的是,它在文档变化后,不能很容易从参数里面获取到对应的文档的路径,需要特殊的处理才能得到。

    /// <summary>
    ///WORD控件的测试例子/// </summary>
    public partial classWordViewer : Form
{
//记录窗体的名称 readonly stringmainFormText;publicWordViewer()
{
InitializeComponent();
//记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称 mainFormText = this.Text;this.richEditControl1.DocumentLoaded += newEventHandler(richEditControl1_DocumentLoaded);
}
/// <summary> ///WORD文档变化后,实现对新文件名称的显示/// </summary> void richEditControl1_DocumentLoaded(objectsender, EventArgs e)
{
string fileName = Path.GetFileName(this.richEditControl1.Options.DocumentSaveOptions.CurrentFileName);if(String.IsNullOrEmpty(fileName))
{
Text
=mainFormText;
}
else{
Text
= fileName + "-" +mainFormText;
}
//修改默认字体 DocumentRange range =richEditControl1.Document.Range;
CharacterProperties cp
= this.richEditControl1.Document.BeginUpdateCharacters(range);
cp.FontName
= "新宋体";//cp.FontSize = 12; this.richEditControl1.Document.EndUpdateCharacters(cp);
}
/// <summary> ///打开WORD文件/// </summary> private void btnOpenFile_Click(objectsender, EventArgs e)
{
string filePath =FileDialogHelper.OpenWord();if (!string.IsNullOrEmpty(filePath))
{
richEditControl1.LoadDocument(filePath);
//, DocumentFormat.Doc); }
}
/// <summary> ///保存WORD文件/// </summary> private void btnSaveFile_Click(objectsender, EventArgs e)
{
this.richEditControl1.SaveDocument();
}
/// <summary> ///另存为WORD文件/// </summary> private void btnSaveAs_Click(objectsender, EventArgs e)
{
try{
richEditControl1.SaveDocumentAs();
MessageUtil.ShowTips(
"保存成功");
}
catch(Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}
/// <summary> ///WORD文件打印/// </summary> private void btnPreview_Click(objectsender, EventArgs e)
{
this.richEditControl1.ShowPrintPreview();
}
}

加载文档后,界面显示内容如下所示:

文档控件很容易支持打印预览功能,打印预览的界面如下所示

不过话说回来,这个RichEditControl虽然能够较好显示Word文档,不过也有一些字体显示的不是很好,格式和微软的Word软件显示的有些不太一样,格式有所损失。

因此如果对于格式要求比较严谨的,建议还是只是做显示为佳,不要保存原有的文档。如果对格式不是特别严格,倒是可以作为一个文档服务器实现文档的新建、保存处理。

3、Excel文档的预览和操作

对于Excel文档的预览和操作,DevExpress控件在最近版本中增加的XtraSpreadsheet.SpreadsheetControl控件就可以实现Excel的显示和处理操作,这个控件很强大,可以处理很复杂格式的Excel文档,虽然我原来使用了另外一个FarPoint Spread控件组,不过这个XtraSpreadsheet控件组,如果集成在DevExpress也就很方便了。

这个DevExpress的控件,可以在其中进行Excel的新建、保存、打印预览等操作,当然也可以打开我们已有的Excel文件了。

打开文件后,界面效果如下所示。

界面的相关功能操作代码如下所示。

    /// <summary>
    ///Excel控件的测试例子/// </summary>
    public partial classExcelViewer : Form
{
//记录窗体的名称 readonly stringmainFormText;publicExcelViewer()
{
InitializeComponent();
//记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称 mainFormText = this.Text;this.spreadsheetControl1.DocumentLoaded += newEventHandler(spreadsheetControl1_DocumentLoaded);
}
/// <summary> ///文档变化后,实现对新文件名称的显示/// </summary> void spreadsheetControl1_DocumentLoaded(objectsender, EventArgs e)
{
string fileName = Path.GetFileName(this.spreadsheetControl1.Document.Path);if(String.IsNullOrEmpty(fileName))
{
Text
=mainFormText;
}
else{
Text
= fileName + "-" +mainFormText;
}
}
/// <summary> ///打开Excel文件/// </summary> private void btnOpenFile_Click(objectsender, EventArgs e)
{
string filePath =FileDialogHelper.OpenExcel();if (!string.IsNullOrEmpty(filePath))
{
IWorkbook workbook
=spreadsheetControl1.Document;
workbook.LoadDocument(filePath);
}
}
/// <summary> ///保存Excel文件/// </summary> private void btnSaveFile_Click(objectsender, EventArgs e)
{
spreadsheetControl1.SaveDocument();
}
/// <summary> ///另存为Excel文件/// </summary> private void btnSaveAs_Click(objectsender, EventArgs e)
{
string dir =System.Environment.CurrentDirectory;string filePath = FileDialogHelper.SaveExcel("", dir);if (!string.IsNullOrEmpty(filePath))
{
try{
IWorkbook workbook
=spreadsheetControl1.Document;
workbook.SaveDocument(filePath);

MessageUtil.ShowTips(
"保存成功");
}
catch(Exception ex)
{
LogTextHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
}
}
}
/// <summary> ///Excel文件打印/// </summary> private void btnPreview_Click(objectsender, EventArgs e)
{
this.spreadsheetControl1.ShowPrintPreview();
}
}

预览也很方便,和Word的预览操作类似。

以上就是几个常用文档的显示和操作案例,有了这些我们很容易整合到我们的附件管理里面了。

如我在我的《Winform开发框架》、《混合式开发框架里面》使用的通用附件管理模块,就是基于这些特点,实现图片、Excel文档、Word文档和PDF等文档的在线预览和管理操作,界面截图如下所示。

在较早期的Dev开发中,基本上都是在使用一个DLL包的汉化文件,如基于13.1的汉化包文件Dxper.LocalizationCHS.Win.v13.1.5.dll,这个汉化包也比较方便,大多数时候复制一个文件就搞定了。不过这样的汉化包一般同步更新比较慢,最近使用了DevExpress当前较新版本14.*后,希望集成使用官方的汉化文件,本文介绍在使用官方汉化文件的一些历程和心得,希望对后来者有帮助。

我们知道,如果使用有其他方处理汉化包文件(类似汉化包Dxper.LocalizationCHS.Win.v13.1.5.dll),这样的方式就是复制文件比较方便,如果使用官方汉化包,复制的文件比较多,比较零散。但是使用官方汉化包也有好处,就调用的时候,一句话就可以把界面线程的语言进行切换了,而且打包的时候,也不会有太多的不同。

1、如何在程序中使用官方汉化文件

Dev的官方汉化文件,是一系列的独立资源类,它对应着不同的界面汉化内容,如下界面截图所示。

以上这些文件是全部界面方面的汉化处理,一般情况下,我们不需要全部的内容,只需要我们使用到对应模块的汉化资源就可以了,所以即使是复制,也是复制一部分进行使用。

一般情况下,我们根据需要复制一部分即可。

准备好上面的文件后,我们在程序代码里面,需要增加一句话,指定去对应目录获取汉化资源文件即可。

这样如果我们是直接复制文件去机器上运行,记得把zh-CN目录下的资源文件一并复制过去,运行起来就可以看到Dev控件的中文化菜单或者提示了。

2、如何在安装包里面使用汉化文件

对于这么多汉化文件,看起来虽然比较多,但是,打包的时候,你最终也只是把这些零散的内容整合到安装包里面了,所以没有太多的不一样的地方。

一般情况下,我们在安装包里面,集成汉化文件的时候,就在文件视图里面,把对应的zh-CN目录整个拖动到VS的安装包设计器里面,就可以了,这样所有相关的文件都会加入进来,也是非常方便的。

做好这一步,其他的内容,就是按照常规的方式进行添加或者处理就可以了,对于安装包,有时候通过刷新引用关系,并检查某些文件是否遗漏即可。

以上是基于VS2010的安装包处理,对于VS2012、VS2013以上,他们的做法上有所不同,不过总体的步骤是一致的。

3、DevExpress14的版本使用总结

对于引入Dev14.*的版本,由于它们增加了对PDF的改善支持,因此我们可以直接在附件里面预览PDF文档而没有出现格式出错的情况了(13.*处理PDF的格式会有问题),另外还增强了XtraSpreadSheet的功能,因此也可以使用这个模块来处理Excel的相关内容了,Word照常可以使用RichEdit控件进行预览和处理,不过格式显示依旧有一些失真,有些地方字体显示还是不太好。

不过基于PDF、RichEdit和SpreadSheet的功能,可以使用它们进行很好的应用了。如我在我的《Winform开发框架》、《混合式开发框架里面》使用的通用附件管理模块,就是基于这些特点,实现图片、Excel文档、Word文档和PDF等文档的在线预览和管理操作,界面截图如下所示。

由于引进了一些新的对象,如Range等,这些如果你在Aspose.Cell里面已经使用它来处理报表方面的时候,那么就需要特别声明了,因为它会和DevExpress里面的SpreadSheet里面的对象类产生冲突,一般情况下处理下就可以了。

除了这些,基本上没有其他的冲突问题,DevExpress版本的更新,依旧保持比较的向后兼容的情况。

在做企业电子商务方面,微信小店虽然较淘宝天猫等起步较晚,但是作为一个电商平台,这个影响力不容忽视,结合微信的特点和便利,微信小店具有很好的粘合性和广泛的用户基础,因此花费一定的时间,在这方面做深入的研究和应用,也是我一个感兴趣的领域,本文基于前面微信系列文章的基础上,再对微信小店的内容进行一个系列化的介绍,希望对大家理解和使用上有所帮助,同时也把我自己的微信系列文章推向纵深的领域和方向。

1、微信小店的申请和搭建

微信小店的资质是必须为认证的公众号,并且需要认证后进行独立的申请,提交相关的企业信息和财务相关信息,手续和盖章的文件相对有点繁琐,不过为了好好研究和应用微信小店的功能,这些都没什么了,就按照他们的要求一步步提供相应的材料即可。

通过后,在自己的接口功能列表里面,可以看到对应的接口已经获取到了。

有了这些功能模块,第一步,我们就可以在微信公众号的管理平台上添加对应的商品信息,然后搭建好自己的微信店铺了。

我们进入微信小店,可以看到微信小店的响应功能操作界面。

我们第一步是需要添加对应的商品信息,从分类里面选择适合自己的分类,然后添加对应的商品信息和图片。

最后,我们添加完成了自己的商品列表(包括商品信息和商品分组的处理),完成后,类似的界面如下所示。

为了把商品合理的展示出来,微信小店引入了一个货架的概念,就是把商品分门别类的很好展示给客户,货架就是类似一个布局良好的展柜,我们可以定义不同的货架,然后公布不同的URL进行体验。

构建好货架信息后,我们就可以把货架的URL放到微信的菜单里面去了,这样我们就可以查看到自己的微信小店了。

当然店铺可以下单并进行处理了,客户下了订单,我们可以为微信小店的管理界面上进行订单的发货管理等操作。

在我们发货后,系统会有一个信息提示给对应购买者的微信号,如下所示。

如果需要了解我的微信小店的功能,可以扫描下面二维码进行关注我们的认证公众号:
广州爱奇迪

2、微信小店的对象模型

通过前面第1小节的学习,我们可能已经了解到了大概的微信小店的相关对象模型了,基本上就是包括了,常规的商品、商品分组、货架、库存、订单这些,还有商品分类,商品分类属性、商品分类SKU、快递邮寄模板、图片管理等功能。

为了更有效了解整个对象模型,我绘制了一些图形以帮助了解这些对象模型。

上面的图形,很好地阐述了这些对象的关系,基本上就是,我们第一接触的就是货架管理,通过货架入口,绑定了显示的商品分组和数量,我们就可以看到对应的商品信息,而商品通过图片、分类、属性、SKU等信息构建一个完整的商品对象,另外在货架的入口里面,我们可以对商品进行下订单,因此设计到订单和库存的管理,订单的发货需要有运费模板进行关联,从而实现完整的一个微信店铺的流程处理。

当然其中每个模型都有其对应的API接口,为了更加方便了解微信小店提供的功能接口,我通过图形列出上面涉及到的对象的功能接口,如下所示。

除了商品的对象模型接口,还有下面的一些接口。

3、微信小店API的使用

上面通过图示的方式,介绍了微信小店的相关对象和接口功能,这些我只是根据微信API提供的内容进行了汇总而已。

要了解更加详细的接口说明,我们还是需要参考微信的官方接口说明。

但是通过上面图示的接口功能图,我们可以整理出对应的微信小店的API接口和实现了。

下面的接口类和接口实现类,就是根据上面的分析和微信店铺的文档说明进行整理的C#开发封装处理。

由于接口涉及的内容比较多,因此我通过几个接口进行一定的见解,其他的如此类推。

例如对于微店商品的管理,我定义了下列的接口代码。

    /// <summary>
    ///微小店管理的商品API接口/// </summary>
    public interfaceIMerchantApi
{
#region 商品信息 /// <summary> ///创建商品/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="merchantJson">商品对象</param> AddMerchantResult AddMerchant(stringaccessToken, MerchantJson merchantJson);/// <summary> ///删除商品/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="productId">商品ID</param> CommonResult DeleteMerchant(string accessToken, stringproductId);/// <summary> ///修改商品///product_id表示要更新的商品的ID,其他字段说明请参考增加商品接口。///从未上架的商品所有信息均可修改,否则商品的名称(name)、商品分类(category)、商品属性(property)这三个字段不可修改。/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="merchantJson">修改商品的信息</param> CommonResult UpdateMerchant(stringaccessToken, MerchantJson merchantJson);/// <summary> ///根据ID查询商品信息,如果成功返回MerchantJson信息,否则返回null/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="productId">商品的Id</param> MerchantJson GetMerchant(string accessToken, string productId);

通过有效的封装处理,他们的一些实现代码也很简单,如下所示。

        /// <summary>
        ///创建商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="merchantJson">商品对象</param>
        /// <returns></returns>
        public AddMerchantResult AddMerchant(stringaccessToken, MerchantJson merchantJson)
{
var url = string.Format("https://api.weixin.qq.com/merchant/create?access_token={0}", accessToken);string postData =merchantJson.ToJson();return JsonHelper<AddMerchantResult>.ConvertJson(url, postData);
}
/// <summary> ///删除商品/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="productId">商品ID</param> /// <returns></returns> public CommonResult DeleteMerchant(string accessToken, stringproductId)
{
var url = string.Format("https://api.weixin.qq.com/merchant/del?access_token={0}", accessToken);var data = new{
product_id
=productId
};
string postData =data.ToJson();returnHelper.GetExecuteResult(url, postData);
}

基于文章篇幅的考虑,下面系列文章再进行单独的模型介绍和讲解。

如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:

C#开发微信门户及应用(25)-微信企业号的客户端管理功能

C#开发微信门户及应用(24)-微信小店货架信息管理

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

C#开发微信门户及应用(22)-微信小店的开发和使用

C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

C#开发微信门户及应用(20)-微信企业号的菜单管理

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

C#开发微信门户及应用(16)-微信企业号的配置和使用

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

C#开发微信门户及应用(13)-使用地理位置扩展相关应用

C#开发微信门户及应用(12)-使用语音处理

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

C#开发微信门户及应用(7)-微信多客服功能及开发集成

C#开发微信门户及应用(6)--微信门户菜单的管理操作

C#开发微信门户及应用(5)--用户分组信息管理

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

C#开发微信门户及应用(3)--文本消息和图文消息的应答


C#开发微信门户及应用(2)--微信消息的处理和应答


C#开发微信门户及应用(1)--开始使用微信接口

在上篇《
C#开发微信门户及应用(22)-微信小店的开发和使用
》里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用。微信小店的相关对象模型,基本上包括了常规的商品、商品分组、货架、库存、订单这些模型,还有商品分类,商品分类属性、商品分类SKU、快递邮寄模板、图片管理等功能。本文介绍的接口封装也就是基于这些内容进行的,并针对接口的实现进行测试和使用。

1、商品管理接口的定义

前面文章介绍了微信小店的对象模型,如下所示。

这个图形基本上覆盖了微信小店的相关对象,并介绍了它们之间的关系了。

我们从基础的商品信息管理入手,我们知道,商品接口包含了增加、修改、查询、删除等接口,如下所示。

商品信息是所有微店的基础,因此对它的管理操作,我们需要更加清晰和完善。

综上所述的功能,我们可以定义好微信商品的接口如下所示。

        #region 商品信息
        /// <summary>
        ///创建商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="merchantJson">商品对象</param>
        /// <returns></returns>
        AddMerchantResult AddMerchant(stringaccessToken, MerchantJson merchantJson);/// <summary>
        ///删除商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="productId">商品ID</param>
        /// <returns></returns>
        CommonResult DeleteMerchant(string accessToken, stringproductId);/// <summary>
        ///修改商品///product_id表示要更新的商品的ID,其他字段说明请参考增加商品接口。///从未上架的商品所有信息均可修改,否则商品的名称(name)、商品分类(category)、商品属性(property)这三个字段不可修改。/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="merchantJson">修改商品的信息</param>
        /// <returns></returns>
        CommonResult UpdateMerchant(stringaccessToken, MerchantJson merchantJson);/// <summary>
        ///根据ID查询商品信息,如果成功返回MerchantJson信息,否则返回null/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="productId">商品的Id</param>
        /// <returns></returns>
        MerchantJson GetMerchant(string accessToken, stringproductId);/// <summary>
        ///获取指定状态的所有商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="status">商品状态(0-全部, 1-上架, 2-下架)</param>
        /// <returns></returns>
        List<MerchantJson> GetMerchantByStatus(string accessToken, intstatus);/// <summary>
        ///商品上下架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="status">商品上下架标识(0-下架, 1-上架)</param>
        /// <returns></returns>
        CommonResult UpdateMerchantStatus(string accessToken, string productId, intstatus);#endregion

当然,微信的商品还包含了分类、分类属性、分类SKU的基础管理,因此商品管理还需要增加这个内容

它们的功能接口定义如下所示。通过下面的接口,我们就很容易实现商品分类(不是商品分组)、SKU信息、和分类属性等信息的获取操作了。

        #region 商品分类及属性
        /// <summary>
        ///获取指定分类的所有子分类/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="cateId">大分类ID(根节点分类id为1)</param>
        /// <returns></returns>
        List<SubCategory> GetSub(string accessToken, intcate_id);/// <summary>
        ///获取指定子分类的所有SKU/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="cateId">商品子分类ID</param>
        /// <returns></returns>
        List<SubCategorySku> GetSku(string accessToken, intcate_id);/// <summary>
        ///获取指定分类的所有属性/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="cateId">分类ID</param>
        /// <returns></returns>
        List<SubCategoryProperty> GetProperty(string accessToken, intcate_id);#endregion

2、商品管理接口的实现

上面的接口定义了对应商品的接口。

对于接口的实现,我们一般都是根据官方网站的接口说明,提交到那个URL,并且是POST那些数据,然后整理成一个常规的处理方式,获得结果并转换为对应的对象即可,如添加商品操作的实现代码如下所示。

        /// <summary>
        ///创建商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="merchantJson">商品对象</param>
        /// <returns></returns>
        public AddMerchantResult AddMerchant(stringaccessToken, MerchantJson merchantJson)
{
var url = string.Format("https://api.weixin.qq.com/merchant/create?access_token={0}", accessToken);string postData =merchantJson.ToJson();return JsonHelper<AddMerchantResult>.ConvertJson(url, postData);
}

而返回结果,这是定义一个对象来获得添加商品的ID等内容,如下所示。

    /// <summary>
    ///创建商品信息的返回结果/// </summary>
    public classAddMerchantResult : ErrorJsonResult
{
/// <summary> ///商品ID/// </summary> public string product_id { get; set; }
}

而基类这是常规的响应内容

    /// <summary>
    ///微信返回Json结果的错误数据/// </summary>
    public classErrorJsonResult 
{
/// <summary> ///返回代码/// </summary> public ReturnCode errcode { get; set; }/// <summary> ///错误消息/// </summary> public string errmsg { get; set; }
}

通过这些对象的定义,添加商品后,我们就知道操作是否成功,如果添加成功,返回了一个刚刚创建的ID给我们使用,我们可以进行查询具体的商品信息或者进行修改、删除等操作的。

而对商品信息的修改或者删除的操作,都是返回一个是否成功的记录就可以了,因此我们定义了一个统一的回应对象CommonResult。商品修改、删除的接口实现代码如下所示。

由于代码我都进行高度的完善和整理,对于各种处理的代码都相对比较容易理解的了。

        /// <summary>
        ///删除商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="productId">商品ID</param>
        /// <returns></returns>
        public CommonResult DeleteMerchant(string accessToken, stringproductId)
{
var url = string.Format("https://api.weixin.qq.com/merchant/del?access_token={0}", accessToken);var data = new{
product_id
=productId
};
string postData =data.ToJson();returnHelper.GetExecuteResult(url, postData);
}
/// <summary> ///修改商品///product_id表示要更新的商品的ID,其他字段说明请参考增加商品接口。///从未上架的商品所有信息均可修改,否则商品的名称(name)、商品分类(category)、商品属性(property)这三个字段不可修改。/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="merchantJson">修改商品的信息</param> /// <returns></returns> public CommonResult UpdateMerchant(stringaccessToken, MerchantJson merchantJson)
{
var url = string.Format("https://api.weixin.qq.com/merchant/update?access_token={0}", accessToken);string postData =merchantJson.ToJson();returnHelper.GetExecuteResult(url, postData);
}

为了获取商品的详细信息,我们需要定义一个商品的实体对象,以便我们把获取到的信息转换为实体类信息,方便使用和处理。

商品的信息,包含了不少细小定义的类,他们构成了商品的各个部分的内容,主体的实体类信息如下所示。

定义好相对比较复杂的商品信息实体后,我们就可以通过对象进行处理了。

获取商品详细信息的实现代码如下所示。

        /// <summary>
        ///根据ID查询商品信息,如果成功返回MerchantJson信息,否则返回null/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="productId">商品的Id</param>
        /// <returns></returns>
        public MerchantJson GetMerchant(string accessToken, stringproductId)
{
var url = string.Format("https://api.weixin.qq.com/merchant/get?access_token={0}", accessToken);var data = new{
product_id
=productId
};
string postData =data.ToJson();

MerchantJson merchant
= null;
GetMerchantResult result
= JsonHelper<GetMerchantResult>.ConvertJson(url, postData);if (result != null)
{
merchant
=result.product_info;
}
returnmerchant;
}

虽然商品的实体信息很复杂,但是一旦我们定义好,我们就很容易对结果进行转换并处理了,上面的代码并不是很难理解,主要就是提交数据后,对数据进行转换而已。

当然,我们还可以获取不同状态的商品列表内容,如下代码所示。

        /// <summary>
        ///获取指定状态的所有商品/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="status">商品状态(0-全部, 1-上架, 2-下架)</param>
        /// <returns></returns>
        public List<MerchantJson> GetMerchantByStatus(string accessToken, intstatus)
{
var url = string.Format("https://api.weixin.qq.com/merchant/getbystatus?access_token={0}", accessToken);var data = new{
status
=status
};
string postData =data.ToJson();

List
<MerchantJson> list = new List<MerchantJson>();
GetMerchantByStatus result
= JsonHelper<GetMerchantByStatus>.ConvertJson(url, postData);if (result != null)
{
list
=result.products_info;
}
returnlist;
}

我们添加商品的时候,商品的分类信息、分类属性、分类SKU信息也都是很重要的内容,我们需要指定对应商品分类才能添加到微信小店里面。

获取商品分类的操作实现代码如下所示。

        /// <summary>
        ///获取指定分类的所有子分类/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="cateId">大分类ID(根节点分类id为1)</param>
        /// <returns></returns>
        public List<SubCategory> GetSub(string accessToken, intcate_id)
{
var url = string.Format("https://api.weixin.qq.com/merchant/category/getsub?access_token={0}", accessToken);var data = new{
cate_id
=cate_id
};
string postData =data.ToJson();

List
<SubCategory> list = new List<SubCategory>();
GetSubResult result
= JsonHelper<GetSubResult>.ConvertJson(url, postData);if(result != null)
{
list
=result.cate_list;
}
returnlist;
}

3、商品管理接口的测试

为了验证我们开发的接口,我们需要增加一个测试项目,方便对我们编写的API进行测试,测试完全成功后,我们才能正式在项目中使用。

我为了方便,创建了一个Winform项目,分别对各个接口进行测试。

本篇主要介绍商品管理方面的接口,因此下面主要介绍其中商品管理部分的接口测试代码,以及对应的结果。

其中商品常规管理的接口测试代码如下所示。

        private void btnMerchant_Click(objectsender, EventArgs e)
{
//商品管理 IMerchantApi api = newMerchantApi();//获取所有商品信息 Console.WriteLine("获取所有商品信息");
List
<MerchantJson> list = api.GetMerchantByStatus(token, 0);foreach(MerchantJson json inlist)
{
Console.WriteLine(json.ToJson());
Console.WriteLine();
}
//更新商品状态 Console.WriteLine("更新商品状态");foreach (MerchantJson json inlist)
{
CommonResult result
= api.UpdateMerchantStatus(token, json.product_id, 1);
Console.WriteLine(
"商品ID:{0},商品名称:{1}, 操作:{2}",
json.product_id, json.product_base.name, result.Success
? "成功" : "失败");
}

Thread.Sleep(
1000);//根据商品ID获取商品信息 Console.WriteLine("根据商品ID获取商品信息");foreach (MerchantJson json inlist)
{
MerchantJson getJson
=api.GetMerchant(token, json.product_id);if(json != null)
{
Console.WriteLine(
"商品ID:{0},商品名称:{1}", getJson.product_id, getJson.product_base.name);
}
}
}

测试后结果如下所示(就是返回我微店铺里面的商品信息),一切正常。

返回的商品Json数据如下所示:


{"product_id": "pSiLnt6FYDuFtrRRPMlkdKbye-rE","product_base": {"category_id": ["537103312"],"property": [
{
"id": "类型","vid": "软件产品设计"}
],
"name": "代码生成工具Database2Sharp","sku_info": [],"main_img": "http://mmbiz.qpic.cn/mmbiz/mLqH9gr11Gyb2sgiaelcsxYtQENGePp0Rb3AZKbjkicnKTUNBrEdo7Dyic97ar46SoAfKRB5x2R94bDUdNpgqiaZzA/0","img": ["http://mmbiz.qpic.cn/mmbiz/mLqH9gr11Gyb2sgiaelcsxYtQENGePp0RiaheJmVXm7tbvTYUQV7OF3DgfGiaQVMh3WbeEcGDOQQiajQXGKK9tfoeA/0"],"detail": [],"buy_limit": 0,"detail_html": ""},"sku_list": [
{
"sku_id": "","ori_price": 100000,"price": 50000,"icon_url": "","quantity": 1100,"product_code": ""}
],
"attrext": {"location": {"country": "中国","province": "广东","city": "广州","address": ""},"isPostFree": 1,"isHasReceipt": 0,"isUnderGuaranty": 0,"isSupportReplace": 0},"delivery_info": {"delivery_type": 0,"template_id": 175807970,"express": [
{
"id": 10000027,"price": 0},
{
"id": 10000028,"price": 0},
{
"id": 10000029,"price": 0}
]
},
"status": 1}

View Code

测试的部分结果输出如下所示。

另外,“商品维护管理”的功能测试主要就是测试商品的增加、修改、删除操作,具体代码如下所示。

        private void btnMerchantEdit_Click(objectsender, EventArgs e)
{
IMerchantApi api
= newMerchantApi();string img1 = "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjD3ulEKogfsiaua49pvLfUS8Ym0GSYjViaLic0FD3vN0V8PILcibEGb2fPfEOmw/0";string img2 = "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjD3ul1UcLcwxrFdwTKYhH9Q5YZoCfX4Ncx655ZK6ibnlibCCErbKQtReySaVA/0";string img3 = "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl28bJj62XgfHPibY3ORKicN1oJ4CcoIr4BMbfA8LqyyjzOZzqrOGz3f5KWq1QGP3fo6TOTSYD3TBQjuw/0";//商品增删改处理 MerchantJson merchant = newMerchantJson();
merchant.product_base
= newMerchant_base();
merchant.product_base.name
= "测试产品";
merchant.product_base.category_id.Add(
"537074298");
merchant.product_base.img
= new List<string>() { img1, img2, img3 };
merchant.product_base.main_img
=img1;
merchant.product_base.detail.AddRange(
new List<MerchantDetail>() {newMerchantDetail()
{
text
= "test first"},newMerchantDetail()
{
img
=img2
},
newMerchantDetail()
{
text
= "test again"}
});
merchant.product_base.property.AddRange(
new List<MerchantProperty>(){newMerchantProperty
{
id
= "1075741879",
vid
="1079749967"},newMerchantProperty{
id
= "1075754127",
vid
= "1079795198"},newMerchantProperty(){
id
= "1075777334",
vid
= "1079837440"}
});
merchant.product_base.sku_info.AddRange(
new List<MerchantSku>(){newMerchantSku{
id
= "1075741873",
vid
= new List<string>() {"1079742386","1079742363"}
}
});
merchant.product_base.buy_limit
= 10;//merchant.product_base.detail_html = "<div class=\"item_pic_wrp\" style=\"margin-bottom:8px;font-size:0;\"><img class=\"item_pic\" style=\"width:100%;\" alt=\"\" src=\"http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjD3ulEKogfsiaua49pvLfUS8Ym0GSYjViaLic0FD3vN0V8PILcibEGb2fPfEOmw/0\" ></div><p style=\"margin-bottom:11px;margin-top:11px;\">test</p><div class=\"item_pic_wrp\" style=\"margin-bottom:8px;font-size:0;\"><img class=\"item_pic\" style=\"width:100%;\" alt=\"\" src=\"http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjD3ul1UcLcwxrFdwTKYhH9Q5YZoCfX4Ncx655ZK6ibnlibCCErbKQtReySaVA/0\" ></div><p style=\"margin-bottom:11px;margin-top:11px;\">test again</p>"; merchant.sku_list.AddRange(new List<MerchantSku_list>()
{
newMerchantSku_list(){
sku_id
="1075741873:1079742386",
price
=30,
icon_url
="http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2iccsvYbHvnphkyGtnvjD3ulEKogfsiaua49pvLfUS8Ym0GSYjViaLic0FD3vN0V8PILcibEGb2fPfEOmw/0",
quantity
=800,
product_code
="testing",
ori_price
=9000000},newMerchantSku_list(){
sku_id
="1075741873:1079742363",
price
=30,
icon_url
="http://mmbiz.qpic.cn/mmbiz/4whpV1VZl28bJj62XgfHPibY3ORKicN1oJ4CcoIr4BMbfA8LqyyjzOZzqrOGz3f5KWq1QGP3fo6TOTSYD3TBQjuw/0",
quantity
=800,
product_code
="testingtesting",
ori_price
=9000000}
});
merchant.attrext
= newMerchantAttrext()
{
location
= newMerchantLocation()
{
country
= "中国",
province
= "广东省",
city
= "广州市",
address
= "T.I.T创意园"},
isPostFree
= 0,
isHasReceipt
= 1,
isUnderGuaranty
= 0,
isSupportReplace
= 0};
merchant.delivery_info
= newMerchantDelivery()
{
delivery_type
= 0,
template_id
= 0,
express
= new List<MerchantExpress>(){newMerchantExpress() {
id
=10000027,
price
=100},newMerchantExpress(){
id
=10000028,
price
=100},newMerchantExpress(){
id
=10000029,
price
=100}}
};

Console.WriteLine(merchant.ToJson());

AddMerchantResult result
=api.AddMerchant(token, merchant);
Console.WriteLine(
"添加商品:{0}", result.product_id);if (!string.IsNullOrEmpty(result.product_id))
{
//更新商品 merchant.product_id =result.product_id;
merchant.product_base.name
= "测试产品22";
CommonResult updateResult
=api.UpdateMerchant(token, merchant);
Console.WriteLine(
"更新商品:{0}", updateResult.Success ? "成功" : "失败");


CommonResult deleteResult
=api.DeleteMerchant(token, merchant.product_id);
Console.WriteLine(
"删除商品:{0}", deleteResult.Success ? "成功" : "失败");
}
}

测试的输出结果如下所示(一切成功)。

以上就是我对商品管理接口的API定义和实现,以及对接口进行测试的阐述,基本上把所有相关的内容都贴出来了,希望大家能够对微店开发部分,有更深入的了解和认识。

如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:

C#开发微信门户及应用(25)-微信企业号的客户端管理功能

C#开发微信门户及应用(24)-微信小店货架信息管理

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

C#开发微信门户及应用(22)-微信小店的开发和使用

C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

C#开发微信门户及应用(20)-微信企业号的菜单管理

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

C#开发微信门户及应用(16)-微信企业号的配置和使用

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

C#开发微信门户及应用(13)-使用地理位置扩展相关应用

C#开发微信门户及应用(12)-使用语音处理

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

C#开发微信门户及应用(7)-微信多客服功能及开发集成

C#开发微信门户及应用(6)--微信门户菜单的管理操作

C#开发微信门户及应用(5)--用户分组信息管理

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

C#开发微信门户及应用(3)--文本消息和图文消息的应答


C#开发微信门户及应用(2)--微信消息的处理和应答


C#开发微信门户及应用(1)--开始使用微信接口

在前面微信小店系列篇《
C#开发微信门户及应用(22)-微信小店的开发和使用
》里面介绍了一些微信小店的基础知识,以及《
C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
》里面详细介绍了微信小店商品的接口定义、实现和测试的内容,本文主要介绍微信小店货架信息管理。这个模块是在微信小店对象里面,最为复杂,也是最难理解的一个模块,对于它的对象建模,需要反复测试才能完善起来,因此这个货架管理模块,可以说是最具技术含量的一个模块了。

1、微信小店货架介绍

在微信公众号的后台里面,可以对货架信息进行维护,界面如下所示。货架的概念,就是把商品分门别类的很好展示给客户,货架就是类似一个布局良好的展柜,我们可以定义不同的货架,然后公布不同的URL进行体验。

另外,我们一般创建货架,都是基于货架的模板库来构建的,货架的模板给我们快速构建一个货架,提供了可视化的参考界面,货架模板界面如下所示。

2、货架管理的开发模型

对于利用API开发微信店铺,微信小店的货架管理操作接口,和常规的模块差不多,具有下面几个功能操作。

虽然看起来和前面的对象模型差不多,但是货架的信息非常复杂,因此你如果需要根据Json数据把它还原为实体对象的时候,需要反复进行斟酌,否则很容易建模错误。

对应着微信小店管理界面的货架模板,货架的对象信息包括了5个不同的控件模型,它们有的可以进行组合使用。

几个货架的模型展示如下所示。



通过上面5个控件模型,我们可以看到它们分别代表不一样的布局效果,而且它们可以在货架上进行组合使用的。

3、货架信息的对象建模

根据微信小店的接口说明,我们最终定义的货架实体对象信息,内容就非常丰富和弹性化。

我们通过参考微信小店的API说明,就可以看到货架的信息JSON数据很复杂,具体定义如下所示。


{"shelf_data": {"module_infos": [
{
"group_info": {"filter": {"count": 2},"group_id": 50},"eid": 1},
{
"group_infos": {"groups": [
{
"group_id": 49},
{
"group_id": 50},
{
"group_id": 51}
]
},
"eid": 2},
{
"group_info": {"group_id": 52,"img": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl29nqqObBwFwnIX3licVPnFV5Jm64z4I0TTicv0TjN7Vl9bykUUibYKIOjicAwIt6Oy0Y6a1Rjp5Tos8tg/0"},"eid": 3},
{
"group_infos": {"groups": [
{
"group_id": 49,"img": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl29nqqObBwFwnIX3licVPnFV5uUQx7TLx4tB9qZfbe3JmqR4NkkEmpb5LUWoXF1ek9nga0IkeSSFZ8g/0"},
{
"group_id": 50,"img": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl29nqqObBwFwnIX3licVPnFV5G1kdy3ViblHrR54gbCmbiaMnl5HpLGm5JFeENyO9FEZAy6mPypEpLibLA/0"},
{
"group_id": 52,"img": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl29nqqObBwFwnIX3licVPnFV5uUQx7TLx4tB9qZfbe3JmqR4NkkEmpb5LUWoXF1ek9nga0IkeSSFZ8g/0"}
]
},
"eid": 4},
{
"group_infos": {"groups": [
{
"group_id": 43},
{
"group_id": 44},
{
"group_id": 45},
{
"group_id": 46}
],
"img_background": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl29nqqObBwFwnIX3licVPnFV5uUQx7TLx4tB9qZfbe3JmqR4NkkEmpb5LUWoXF1ek9nga0IkeSSFZ8g/0"},"eid": 5}
]
},
"shelf_banner": "http://mmbiz.qpic.cn/mmbiz/4whpV1VZl2ibrWQn8zWFUh1YznsMV0XEiavFfLzDWYyvQOBBszXlMaiabGWzz5B2KhNn2IDemHa3iarmCyribYlZYyw/0","shelf_name": "测试货架"}

View Code

我们根据JSON数据的定义,定义了几个货架控件的对象,他们的关系如下所示。

我们可以根据JSON数据进行实体对象的建模,然后有了这些对象,我们就可以进一步定义好货架的相关操作接口了,接口定义如下所示。

        #region 货架管理

        /// <summary>
        ///增加货架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="shelfBanner">货架招牌图片Url</param>
        /// <param name="shelfName">货架名称</param>
        /// <param name="controls">货架控件1,2,3,4,5类型的集合</param>
        /// <returns></returns>
        AddShelfResult AddShelf(string accessToken, string shelfBanner, string shelfName, List<ShelfControlBase>controls);/// <summary>
        ///删除货架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="shelfId">货架Id</param>
        /// <returns></returns>
        CommonResult DeleteShelf(string accessToken, intshelfId);/// <summary>
        ///修改货架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="shelfId">货架Id</param>
        /// <param name="shelfBanner">货架招牌图片Url</param>
        /// <param name="shelfName">货架名称</param>
        /// <param name="controls">货架控件1,2,3,4,5类型的集合</param>
        /// <returns></returns>
        CommonResult UpdateShelf(string accessToken, int shelfId, string shelfBanner, string shelfName, List<ShelfControlBase>controls);/// <summary>
        ///获取所有货架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <returns></returns>
        List<ShelfJson> GetAllShelf(stringaccessToken);/// <summary>
        ///根据货架ID获取货架信息/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="shelfId">货架Id</param>
        /// <returns></returns>
        ShelfJson GetShelfById(string accessToken, intshelfId);#endregion

有了这些接口的定义,我们就需要实现对应的接口,从而实现我们向微信API的封装处理了。

微信小店的货架管理实现内容如下所示(部分内容,增删改)。

        /// <summary>
        ///增加货架/// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="shelfBanner">货架招牌图片Url</param>
        /// <param name="shelfName">货架名称</param>
        /// <param name="controls">货架控件1,2,3,4,5类型的集合</param>
        /// <returns></returns>
        public AddShelfResult AddShelf(string accessToken, string shelfBanner, string shelfName, List<ShelfControlBase>controls)
{
var url = string.Format("https://api.weixin.qq.com/merchant/shelf/add?access_token={0}", accessToken);var data = new{
shelf_data
= new{
module_infos
=controls
},
shelf_banner
=shelfBanner,
shelf_name
=shelfName
};
string postData =data.ToJson();return JsonHelper<AddShelfResult>.ConvertJson(url, postData);
}
/// <summary> ///删除货架/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="shelfId">货架Id</param> /// <returns></returns> public CommonResult DeleteShelf(string accessToken, intshelfId)
{
var url = string.Format("https://api.weixin.qq.com/merchant/shelf/del?access_token={0}", accessToken);var data = new{
shelf_id
=shelfId
};
string postData =data.ToJson();returnHelper.GetExecuteResult(url, postData);
}
/// <summary> ///修改货架/// </summary> /// <param name="accessToken">调用接口凭证</param> /// <param name="shelfId">货架Id</param> /// <param name="shelfBanner">货架招牌图片Url</param> /// <param name="shelfName">货架名称</param> /// <param name="controls">货架控件1,2,3,4,5类型的集合</param> /// <returns></returns> public CommonResult UpdateShelf(string accessToken, int shelfId, string shelfBanner, string shelfName, List<ShelfControlBase>controls)
{
var url = string.Format("https://api.weixin.qq.com/merchant/shelf/mod?access_token={0}", accessToken);var data = new{
shelf_id
=shelfId,
shelf_data
= new{
module_infos
=controls
},
shelf_banner
=shelfBanner,
shelf_name
=shelfName
};
string postData =data.ToJson();returnHelper.GetExecuteResult(url, postData);
}

4、微信小店货架管理的接口测试

由于货架管理的对象和接口定义比较复杂一些,一定需要进行反复的测试才能正式使用,如果不注意有可能你定义的实体类,获取不到某个字段信息。

我为了方便,创建了一个Winform项目,分别对各个接口进行测试。

对于货架管理内容的接口测试,测试代码如下所示。

        private void btnShelf_Click(objectsender, EventArgs e)
{
IMerchantApi api
= newMerchantApi();
List
<ShelfJson> list =api.GetAllShelf(token);
Console.WriteLine(list.ToJson());
foreach(ShelfJson json inlist)
{
Console.WriteLine(
"货架信息:");
ShelfJson getJson
=api.GetShelfById(token, json.shelf_id.Value);
Console.WriteLine(getJson.ToJson());
}
string shelf_banner = "http://mmbiz.qpic.cn/mmbiz/mLqH9gr11Gyb2sgiaelcsxYtQENGePp0RgeNlAQicfZQokjbJMUq4h8MHtjpekJNEWKuMN3gdRz5RxfkYb7NlIrw/0";string shelf_name = "测试货架";
ShelfControl1 c11
= new ShelfControl1(6, 202797386);
ShelfControl1 c12
= new ShelfControl1(4, 202797397);
List
<ShelfControlBase> controlList = new List<ShelfControlBase>(){c11, c12};
AddShelfResult result
=api.AddShelf(token, shelf_banner, shelf_name, controlList);if (result != null && result.shelf_id > 0)
{
Console.WriteLine(
"增加的货架信息:");
ShelfJson getJson
=api.GetShelfById(token, result.shelf_id);
Console.WriteLine(getJson.ToJson());

shelf_name
= "测试货架-修改";
controlList
= new List<ShelfControlBase>(){c11};
CommonResult updateReuslt
=api.UpdateShelf(token, result.shelf_id, shelf_banner, shelf_name, controlList);
Console.WriteLine(
"修改货架操作:{0}", updateReuslt.Success ? "成功" : "失败");

CommonResult deleteResult
=api.DeleteShelf(token, result.shelf_id);
Console.WriteLine(
"删除货架操作:{0}", deleteResult.Success ? "成功" : "失败");
}
}

如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:

C#开发微信门户及应用(24)-微信小店货架信息管理

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

C#开发微信门户及应用(22)-微信小店的开发和使用

C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

C#开发微信门户及应用(20)-微信企业号的菜单管理

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

C#开发微信门户及应用(16)-微信企业号的配置和使用

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

C#开发微信门户及应用(13)-使用地理位置扩展相关应用

C#开发微信门户及应用(12)-使用语音处理

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

C#开发微信门户及应用(7)-微信多客服功能及开发集成

C#开发微信门户及应用(6)--微信门户菜单的管理操作

C#开发微信门户及应用(5)--用户分组信息管理

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

C#开发微信门户及应用(3)--文本消息和图文消息的应答


C#开发微信门户及应用(2)--微信消息的处理和应答


C#开发微信门户及应用(1)--开始使用微信接口