易企生活API接口文档
描述
接口协议
接口
发送验证码接口
验证验证码
创建订单
查询订单
查询余额
查询产品列表
异步通知接口
本文档使用 MrDoc 发布
-
+
首页
接口协议
## 一、请求协议 ### POST 请求 - 请求使用http协议,POST(application/json)请求方式,请求参数为JSON格式。 - 注意body必须为JSON格式 - header中必须包含 X-App-Id、X-Sign、X-TIMESTAMP参数 - 字符集:UTF8 - 响应格式为JSON格式 列如: ```javascript PSOT http://www.xxx.xxx/... Content-Type: application/json X-App-Id: appId X-Sign: signStr X-TIMESTAMP: timestamp {"phone":"13888888888","productFlag":"cmcc5g","sendNum":1} ``` ### GET 请求 - 请求使用http协议,GET(application/x-www-form-urlencoded)请求方式,请求参数为表单格式。 列如: `orderId=1694710842685128705&chargeNo=f9151ad0-eec8-4b85-8d40-64a411643aeb ` ### header X-App-Id: 调用API接口的的KEY X-Sign: 参数签名`md5(appScret + paramStr + timestamp + appScret).toUpperCase();` X-TIMESTAMP:时间戳`String.valueOf(System.currentTimeMillis())` ## 二、联调测试 ### 1、配置 AppId:调用API接口的的KEY appSecret:调用API接口的密钥 ### 2、签名算法 去除sign和timestamp参数,提取到所有参数。 对所有参数按照参数名key升序排序。 按请求参数名及参数值相互连接组成一个字符串: paramStr。 在上述字符串前后加上appScret值:`md5(appScret + paramStr + timestamp + appScret)..toUpperCase();` ```java package com.nbw.sdk.util; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import java.util.*; /** * 开放平台 * @author : long * Created by 12:25 on 2023/8/17. */ public class SignUtil { /** * 验证签名 * @param map 参数 * @param oldSign 传过来的签名 * @param timestamp 时间戳 * @param appSecret 秘钥 * @return */ public static boolean validateSign(SortedMap<String, Object> map, String oldSign,String timestamp,String appSecret) { if(StrUtil.isBlank(oldSign)){ return false; } // 获取用户信息 String sign = signObj(map,timestamp, appSecret); return oldSign.equals(sign); } /** * 签名 * @param mapParam * @param timestamp 时间戳 * @param appScret * @return */ public static String signObj(SortedMap<String, Object> mapParam,String timestamp, String appScret) { SortedMap<String, String> sortedMap = new TreeMap<>(); for (Map.Entry<String, Object> entry : mapParam.entrySet()){ sortedMap.put(entry.getKey(),entry.getValue() != null ? entry.getValue().toString() : ""); } return sign(sortedMap,timestamp,appScret); } /** * 签名 * @param mapParam * @param timestamp 时间戳 * @param appScret * @return */ public static String sign(SortedMap<String, String> mapParam,String timestamp, String appScret) { String paramStr = getMapToString(mapParam); String signParam = appScret + paramStr + timestamp + appScret; return SecureUtil.md5(signParam).toUpperCase(); } /** * Map转String * @param map * @return */ private static String getMapToString(Map<String, String> map) { Set<String> keySet = map.keySet(); //将set集合转换为数组 String[] keyArray = keySet.toArray(new String[keySet.size()]); //给数组排序(升序) Arrays.sort(keyArray); //因为String拼接效率会很低的,所以转用StringBuilder StringBuilder sb = new StringBuilder(); for (int i = 0; i < keyArray.length; i++) { // 参数值为空,则不参与签名 这个方法trim()是去空格 sb.append(keyArray[i]).append("=").append(String.valueOf(map.get(keyArray[i])).trim()); } return sb.toString(); } } ```
神马
2023年8月24日 23:40
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码