纷来商城系统接入引导
| 文档版本号: | V1.0.0 | 文档编号 : | 20191106 |
|---|---|---|---|
| 密级: | 保密 | 归属部门: | 研发部 |
| 产品名: | 纷来商城 | 子系统: | |
| 编写人: | 阳前云 | 日期: | 2020-04-26 |
1、引言
1.1文档概述
本文档提供商品同步和订单同步等能力
1.2阅读对象
本文档阅读对象:纷来商城对接的第三方渠道开发人员
2、接口调用
2.1接口规则
| 名称 | 对应内容值 |
|---|---|
| 测试请求地址 | http://channel.51zheli.com/ |
| 生产请求地址 | http://channel.fenlaishop.com/ |
| 传输方式 | 采用HTTP传输 |
| 提交方式 | 提交数据采用POST提交方式 application/json,拉取数据使用GET提交方式 |
| 字符编码 | 统一采用UTF-8字符编码 |
| 签名算法 | ascll排序+MD5加密签名 |
| 签名要求 | 请求和接收数据均需要校验签名 |
2.2 统一请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|---|
| 渠道 | channelSaleId | 是 | string | 1000018 | 分配给该销售渠道的渠道编码 |
| sign | sign | 是(无参数为否) | string | 8ee69888cef44e030721fd304508672 | 加密算法获取 |
2.3 统一返回响应参数
返回值类型:JSON ( application/json )
返回码描述:
{
"code":"0",
"msg":"success"
}
| 返回码 code | 返回信息 msg | 说明 |
|---|---|---|
| 0 | success | 成功 |
| -1 | 程序猿小哥哥刚才摔倒啦!请等他爬起来~ | 失败 |
2.4 签名规则
无论是请求还是应答,签名原始串按以下方式组装成字符串:
post请求头需包含 channelSaleId(渠道号,该信息由纷来定义分配)和 sign (签名字段,该信息由body内容数组按照键名的升序排序后拼接成字符串再拼接
signKey 值再md5加密而成,最后转为小写);
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import javax.servlet.ServletRequest;
import java.util.Enumeration;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* 签名工具
*/
public class SignUtils {
public static String getMD5Sign(JSONObject paramJson, String signKey) {
Assert.notNull(paramJson, "request params must not be null");
Set<String> set = paramJson.keySet();
TreeMap<String,String> treeMap = new TreeMap<>();
for(String key:set){
if(!"sign".equals(key)){
treeMap.put(key, paramJson.getString(key));
}
}
treeMap.put("signKey", signKey);
Set<Entry<String, String>> setKey = treeMap.entrySet();
StringBuilder sb = new StringBuilder();
setKey.forEach(e -> {
sb.append(e.getKey()).append(e.getValue());
});
return DigestUtils.md5Hex(sb.toString());
}
}调用案例
import com.alibaba.fastjson.JSONObject;
import com.funlike.channel.util.SignUtils;
import com.funlike.framework.core.utils.HttpClientUtil;
import java.util.HashMap;
import java.util.Map;
public class 接口调用案例 {
private void pushDemo() {
Long channelSaleId = 0L; // 渠道编号
JSONObject paramJson = null; // 请求数据对象
String param = paramJson.toJSONString();
String signKey = ""; // 秘钥
String url = ""; // 请求地址
String sign = SignUtils.getMD5Sign(paramJson, signKey); // 获得sign
Map<String, String> headMap = new HashMap<>(); // 组装head
headMap.put("sign", sign);
headMap.put("channelSaleId", String.valueOf(channelSaleId));
String resp = HttpClientUtil.httpPost(url, headMap, param); //调用
System.out.println(resp);
}
}注意: 校验时,字符串转换JSONObject 需传排序参数 ==> JSONObject
paramJson = JSONObject.parseObject("json字符串", Feature.OrderedField);| 错误码定义 |
|---|
| "100", "参数错误" "109", "签名错误" "10016","渠道商不存在或已冻结!" "10061","商品正在云仓调货中,请稍后下单!" |

