关于我们

饿了么开放平台API调用协议签名算法

发布时间:2025-05-27

 

个人零费用代理店+,日收入3000+,可兼职做

为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名参数,API服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。

签名算法的具体步骤如下:

以调用获取订单接口为例,做以下假设:

应用的key是:wYO4C8ZLzB

应用的secret是:8e81ef8b73593d6b24e0cd9f11cbe3132d11ab8e

授权后得到的access_token是:ed72bdaef7b635ecf9279147d76d6a55

接口名是:eleme.order.getOrder

订单号为:100027526535707064

1 . 首先构造一个完整的API请求对象。

{ "token": "ed72bdaef7b635ecf9279147d76d6a55", "nop": "1.0.0", "metas": { "app_key": "wYO4C8ZLzB", "timestamp": 1486217703 }, "params": { "orderId": "100027526535707064" }, "action": "eleme.order.getOrder", "id": "59802291567A41A584EE6947DEA777F0|1631082049766", "signature": "" }

2 . 提取出上一步得到的请求对象中的metas和params参数值,构造出一个新的参数对象

{ "orderId": "100027526535707064", "app_key": "wYO4C8ZLzB", "timestamp": 1486217703 }

3 . 建立一个空数组,然后遍历参数对象中的键值对,使用"key=json_encode(value)"方式进行字符串拼接,将得到的字符串挨个添加到数组中

[ 'orderId="100027526535707064"', 'app_key="wYO4C8ZLzB"', 'timestamp=1486217703' ]

4 . 对数组进行排序,使用首字母的字母序进行排序,得到排序后的数组

[ 'app_key="wYO4C8ZLzB"', 'orderId="100027526535707064"', 'timestamp=1486217703' ]

5 . 按照 action + token + 上一步得到的数组用空字符串连接 + secret 的规则拼接签名原串

eleme.order.getOrdered72bdaef7b635ecf9279147d76d6a55app_key="wYO4C8ZLzB"orderId="100027526535707064"timestamp=14862177038e81ef8b73593d6b24e0cd9f11cbe3132d11ab8e

6 . 将上一步得到的字符串进行MD5编码

b450d7598455d163488a2abeb1e0e0c5

注:计算md5时,需要以utf-8的编码转换byte流,否则可能导致含中文参数的签名计算不正确

7 . 将MD5编码后得到的字符串转换为大写字符串,这个字符串就是API签名计算的结果

B450D7598455D163488A2ABEB1E0E0C5

8 . 将签名计算的结果赋值给请求对象的signature属性,此时就完成了API调用所需要的signature参数的计算

{ "token": "ed72bdaef7b635ecf9279147d76d6a55", "nop": "1.0.0", "metas": { "app_key": "wYO4C8ZLzB", "timestamp": 1486217703 }, "params": { "orderId": "100027526535707064" }, "action": "eleme.order.getOrder", "id": "59802291567A41A584EE6947DEA777F0|1631082049766", "signature": "B450D7598455D163488A2ABEB1E0E0C5" }

/template/Home/AllNew/PC/Static