签名算法
为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,HOP服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。TOP目前支持的签名算法只有一种:MD5(sign_method=md5)签名大体过程如下:
• ● 对所有API请求参数(包括公共参数和业务参数,但除去sign参数和byte[]类型的参数),根据参数名称的ASCII码表的顺序排序。如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是bar=2, foo=1, foo_bar=3, foobar=4。
• ● 将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:bar2foo1foo_bar3foobar4。
• ● 把拼装好的字符串采用utf-8编码,使用签名算法对编码后的字节流进行摘要,如:md5(bar2foo1foo_bar3foobar4)。
• ● 将摘要得到的字节流结果使用十六进制表示,如:hex(“helloworld”.getBytes(“utf-8”)) = “68656C6C6F776F726C64”
说明:MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
C#签名示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public static string SignTopRequest(IDictionary<string, string> parameters,string signMethod, string appSecret)
{
// 第一步:把字典按Key的字母顺序排序
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
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).Append(value);
}
}
query.Append(appSecret); // 第三步:使用MD5加密
byte[] bytes;
MD5 md5 = MD5.Create();
bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); // 第四步:把二进制转化为大写的十六进制
StringBuilder result = new StringBuilder();
for ( int i = 0 ; i < bytes.Length; i++)
{
result.Append(bytes[i].ToString( "X2" ));
} return result.ToString();
}
调用示例
以Hishop.Open.Api.ITrade.GetSoldTrades调用为例,具体步骤如下:
1. 设置参数值
系统内置共钥:
• ●app_secreate = “123456789”,内置共钥,参数值和格式以对接系统提供为准
公共参数:
• ●app_key = “hishopyunshangcheng”
• ●timestamp = “2015-01-01 12:00:00”
• ●sign= 公共参数+业务参数+app_secreate
业务参数:
• ●start_created=“2016-02-15 11:50:20”
• ●end_created=“2016-02-15 23:50:20”
• ●status=“1”
• ●buyer_uname=“nainiu”
• ●page_no=“1”
• ●page_size=“40”
2. 按ASCII顺序排序
• ●app_key = “hishopyunshangcheng”
• ●buyer_uname=“nainiu”
• ●end_created=“2016-02-15 23:50:20”
• ●status=“1”
• ●start_created=“2016-02-15 11:50:20”
• ●timestamp=“2015-01-01 12:00:00”
• ●page_no=“1”
• ●page_size=“40”
3. 拼接参数名与参数值
app_keyhishopyunshangchengbuyer_unamenainiuend_created2016-02-15 23:50:20status1start_created2016-02-15 11:50:20timestamp2015-01-01 12:00:00page_no1page_size40123456789 4. 生成签名
假设最后拼接后的参数名和参数值为变量key="app_keyhishopyunshangchengbuyer_unamenainiuend_created2016-02-15 23:50:20status1start_created2016-02-15 11:50:20timestamp2015-01-01 12:00:00page_no1page_size40123456789",则签名后的sign值为:md5(key)=FBF8A81D8370223BF6D58622B3E8CBE4 5. 组装HTTP请求
将所有参数名和参数值采用utf-8进行URL编码(参数顺序可随意,但必须要包括签名参数),然后通过POST(含byte[]类型参数)发起请求,如:
1 http: //kdt.api.hishop.com/router/Hishop.Open.Api.ITrade.GetSoldTrades?app_key=hishopyunshangcheng&timestamp=2015-01-01+12%3A00%3A00&buyer_uname=nainiu&end_created=2016-02-15+23%3A50%3A20&status=1&start_created=2016-02-15+11%3A50%3A20&page_no=1&page_size=40&sign=C612BA1DAF21AF100906851F62684DDA
注意事项
• ●所有的请求和响应数据编码皆为utf-8格式,URL里的所有参数名和参数值请做URL编码。如果请求的Content-Type是application/x-www-form-urlencoded,则HTTP Body体里的所有参数值也做URL编码;如果是multipart/form-data格式,每个表单字段的参数值无需编码,但每个表单字段的charset部分需要指定为utf-8。
• ●所有API都用POST发起请求。
• ●生成签名(sign)仅对未使用HOP官方SDK进行API调用时需要操作,如使用了HOP官方SDK,该步骤SDK会自动完成。
FAQ
关于此文档暂时还没有FAQ

  

