zoukankan      html  css  js  c++  java
  • 开放平台设计

    开放平台设计

    1.前言

            分享一个的我最近完成的开放平台设计

    2.简介

    开放平台(以下简API) 是为供应商和分销商(以下简称开发人员)开放的API 接口,开发人员可以通过调用搜物API接口,快速的实现和搜物网的数据交换。搜物API支持Json 格式和XML数据格式进行数据交换,搜物API 根据你传入的数据格式返回对应的数据,如你传入的是是XML搜物API将返回Xml 格式数据如是Json 则返回Json格式数据

     

    3.总体架构

     

    如上图所示,这里采用了分层来的思想开发本系统

    l  HelperLogic  助手类

    l  CahceLogic   缓存部分静态数据,

    l   DataLogic   数据库业务层

    l  OrderLogic  订单逻辑层

    l  ProductLogic 产品逻辑层

    l  purviewLogic  鉴权逻辑层

    l  LogisticsLogic  物流模板逻辑层

    4.业务逻辑处理

     

    5.签名算法

       

    1. 把请求中的参数 除了Signature 外 按照参数名称进行正向排序
    2. 把所有参数名和参数值串在一起(不能有空格)
    3. 把后台设置的key值串接到“第二步”得到的字符串尾部(不能有空格)
    4. 采用MD5算法对“第三步”得到的字符串进行加密,生成Signature的值
    复制代码
             /// <summary>
             /// 获取签名字符串
            /// </summary>
            /// <param name="parameters">所有字符型的请求参数</param>
            /// <param name="secret">签名密钥(即搜物APIKey)</param>
            /// <returns>签名</returns>
            public static string GetSignatureStr(IDictionary<string, string> parameters, string secret)
              {
                parameters.Remove("Signature");
                // 第一步:把字典按Key的字母顺序排序
                IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
                IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
    
                // 第二步:把所有参数名和参数值串在一起
                StringBuilder query = new StringBuilder();
                while (dem.MoveNext())
                {
                    string key = dem.Current.Key;
                    string value = dem.Current.Value;
                    if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
                    {
                        query.Append(key + "=" + value + "&");
                    }
                }
                query.Append("key=" + secret);
    
                // 第三步:使用MD5加密
                MD5 md5 = MD5.Create();
                byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
                // 第四步:把二进制转化为大写的十六进制
                StringBuilder result = new StringBuilder();
                for (int i = 0; i < bytes.Length; i++)
                {
                    string hex = bytes[i].ToString("X");
                    if (hex.Length == 1)
                    {
                        result.Append("0");
                    }
                    result.Append(hex);
                }
                return result.ToString();
            }
    复制代码

    6.安全性考虑

          1.权限接口控制

             

       2.异常访问

          1.在30分钟内,10次签名出错,认为账号异常

          2.访问过于频繁

          3.手动添加黑名单

      3.用户可追溯性

          我们主要实现2点功能 1. 记录用户的访问操作,比如访问那些接口,上传了那些数据, 2.对于重要的数据的可追溯性,如商品价格,库存等 3. 记录每个请求耗时多久  为了实现以上3点功能,我们在这里引入log4net 做为日志系统,减少开发工作量

    7.POST 数据和返回数据格式参考

       

    复制代码
      [XmlRoot(ElementName = "DataPost")]
        public class DataPostCommon
        { /// <summary>
            /// 方法名
            /// </summary>
            [XmlElement(ElementName = "MethodsName")]
            public string MethodsName { get; set; }
            /// <summary>
            /// ApiGuid
            /// </summary>
             [XmlElement(ElementName = "ApiGuid")]
            public string ApiGuid { get; set; }
            /// <summary>
            /// 数据签名
            /// </summary>
           [XmlElement(ElementName = "Signature")]
            public string Signature { get; set; }
    
        }
    
        [XmlRoot(ElementName = "DataPost")]
        /// <summary>
        /// 用户Post 数据格式
        /// </summary>
        public class DataPost<T> : DataPostCommon
        {
           [XmlElement(ElementName = "Parameters")]
    
            public T Parameters { get; set; }
        }
    复制代码
    复制代码
       /// <summary>
        /// 服务返回
        /// </summary>
        [XmlRoot(ElementName = "SeverReturn")]
        public class SeverReturn<T>
        {
            public SeverReturn()
            {
                ErrNo = ErrorNo.IsSuccess;
            }
            /// <summary>
            /// 错误代码
            /// </summary>
            [XmlElement(ElementName = "ErrNo")]
            public int ErrNo { get; set; }
            /// <summary>
            /// 错误描述
            /// </summary>
            [XmlElement(ElementName = "ErrorDesc")]
            public string ErrorDesc { get; set; }
    
            [XmlElement(ElementName = "RunResults")]
            public T RunResults { get; set; }
        }
    }
    复制代码
     
    分类: .Net
  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4145301.html
Copyright © 2011-2022 走看看