From 3b109d15bb606e9c066029d72b51f73371c5c107 Mon Sep 17 00:00:00 2001 From: Maxine <43437731+xxiangaa@users.noreply.github.com> Date: Tue, 27 Jul 2021 10:11:07 +0800 Subject: [PATCH 1/2] Update README.md --- README.md | 363 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 363 insertions(+) diff --git a/README.md b/README.md index cf90d2f..c6a11b7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,365 @@ # etd-device-admin-api-spec API Documentation + +# ETD设备平台接口文档 v0.0.1 + +## 1 规范说明 + +### 1.1 通信协议 + +HTTPS协议 + +### 1.2 请求方法 +所有接口只支持POST方法发起请求。 + +### 1.3 字符编码 +HTTP通讯及报文BASE64编码均采用UTF-8字符集编码格式。 + +### 1.4 格式说明 +元素出现要求说明: + +符号 |说明 +:----: |:--- +R |报文中该元素必须出现(Required) +O |报文中该元素可选出现(Optional) +C |报文中该元素在一定条件下出现(Conditional) + +### 1.5 报文规范说明 + +1. 报文规范仅针对交易请求数据进行描述; + +2. 报文规范中请求报文的内容为Https请求报文中RequestData值的明文内容; + +3. 报文规范分为请求报文和响应报文。请求报文描述由发起方,响应报文由报文接收方响应。 + +### 1.6 请求报文结构 +接口只接收两个参数 **RequestData** 和 **SignData** ,其中RequestData的值为请求内容,SignData的值为签名内容。 + +#### 1.6.1 参数说明 +**RequestData(请求内容):** 其明文为每次请求的具体参数,采用 JSON 格式,依次经过 DES 加密(以UTF-8编码、BASE64编码输出结果)和 URLEncode 后,作为 RequestData 的值。 + +**SignData(签名内容):** 请求参数(明文)的MD5加密字符串,用于校验RequestData是否合法。 + +#### 1.6.2 请求内容(RequestData)明文结构说明 + +采用JSON格式,其中包含Header(公有参数)、Body(私有参数)节点: + +名称 |描述 |备注 +:-- |:-- |:-- +公共参数 |每个接口都包含的通用参数,以JSON格式存放在Header属性 |详见以下公共参数说明 +私有参数 |每个接口特有的参数,以JSON格式存放在Body属性 |详见每个接口定义 + +**公共参数说明:** + +公共参数(Header)是用于标识产品及接口鉴权的参数,每次请求均需要携带这些参数: + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Token |string |R |用户登录后token,没有登录则为空字符串 +Version |string |R |接口版本号 +SystemId |int |R |机构号,请求的系统Id +Timestamp |long |R |当前UNIX时间戳 + + +#### 1.6.3 校验流程: +服务端接收到请求后首先对RequestData进行DES解密出JSON字符串,然后对JSON字符串进行MD5加密,加密后的值与请求中的SignData值进行对比,如对比通过,视为合法请求,否则视为非法请求。 + +**DES加密/解密函数示例:** + +C#版: + +``` +/// +/// 进行DES加密。 +/// +/// 要加密的字符串。 +/// 密钥,且必须为8位。 +/// 以Base64格式返回的加密字符串。 +public static string DesEncrypt(string decryptString, string secretKey) +{ + using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) + { + byte[] inputByteArray = Encoding.UTF8.GetBytes(decryptString); + des.Key = Encoding.ASCII.GetBytes(secretKey); + des.IV = Encoding.ASCII.GetBytes(secretKey); + MemoryStream ms = new MemoryStream(); + using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) + { + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + cs.Close(); + } + string str = Convert.ToBase64String(ms.ToArray()); + ms.Close(); + return str; + } +} + +/// +/// 进行DES解密。 +/// +/// 要解密的以Base64 +/// 密钥,且必须为8位。 +/// 已解密的字符串。 +public static string DesDecrypt(string encryptedString, string secretKey) +{ + byte[] inputByteArray = Convert.FromBase64String(encryptedString); + using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) + { + des.Key = Encoding.ASCII.GetBytes(secretKey); + des.IV = Encoding.ASCII.GetBytes(secretKey); + MemoryStream ms = new MemoryStream(); + using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) + { + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + cs.Close(); + } + string str = Encoding.UTF8.GetString(ms.ToArray()); + ms.Close(); + return str; + } +} +``` + +JAVA版: + +``` +/* DES解密 */ +public static String decrypt(String message, String key) throws Exception { + + byte[] bytesrc = Base64.decode(message); + //convertHexString(message); + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); + cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); + byte[] retByte = cipher.doFinal(bytesrc); + return new String(retByte); +} + + +/* DES加密 */ +public static byte[] encrypt(String message, String key) throws Exception { + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); + return cipher.doFinal(message.getBytes("UTF-8")); +} +``` + +#### 1.6.4 DES密钥 + +测试环境:az2ih1uY + +生产环境:另外提供。 + +#### 1.6.5 请求报文示例 +请求内容明文: + +``` +{ + "Header":{ + "Token":"2366CF921FAD44CCBB07FF9CD02FC90E", + "Version":"3.2.0", + "SystemId":100, + "Timestamp":1502870664 + }, + "Body":{ + "Mobile":"18520322032", + "Password":"acb000000" + } +} + +``` + +请求报文示例: + +``` +url?RequestData=UFAYIRF21XzGoaAaEU54qoDBYaFkT2KbRpWxKZuqqltApdIneF7AjlEArPLsg3%2Fo1Pu7FHFmsKZn%0A9KJb%2BGuwx0P%2F3jzv2TgwUpVtgwEdfd0vIRfqEF4jCouldaxxVBjbHvd%2F08pUoYJDNZJLvNrJ%2BsK4%0A79de92T0Cyu4hKNMUPtVI7Tp0IC%2BBw%3D%3D&SignData=0865c7d625f90d3bb5457f5d9ac3725d +``` + +### 1.7 响应报文结构 +#### 1.7.1 结构说明 +所有接口响应均采用JSON格式,如无特殊说明,每次请求的返回值中,都包含下列字段: + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Code |int |R |响应码,代码定义请见“附录A 响应吗说明” +Msg |string |R |响应描述 +Data |object |R |每个接口特有的参数,详见每个接口定义 + + +#### 1.7.2 响应报文示例 + +``` +{ + "Code":200, + "Msg":"调用成功", + "Data":{ + "Channel":"A10086", + "Type":7004 + } +} +``` + + +## 2. 接口定义 + +### 2.1 密码登录 +- **接口说明:** 密码登录 +- **接口地址:** /account/signin + +#### 2.1.1 请求参数 + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Header |  |R |请求报文头 + Token |string |R |用户登录后token,没有登录则为空字符串 + Version |string |R |接口版本号 + SystemId |int |R |机构号,请求的系统Id + Timestamp |long |R |当前UNIX时间戳 +Body |  |R |  + Mobile |string |R |手机号 + Password |string |R |密码 + + +请求示例: + +``` +{ + "Header":{ + "Token":"", + "Version":"3.2.0", + "SystemId":100, + "Timestamp":1502870664 + }, + "Body":{ + "Mobile":"18520322032", + "Password":"acb000000" + } +} + +``` + + +#### 2.1.2 返回结果 + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Code |int |R |响应码,代码定义请见“附录A 响应吗说明” +Msg |string |R |  +Data |object |R |  + UserId |string |R |用户Id + +示例: + +``` +{ + "Code":200, + "Msg":"登录成功", + "Data":{ + "UserId":"7D916C7283434955A235C17DD9B71C64" + } +} +``` + + + +### 2.2 获取登录用户信息 +- **接口说明:** 获取登录用户信息 +- **接口地址:** /account/profile + +#### 2.2.1 请求参数 + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Header |  |R |请求报文头 + Token |string |R |用户登录后token,没有登录则为空字符串 + Version |string |R |接口版本号 + SystemId |int |R |机构号,请求的系统Id + Timestamp |long |R |当前UNIX时间戳 +Body |  |R |  + + + +请求示例: + +``` + +{ + "Header":{ + "Token":"CA64A439E7C344B0BA7F5C825E17C7AB", + "Version":"3.2.0", + "SystemId":100, + "Timestamp":1502870664 + }, + "Body":null +} + +``` + + +#### 2.2.2 返回结果 + +参数名称 |类型 |出现要求 |描述 +:---- |:--- |:------ |:--- +Code |int |R |响应码,代码定义请见“附录A 响应吗说明” +Msg |string |R |  +Data |object |R |  + UserId |string |R |用户Id + RealName |string |R |姓名 + ImageUrl |string |R |头像 + Score |int |R |积分 + Nickname |string |R |昵称 + Sex |int |R |性别:0-未知、1-男、2-女 + Title |string |R |头衔 + + +示例: + +``` +{ + "Code":200, + "Msg":"处理成功", + "Data":{ + "UserId":"7D916C7283434955A235C17DD9B71C64", + "RealName":"张三", + "ImageUrl":"https://img.xx.net/afdicew8751.png", + "Score":4732, + "Nickname":"张冠李戴", + "Sex":1, + "Title":"侠客Lv4" + } +} +``` + + +## 3 附录A 响应码说明 + +响应码 |说明 +:---- |:--- +200 |处理成功 +301 |解析报文错误 +302 |无效调用凭证 +303 |参数不正确 +500 |系统内部错误 +999 |处理失败 + + +## 4 附录B 币种 + +币种 |说明 +:---- |:--- +RMB |人民币 +HKD |港币 +JPY |日元 +TWD |新台币 +USD |美元 +VND |越南盾 +THB |泰铢 From cf4f8072bf6b6d8706196aa54d9d6fd66b5cfbba Mon Sep 17 00:00:00 2001 From: Maxine <43437731+xxiangaa@users.noreply.github.com> Date: Tue, 27 Jul 2021 10:14:29 +0800 Subject: [PATCH 2/2] Delete README.md --- README.md | 365 ------------------------------------------------------ 1 file changed, 365 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index c6a11b7..0000000 --- a/README.md +++ /dev/null @@ -1,365 +0,0 @@ -# etd-device-admin-api-spec -API Documentation - -# ETD设备平台接口文档 v0.0.1 - -## 1 规范说明 - -### 1.1 通信协议 - -HTTPS协议 - -### 1.2 请求方法 -所有接口只支持POST方法发起请求。 - -### 1.3 字符编码 -HTTP通讯及报文BASE64编码均采用UTF-8字符集编码格式。 - -### 1.4 格式说明 -元素出现要求说明: - -符号 |说明 -:----: |:--- -R |报文中该元素必须出现(Required) -O |报文中该元素可选出现(Optional) -C |报文中该元素在一定条件下出现(Conditional) - -### 1.5 报文规范说明 - -1. 报文规范仅针对交易请求数据进行描述; - -2. 报文规范中请求报文的内容为Https请求报文中RequestData值的明文内容; - -3. 报文规范分为请求报文和响应报文。请求报文描述由发起方,响应报文由报文接收方响应。 - -### 1.6 请求报文结构 -接口只接收两个参数 **RequestData** 和 **SignData** ,其中RequestData的值为请求内容,SignData的值为签名内容。 - -#### 1.6.1 参数说明 -**RequestData(请求内容):** 其明文为每次请求的具体参数,采用 JSON 格式,依次经过 DES 加密(以UTF-8编码、BASE64编码输出结果)和 URLEncode 后,作为 RequestData 的值。 - -**SignData(签名内容):** 请求参数(明文)的MD5加密字符串,用于校验RequestData是否合法。 - -#### 1.6.2 请求内容(RequestData)明文结构说明 - -采用JSON格式,其中包含Header(公有参数)、Body(私有参数)节点: - -名称 |描述 |备注 -:-- |:-- |:-- -公共参数 |每个接口都包含的通用参数,以JSON格式存放在Header属性 |详见以下公共参数说明 -私有参数 |每个接口特有的参数,以JSON格式存放在Body属性 |详见每个接口定义 - -**公共参数说明:** - -公共参数(Header)是用于标识产品及接口鉴权的参数,每次请求均需要携带这些参数: - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Token |string |R |用户登录后token,没有登录则为空字符串 -Version |string |R |接口版本号 -SystemId |int |R |机构号,请求的系统Id -Timestamp |long |R |当前UNIX时间戳 - - -#### 1.6.3 校验流程: -服务端接收到请求后首先对RequestData进行DES解密出JSON字符串,然后对JSON字符串进行MD5加密,加密后的值与请求中的SignData值进行对比,如对比通过,视为合法请求,否则视为非法请求。 - -**DES加密/解密函数示例:** - -C#版: - -``` -/// -/// 进行DES加密。 -/// -/// 要加密的字符串。 -/// 密钥,且必须为8位。 -/// 以Base64格式返回的加密字符串。 -public static string DesEncrypt(string decryptString, string secretKey) -{ - using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) - { - byte[] inputByteArray = Encoding.UTF8.GetBytes(decryptString); - des.Key = Encoding.ASCII.GetBytes(secretKey); - des.IV = Encoding.ASCII.GetBytes(secretKey); - MemoryStream ms = new MemoryStream(); - using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) - { - cs.Write(inputByteArray, 0, inputByteArray.Length); - cs.FlushFinalBlock(); - cs.Close(); - } - string str = Convert.ToBase64String(ms.ToArray()); - ms.Close(); - return str; - } -} - -/// -/// 进行DES解密。 -/// -/// 要解密的以Base64 -/// 密钥,且必须为8位。 -/// 已解密的字符串。 -public static string DesDecrypt(string encryptedString, string secretKey) -{ - byte[] inputByteArray = Convert.FromBase64String(encryptedString); - using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) - { - des.Key = Encoding.ASCII.GetBytes(secretKey); - des.IV = Encoding.ASCII.GetBytes(secretKey); - MemoryStream ms = new MemoryStream(); - using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) - { - cs.Write(inputByteArray, 0, inputByteArray.Length); - cs.FlushFinalBlock(); - cs.Close(); - } - string str = Encoding.UTF8.GetString(ms.ToArray()); - ms.Close(); - return str; - } -} -``` - -JAVA版: - -``` -/* DES解密 */ -public static String decrypt(String message, String key) throws Exception { - - byte[] bytesrc = Base64.decode(message); - //convertHexString(message); - Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); - DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - SecretKey secretKey = keyFactory.generateSecret(desKeySpec); - IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); - cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); - byte[] retByte = cipher.doFinal(bytesrc); - return new String(retByte); -} - - -/* DES加密 */ -public static byte[] encrypt(String message, String key) throws Exception { - Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); - DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - SecretKey secretKey = keyFactory.generateSecret(desKeySpec); - IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); - cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); - return cipher.doFinal(message.getBytes("UTF-8")); -} -``` - -#### 1.6.4 DES密钥 - -测试环境:az2ih1uY - -生产环境:另外提供。 - -#### 1.6.5 请求报文示例 -请求内容明文: - -``` -{ - "Header":{ - "Token":"2366CF921FAD44CCBB07FF9CD02FC90E", - "Version":"3.2.0", - "SystemId":100, - "Timestamp":1502870664 - }, - "Body":{ - "Mobile":"18520322032", - "Password":"acb000000" - } -} - -``` - -请求报文示例: - -``` -url?RequestData=UFAYIRF21XzGoaAaEU54qoDBYaFkT2KbRpWxKZuqqltApdIneF7AjlEArPLsg3%2Fo1Pu7FHFmsKZn%0A9KJb%2BGuwx0P%2F3jzv2TgwUpVtgwEdfd0vIRfqEF4jCouldaxxVBjbHvd%2F08pUoYJDNZJLvNrJ%2BsK4%0A79de92T0Cyu4hKNMUPtVI7Tp0IC%2BBw%3D%3D&SignData=0865c7d625f90d3bb5457f5d9ac3725d -``` - -### 1.7 响应报文结构 -#### 1.7.1 结构说明 -所有接口响应均采用JSON格式,如无特殊说明,每次请求的返回值中,都包含下列字段: - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Code |int |R |响应码,代码定义请见“附录A 响应吗说明” -Msg |string |R |响应描述 -Data |object |R |每个接口特有的参数,详见每个接口定义 - - -#### 1.7.2 响应报文示例 - -``` -{ - "Code":200, - "Msg":"调用成功", - "Data":{ - "Channel":"A10086", - "Type":7004 - } -} -``` - - -## 2. 接口定义 - -### 2.1 密码登录 -- **接口说明:** 密码登录 -- **接口地址:** /account/signin - -#### 2.1.1 请求参数 - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Header |  |R |请求报文头 - Token |string |R |用户登录后token,没有登录则为空字符串 - Version |string |R |接口版本号 - SystemId |int |R |机构号,请求的系统Id - Timestamp |long |R |当前UNIX时间戳 -Body |  |R |  - Mobile |string |R |手机号 - Password |string |R |密码 - - -请求示例: - -``` -{ - "Header":{ - "Token":"", - "Version":"3.2.0", - "SystemId":100, - "Timestamp":1502870664 - }, - "Body":{ - "Mobile":"18520322032", - "Password":"acb000000" - } -} - -``` - - -#### 2.1.2 返回结果 - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Code |int |R |响应码,代码定义请见“附录A 响应吗说明” -Msg |string |R |  -Data |object |R |  - UserId |string |R |用户Id - -示例: - -``` -{ - "Code":200, - "Msg":"登录成功", - "Data":{ - "UserId":"7D916C7283434955A235C17DD9B71C64" - } -} -``` - - - -### 2.2 获取登录用户信息 -- **接口说明:** 获取登录用户信息 -- **接口地址:** /account/profile - -#### 2.2.1 请求参数 - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Header |  |R |请求报文头 - Token |string |R |用户登录后token,没有登录则为空字符串 - Version |string |R |接口版本号 - SystemId |int |R |机构号,请求的系统Id - Timestamp |long |R |当前UNIX时间戳 -Body |  |R |  - - - -请求示例: - -``` - -{ - "Header":{ - "Token":"CA64A439E7C344B0BA7F5C825E17C7AB", - "Version":"3.2.0", - "SystemId":100, - "Timestamp":1502870664 - }, - "Body":null -} - -``` - - -#### 2.2.2 返回结果 - -参数名称 |类型 |出现要求 |描述 -:---- |:--- |:------ |:--- -Code |int |R |响应码,代码定义请见“附录A 响应吗说明” -Msg |string |R |  -Data |object |R |  - UserId |string |R |用户Id - RealName |string |R |姓名 - ImageUrl |string |R |头像 - Score |int |R |积分 - Nickname |string |R |昵称 - Sex |int |R |性别:0-未知、1-男、2-女 - Title |string |R |头衔 - - -示例: - -``` -{ - "Code":200, - "Msg":"处理成功", - "Data":{ - "UserId":"7D916C7283434955A235C17DD9B71C64", - "RealName":"张三", - "ImageUrl":"https://img.xx.net/afdicew8751.png", - "Score":4732, - "Nickname":"张冠李戴", - "Sex":1, - "Title":"侠客Lv4" - } -} -``` - - -## 3 附录A 响应码说明 - -响应码 |说明 -:---- |:--- -200 |处理成功 -301 |解析报文错误 -302 |无效调用凭证 -303 |参数不正确 -500 |系统内部错误 -999 |处理失败 - - -## 4 附录B 币种 - -币种 |说明 -:---- |:--- -RMB |人民币 -HKD |港币 -JPY |日元 -TWD |新台币 -USD |美元 -VND |越南盾 -THB |泰铢