HiMall 3接口鉴权参考的更多相关文章

  1. EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解

    背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...

  2. laravel JWTAuth实现api接口鉴权(基础篇)

    官网:https://jwt-auth.readthedocs.io 参考:https://learnku.com/articles/10885/full-use-of-jwt#99529f 1.to ...

  3. 项目API接口鉴权流程总结

    权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要API使用签名方法(Sign)对接口进行鉴权.每一次请求都需要在请求中包含签名信息, ...

  4. 接口鉴权之sign签名校验与JWT验证

    需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概念,网页里有用户登录的概念,对于调用方来源是小程序的情况下进行放权,其他情况下需要有身份验证. ...

  5. 接口鉴权,提供给第三方调用的接口,进行sign签名

    //场景:公司要跟第三方公司合作,提供接口给对方对接,这样需要对接口进行授权,不然任何人都可以调我们公司的接口,会导致安全隐患: 思路: 在每个接口请求参数都带上ApiKey 和sign签名: 我们在 ...

  6. YAPI接口自动鉴权功能部署详解

    安装准备 以下操作,默认要求自己部署过yapi,最好是部署过yapi二次开发环境. 无论是选择在线安装或者是本地安装,都需要安装client工具. 1.yapi-cli:npm install yap ...

  7. SpringBoot 拦截器妙用,让你一个人开发整个系统的鉴权模块!

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Han ...

  8. python接口自动化22-签名(signature)鉴权(authentication)之加密(HEX、MD5、HMAC-SHA256)

    前言 开放的接口为了避免被别人乱调用,浪费服务器资源,这就涉及到签名(Signature)加密了 API 使用签名方法(Signature)对接口进行鉴权(Authentication).每一次请求都 ...

  9. Spring Security 接口认证鉴权入门实践指南

    目录 前言 SpringBoot 示例 SpringBoot pom.xml SpringBoot application.yml SpringBoot IndexController SpringB ...

随机推荐

  1. 阿里云-docker安装redis AND(docker基本操作命令)

    docker官网:https://hub.docker.com/search?q=redis&type=edition&offering=enterprise 1.拉取最新的redis ...

  2. CTF基本常识

    参照百度百科: https://baike.baidu.com/item/Pwn/5321286?fr=aladdin ”Pwn”是一个黑客语法的俚语词 [1]  ,是指攻破设备或者系统 [2]  . ...

  3. 第二章 Vue快速入门-- 17 v-for指令的四种使用方式

    1.v-for循环普通数组 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  4. MyEclipse导航代码第二弹,Java开发更便捷

    [MyEclipse CI 2019.4.0安装包下载] 无论是在文件之间导航还是在文件中导航,都可以使用大量导航工具来加快工作流程.目前这些导航工具可在MyEclipse,CodeMix中使用. 单 ...

  5. TiDB集群安装主要操作

    TiDB集群安装主要操作 参考资料:https://www.cnblogs.com/plyx/archive/2018/12/21/10158615.html 一.TiDB数据简介 TiDB 是 Pi ...

  6. C# 扩展、常用方法

    项目基本做完了,抽空整理下里面用到的扩展方法,以及复用度很高的代码,省的以后到处去找. 一.C#扩展方法——Distinct去重 二.C#扩展方法——获得枚举Description 三.C#扩展方法— ...

  7. nginx命令和配置

    centos 6.8安装的nginx 1.12.2 1.nginx常用的命令 使用nginx命令前,进入到/usr/local/nginx/sbin/目录 1)查看nginx版本 进入到/usr/lo ...

  8. jquery pageX属性 语法

    jquery pageX属性 语法 作用:pageX() 属性是鼠标指针的位置,相对于文档的左边缘. 语法:event.page 参数: 参数 描述 event     必需.规定要使用的事件.这个  ...

  9. 直接选择排序(Straight Selection Sort)

    1.定义 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 常用的选择排序方法有直接选择排序和堆 ...

  10. R & and &&

    https://blog.csdn.net/jining11/article/details/84933110 和C中的&不用,不要用&&,一般情况都是用&表示并且