饿了么开放平台服务商应用/平台工具授权流程
A、客户端拼接授权需要访问的URL,示例及参数说明如下:
示例:
https://open-api-sandbox.shop.ele.me/authorize?response_type=code&client_id=9OKWbmUrKr&redirect_uri=[redirect_uri
参数说明:
参数名参数类型是否必选参数值参数释义
client_idString必选9OKWbmUrKr应用的key,创建应用时获得
response_typeString必选code授权类型,固定为code,表示授权码模式
redirect_uriString必选应用的授权回调地址redirect_uri指的是应用发起请求时,所传的回调地址参数,在用户授权后页面会跳转至redirect_uri。要求与应用注册时填写的授权回调地址一致或域名一致,并且必须支持https访问。需要进行Url Encode编码
scopeString必选all商户授权的权限范围,固定为all,表示所有权限
stateString必选String开发者自定义的应用状态,可以指定任意值,认证服务器会原样返回这个值,开发者需要确认当前授权的传入值与返回值是一致的,确保不会产生csrf漏洞。
B、引导商户到授权页,商户可以选择点击【同意授权】或者【取消授权】
C、获取授权码
如果商户点击【同意授权】,开放平台认证服务器会回应客户端的授权回调URI(redirection URI)返回以下参数:
参数名 | 参数类型 | 是否必选 | 参数值 | 参数释义 |
---|---|---|---|---|
code | String | 必选 | 示例值:SplxlOBeZQQYbYS6WxSbIA | 授权认证成功后开放平台颁发的授权码,该码的有效期只有10分钟,只能使用一次,过期或多次使用会被授权服务器拒绝。 |
state | String | 必选 | 应用自定义的值,例如xyz | 如果客户端的请求中包含这个参数,认证服务器的回应会原样返回这个参数 |
响应示例如下:
HTTP/1.1 302 Found Location: [redirect_uri]?code=f5d9280fce5cedc761f1f19ef484e7e0&state=xyz
D、如果商户点击【取消授权】, 开放平台认证服务器会回应客户端授权回调URI,并且返回以下参数:
如果商户拒绝授权,则开放平台认证服务器会回应客户端的授权回调URI,并且返回以下参数:
HTTP/1.1 302 Found Location: [redirect_uri]?error=unauthorized_client&error_description=denied
参数说明:
参数名 | 参数类型 | 是否必选 | 参数值 | 参数释义 |
---|---|---|---|---|
error | String | 必选 | 示例值:unauthorized_client | 授权失败信息 |
error_description | String | 必选 | 示例值:invalid client_id | 授权失败的详细原因描述 |
E、使用授权码换取访问令牌,客户端向认证服务器发起访问令牌的请求。
示例及参数说明如下:
HTTP header中需要携带Authorization请求头,Basic值的算法如下(+号表示字符串连接):
base64_encode(key + ":" + secret)
请求示例:
POST /token HTTP/1.1 Host: open-api-sandbox.shop.ele.me Authorization: Basic OU9LV2JtVXJLcjoyZGRiZTc2NTkzOWZhZjI5ZDEwNTU3MDg3MzVjOGViNw== Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=f5d9280fce5cedc761f1f19ef484e7e0 &redirect_uri=[redirect_uri]&client_id=9OKWbmUrKr
CURL示例如下:
curl -i -XPOST -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic OU9LV2JtVXJLcjoyZGRiZTc2NTkzOWZhZjI5ZDEwNTU3MDg3MzVjOGViNw==" -d "grant_type=authorization_code&code=f5d9280fce5cedc761f1f19ef484e7e0&redirect_uri=[redirect_uri]&client_id=9OKWbmUrKr" https://open-api-sandbox.shop.ele.me/token
参数说明:
参数名 | 参数类型 | 参数含义 | 是否必选 | 参数值 |
---|---|---|---|---|
grant_type | String | 授权模式 | 必选 | 授权码模式固定为"authorization_code" |
code | String | 表示上一步获得的授权码 | 必选 | 示例值:SplxlOBeZQQYbYS6WxSbIA |
redirect_uri | String | 授权回调的重定向URI | 必选 | 必须与A步骤中的该参数值保持一致 |
client_id | String | 应用的key,创建应用时获得 | 必选 | 示例值:hvBW15GiSi |
F、认证成功,认证服务器返回Token
示例如下:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "trace_id": "fe.sopush_service^^5D77063E0EAC493A89780BBC3AEDB332|1703038197150", "token_type":"bear", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "scope":"all" }
参数说明:
字段名 | 类型 | 释义 |
---|---|---|
access_token | String | 访问令牌,API访问时需要的token参数。 |
trace_id | String | 用来唯一标记此次调用,排查问题时可提供此信息 |
token_type | String | 令牌的类型,固定值,开发者可忽略。 |
expires_in | Number | 令牌有效时间,单位秒,在令牌有效期内可以重复使用。有效期限制(access_token:沙箱环境为1天、正式环境为30天,refresh_token:沙箱环境为1天、正式环境为30天) |
refresh_token | String | 更新令牌,用来在令牌即将到期时延续访问令牌的有效期,获取一个新的访问令牌和更新令牌refresh_token。 |
scope | String | 表示权限范围,与客户端应用申请的范围一致,默认为"all"。 |
G、刷新Token
令牌即将到期,或者开发者出于安全性考虑想要更换访问令牌,可以使用refresh_token直接换取新的access_token
A示例如下:
POST /token HTTP/1.1 Host: open-api-sandbox.shop.ele.me Authorization: Basic OU9LV2JtVXJLcjoyZGRiZTc2NTkzOWZhZjI5ZDEwNTU3MDg3MzVjOGViNw== Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
CURL示例如下:
curl -i -XPOST -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic OU9LV2JtVXJLcjoyZGRiZTc2NTkzOWZhZjI5ZDEwNTU3MDg3MzVjOGViNw==" -d "grant_type=refresh_token&refresh_token=21a5b98083e13676c5fc3948df4f0852" https://open-api-sandbox.shop.ele.me/token
参数说明:
参数名 | 参数类型 | 参数含义 | 是否必选 | 参数值 |
---|---|---|---|---|
grant_type | String | 授权模式 | 必选 | 此处的值固定为"refresh_token" |
refresh_token | String | 上一步得到的更新令牌 | 必选项 | 示例值:tGzv3JOkF0XG5Qx2TlKWIA |
请求成功后,认证服务器的返回值同步骤 F 的返回值。 |