• C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息


    在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码.希望从一个更高的层次介绍微信的开发.

     在《C#-MVC开发微信应用(6)--用户分组信息管理》具体介绍了微信用户分组接口的实现方法,本篇将介绍,如何在我的平台软件上进行管理我们微信上的用户分组。

    其实微信能够风风火火的原因,主要就是因为有用户信息,所以同步并管理好微信账号的关注用户数据是非常重要的。有了微信用户的数据,你可以和你任何应用系统对接,实现系统-手机客户端的数据整合,还可以对用户进行营销管理,如发送用户感兴趣的产品消息、服务消息等,能够很好扩大企业的影响力和市场行为。

    下面我们就来介绍一下微信分组管理的API封装过程,用户分组管理,包含下面几个方面的内容:

    1)创建分组
    2) 查询所有分组
    3) 查询用户所在分组
    4) 修改分组名
    5) 移动用户分组

    6) 删除分组

    1、用户分组,在管理系统中的界面设计

    针对以上微信分组的操作,我们可以在微信的应用管理系统里面,设计一个模块,用来管理微信的分组数据,在这个模块里面,可以创建分组,修改分组,查看分组等基础操作,还可以实现同步微信分组的操作,同步操作,主要就是把新增的分组信息添加到微信里面,修改的分组也在微信中实现修改功能,删除目前微信不支持,所以不用管了。最后,我们可以在此从微信服务器上,把修改后的数据同步下来,同步的时候为了避免对我们提交不成功的数据,我们需要对修改过的记录做好标识,这个就是我对整个同步操作的逻辑处理了。

    在管理系统里面,对微信分组的列表管理界面设计如下所示。

    创建分组的时候,我们只需要添加一个分组名称就可以了,界面设计也简单,但是我们把创建的ID统一设计为-1,作为未同步的新增标识。

    编辑分组信息界面如下所示。当对分组进行编辑保存后,系统会记住那些修改过的分组就是了。

    2、分组同步操作代码展示

    为了更好实现分组同步的管理,我把分组的操作代码,封装在一个MVC的控制器的方法里面,页面代码通过Ajax调用就可以实现同步操作了,同步成功,或者失败,都会提示用户,让我们对其结果进行了解。

    同步的时候,把本地新增的内容,在服务器上创建分组;把修改的的分组名称,在服务器上进行修改,然后进行同步列表处理,同步操作前,列表界面可能如下所示,有新增记录ID=-1的,也有修改后,记录修改标志的。

    用户分组的同步按钮操作,是调用一个脚本代码就可以了,具体代码如下所示。

      //同步数据
                    this.bindSyncDataClick = function(){
                        snf.message('confirm', "您确认需要和微信服务器同步分组信息吗", function (b) {
                            if (b) {
                                snf.ajax({
                                    type: 'POST',
                                    url: '/api/WeiXin/WeiXinGroup/PostSyncGroup', 
                                    success: function (d) {
                                        snf.messageif(d.msgtype != '', d.msgtype, d.msg);
                                        if (d.ok) {
                                            self.searchClick();
                                        } 
                                    }
                                });
                            }
                        });
                    };

    上面调用的url是MVC的控制器方法,具体函数代码如下所示。

    public dynamic PostSyncGroup()
            {
                string accessToken = BasicAPI.GetWeiXinAccessToken(this.UserInfo);
                CommonResult result = SNFService.Instance.CreateService<WeiXinGroupService, IWeiXinGroupService>().SyncGroup(this.UserInfo, BasicAPI.GetWeiXinNoCode(UserInfo),accessToken);
    
                if (BaseSystemInfo.ShowInformation)
                {
                    if (result.Success)
                    {
                        //成功提示 
                        return ShowWarning("同步成功");
                    }
                    else
                    {
                        return ShowErrorWarning(result.Errcode + ":" + result.ErrorMessage);
                    }
    
                }
                return "";
            }

    从上面,我们没有看到太多的逻辑,为了方便我对他们进行了进一步的封装,把它放到了业务逻辑层进行处理了。具体我们看看它的代码逻辑吧,这里为了所有的数据库操作更加快捷和完整,使用了事务的操作,我把相关的代码贴出来,方便大家了解逻辑。

      1 public CommonResult SyncGroup(BaseUserInfo userInfo,string weixinNo, string accessToken) {
      2             CommonResult result = new CommonResult();   8             
      9             IGroupApi api = new GroupApi();
     10 
     11             //写入调试信息
     12             #if (DEBUG)
     13                int milliStart = BusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod());
     14             #endif
     15 
     16             // 加強安全验证防止未登录用户调用
     17             #if (!DEBUG)
     18                  LogOnService.UserIsLogOn(userInfo);
     19             #endif
     20              
     21             using (IDbHelper ucDbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType))
     22             {
     23                 try
     24                 {
     25                     
     26                     ucDbHelper.Open(UserCenterDbConnection);
     27                     BaseLogManager.Instance.Add(userInfo, this.serviceName, "微信分组同步", MethodBase.GetCurrentMethod());
     28 
     29                     using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BusinessDbType))
     30                     {
     31                         try
     32                         {
     33                             dbHelper.Open(BusinessDbConnection);
     34                             // 开始事务
     35                             dbHelper.BeginTransaction();
     36                             
     37                             WeiXinGroupManager manager = new WeiXinGroupManager(dbHelper, userInfo);
     38 
     39                             #region 先从微信服务器上获取分组,如果不存在进行下载保存
     40                             List<GroupJson> list = api.GetGroupList(accessToken);
     41                             foreach (GroupJson info in list)
     42                             {
     43                                 if (!manager.Exists(new KeyValuePair<string, object>(WeiXinGroupEntity.FieldWeiXinNo, weixinNo), new KeyValuePair<string, object>(WeiXinGroupEntity.FieldGroupId, info.id))) {
     44                                     WeiXinGroupEntity entity = new WeiXinGroupEntity();
     45                                     entity.GroupId = info.id;
     46                                     entity.GroupName = info.name;
     47                                     entity.WeiXinNo = weixinNo;
     48                                     manager.AddObject(entity);
     49                                 }
     50                             }
     51                             #endregion
     52 
     53                             //先把本地标志groupId = -1未上传的记录上传到服务器,然后进行本地更新GroupID = '-1' 
     54                             List<WeiXinGroupEntity> unSubmitList = manager.GetList<WeiXinGroupEntity>(new KeyValuePair<string, object>(WeiXinGroupEntity.FieldWeiXinNo, weixinNo), new KeyValuePair<string, object>(WeiXinGroupEntity.FieldGroupId, -1));
     55                             foreach (WeiXinGroupEntity info in unSubmitList)
     56                             {
     57                                 GroupJson groupJson = api.CreateGroup(accessToken, info.GroupName);
     58                                 if (groupJson != null && groupJson.group != null)
     59                                 {
     60                                     info.GroupId = groupJson.group.id;
     61                                     manager.Update(info);
     62                                 }
     63                             }
     64                             //删除具有删除标志的分组 GroupId >=100 and Deleted=1 
     65                             List<WeiXinGroupEntity> unDeletedList = manager.GetList<WeiXinGroupEntity>(new KeyValuePair<string, object>(WeiXinGroupEntity.FieldWeiXinNo, weixinNo), new KeyValuePair<string, object>(WeiXinGroupEntity.FieldDeletionStateCode, 1));
     66                             foreach (WeiXinGroupEntity info in unDeletedList)
     67                             {
     68                                 if (info.GroupId >= 100)
     69                                 {
     70                                     if (info.GroupId == null)
     71                                     {
     72                                         continue;
     73                                     }
     74                                     CommonResult deleted = api.DeleteGroup(accessToken, BusinessLogic.ConvertToInt(info.GroupId));
     75                                     if (deleted != null && (deleted.Success || "40050".Equals(deleted.Errcode)))
     76                                     {
     77                                         manager.Delete(info.Id);
     78                                     }
     79                                 }
     80 
     81                             }
     82 
     83                             //把标志为修改状态的记录,在服务器上修改 GroupId >=0 and IsEdit =1  
     84                             List<WeiXinGroupEntity> unModifyList = manager.GetList<WeiXinGroupEntity>(new KeyValuePair<string, object>(WeiXinGroupEntity.FieldWeiXinNo, weixinNo), new KeyValuePair<string, object>(WeiXinGroupEntity.FieldIsEdit, 1));
     85                             foreach (WeiXinGroupEntity info in unModifyList)
     86                             {
     87                                 if (info.GroupId == null)
     88                                 {
     89                                      continue;
     90                                 }
     91                                 CommonResult modifyed = api.UpdateGroupName(accessToken,BusinessLogic.ConvertToInt(info.GroupId) , info.GroupName);
     92                                 if (modifyed != null && modifyed.Success)
     93                                 {
     94                                     info.IsEdit = 0;//重置标志
     95                                     manager.Update(info);
     96                                 }
     97                             }
     98 
     99                             
    100 
    101                             dbHelper.CommitTransaction();
    102                             result.Success = true;
    103                            
    104                         }
    105                         catch (Exception ex)
    106                         {
    107                             dbHelper.RollbackTransaction();
    108                             result.ErrorMessage = ex.Message;
    109                             BaseExceptionManager.LogException(ucDbHelper, userInfo, ex);
    110                             throw;
    111                         }
    112                         finally
    113                         {
    114                             dbHelper.Close();
    115                         }
    116                     }
    117                 }
    118                 catch (Exception ex)
    119                 {
    120                     result.ErrorMessage = ex.Message;
    121                     BaseExceptionManager.LogException(ucDbHelper, userInfo, ex);
    122                     throw;
    123                 }
    124                 finally
    125                 {
    126                     ucDbHelper.Close();
    127                 }
    128             }
    129 
    130             // 写入调试信息
    131             #if (DEBUG)
    132                BusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart);
    133             #endif
    134 
    135             return result;
    136
    139         
    140         }

    如果感兴趣或者体验相关的微信功能,可以关注我的微信了解下。具体效果关注测试账号扫描下面二维码进行关注了解。

    作者: 王春天 2016-01-13
    作者Blog:http://www.cnblogs.com/spring_wang 出处: http://www.cnblogs.com/spring_wang/p/5074847.html

      如果觉得还不错,欢迎转载。

  • 相关阅读:
    jquery笔记
    css选择器
    Linq 巧用 Max,Sum
    Linq Aggregate
    Linq 对象的比较 Contains,Max
    Linq SelectMany 交叉连接
    JQ 标签相关知识
    C# HttpClient设置cookies的两种办法 (转发)
    使用 HttpClient 请求 Web Api
    MySQL 避免重复数据的批量插入与批量更新
  • 原文地址:https://www.cnblogs.com/spring_wang/p/5074847.html
Copyright © 2020-2023  润新知