正式环境对应蘑菇街线上数据,正式环境测试则直接用正式环境的入口网关、AppKey、AppSecret及蘑菇街账号。
正式环境http网关:
输入/输出字符集:
请求方式:
调用API:xiaodian.item.get(查询商品详情),使用系统默认MD5加密,因为各语言语法不一致,以下实例只体现逻辑。假设AppSecret为TESTAPPSECRET
1、输入参数为
method=xiaodian.item.get(公共参数)
access_token=TESTACCESSTOKEN(公共参数)
timestamp=1367819523(公共参数)
format=json(公共参数)
app_key=10011(公共参数)
version=1.0(公共参数)
sign_method=md5(公共参数)
itemId=95i27(API参数)
2、按首字母ASCII升序排列
access_token=TESTACCESSTOKEN
app_key=10011
format=json
itemId=95i27
method=xiaodian.item.get
sign_method=md5
timestamp=1367819523
version=1.0
3、组装加签字符串
将第2步排序好的参数进行参数名与参数值格式拼接,并在首尾加上AppSecret,如下:
TESTAPPSECRETaccess_tokenTESTACCESSTOKENapp_key10011formatjsonitemId95i27 methodxiaodian.item.getsign_methodmd5timestamp1367819523version1.0TESTAPPSECRET
注意:
加签的字符串中存在全角或中文字符时请用转成UTF-8字符集编码
4、生成sign(测试工具)
将第3步组装的字符串通过MD5编码获取到32位字符串再转大写后得到32位大写MD5值(使用标准MD5库)
34619030B487EC1B49B9EF564A877925
当前请求中除sign参数外其他所有参数(公共参数、API参数)都参与加签
5、拼装API请求
将所有参数(公共参数、API参数)值转换为UTF-8编码后进行拼装,通过浏览器访问该地址,即成功调用一次接口,如下(http网关):
https://openapi.mogujie.com/invoke?sign=34619030B487EC1B49B9EF564A877925×tamp=1367819523&version=1.0& app_key=10011&method=xiaodian.item.get&format=json&itemId=95i27&&sign_method=md5&access_token=TESTACCESSTOKEN
注意:
6、返回结果解密
涉及到敏感信息的接口,会对返回结果进行加密。
解密:使用应用的appSecret的前16位作为key,对加密结果AES解密即可。
appSecret = mysecretmysecretmysecretmysecret
key = appSecret.sub(0, 16)
output = AES(input, key)
参考代码:
public class AESUtil {
private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
public static String decrypt(String cipherText, String key) throws NoSuchPaddingException, NoSuchAlgorithmException,InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] plainText = cipher.doFinal(Base64.getDecoder() .decode(cipherText));
return new String(plainText);
}
}
调用API,必须传入公共参数和api参数(目前只支持UTF-8编码)。公共参数详细介绍如下;应用参数则根据不同API 具体入参,更多请参考API 文档。这里以调用xiaodian.item.get 为例说明(通过API文档可看到调用该API应用参数)
1、公共参数
参数名称 | 类型 | 必填 | 描述 |
---|---|---|---|
app_key | long | 是 | 接入时申请的app_key |
method | String | 是 | 接口名称 |
access_token | String | 是 | Oauth2.0授权获得的access_token |
sign | String | 是 | 对 API 调用参数(除sign外)进行 md5 加密获得。参数的顺序为字母表的顺序 |
format | String | 是 | 响应格式。默认为json格式,固定 |
timestamp | long | 是 | 时间戳,使用Unix时间戳格式 |
version | String | 否 | API协议版本,固定值为:1.0 |
sign_method | String | 否 | 参数的加密方法选,当前只支持Md5,此参数不参与加密 |
2、系统错误码
返回码共7位,其中前2位代表系统码,后5位代表错误码; 开放平台系统码为:00。其中0000000为特殊返回码,代表成功; 注:0000000为所有业务方共享的成功返回码,后缀为500的返回码,代表代码内部处理错误。
系统码 | Api类别 |
---|---|
00 | 开放平台 |
10 | 交易 |
11 | 商品 |
12 | 店铺 |
13 | 物流 |
14 | 基础类目 |
20 | 用户 |
开放平台系统码定义
返回码 | 错误描述 |
---|---|
0000000 | 成功 |
0000001 | 参数校验失败 |
0000002 | Timesteamp时间误差超过5分钟 |
0000003 | SignMethod错误 |
0000004 | sign错误 |
0000005 | 服务实现不存在 |
0000006 | 参数类型错误 |
0000007 | 参数不能为空 |
0000008 | 参数不识别 |
0000009 | API未订阅或者审批未通过 |
0000010 | AccessToken已过期 |
0000011 | aAccessToken不存在 |
0000012 | 无法识别接入的应用唯一标识 |
0000013 | 触发流控,请降低调用频率 |
0000014 | API调用超时 |
0000015 | API不存在 |
0000016 | AppKey不存在 |
0000017 | 触发应用限流,请降低调用频率 |
0000018 | 大促期间API限流 |
0000020 | API未上线,不能调用 |
0000021 | App未审批通过 |
0000022 | App未上线 |
0000401 | API服务已到期 |
0000500 | 系统错误 |
0007001 | 更新token失效 |
0007002 | AuthCode不存在 |
物流返回码定义:
返回码 | 错误描述 |
---|---|
1020001 | 快递单号格式不正确 |
1020002 | 订单状态不一致 |
1020003 | 添加物流信息失败,请重试 |
1020004 | 当前用户没有操作权限 |
1020005 | 退货退款中订单不允许发货 |
1020006 | 发货操作太频繁 |
1020007 | 发货物流公司黑名单,禁止使用 |
商品、店铺返回码定义:
返回码 | 错误描述 |
---|---|
1100400 | 参数错误 |
1100401 | 请先进行实名认证 |
1101400 | 商品数据出错 |
1101403 | 无访问该商品权限 |
1101404 | 商品不存在或已被删除 |
1102400 | SKU数据出错 |
1102404 | SKU不存在或已被删除 |
1103404 | 类目不存在 |
1200404 | 请先开通店铺 |
订单管理返回码定义:
返回码 | 错误描述 |
---|---|
1010001 | 参数异常 |
1010002 | 订单数据查询失败 |
1010003 | 卖家无此订单查询权限 |
3、应用参数
详见相应API说明文档
4、限流
目前限流分API和APP两种限流。
API - 针对单个API总共流量进行的限流,不区分应用。
APP - 针对单个应用(AppKey)进行的限流,不区分API。