API接入说明
前置说明:** **
企业资质:结算时,企业不扣除5%的发票成本,但需要开发票才可以提现。
请您根据自己的实际场景,认证身份。
1.如何申请
2.如何验签
公共参数
参数名字 | 参数类型 | 是否必传 | 参数描述 |
---|---|---|---|
appKey | String | 是 | appKey放在请求头里 |
timeStamp | String | 是 | 放在所请求接口的body里 秒级时间戳 |
sign | String | 是 | 放在所请求接口的body里 |
签名算法
{
"goodsType": "3",
"lat": "31.82057",
"lon": "117.22901",
"pagePvId": "1",
"searchWord": "烧烤",
"sign": "fae0b27c451c728867a567e8c1bb4e53",
"sortType": "0",
"telephone": "15555555555",
"timeStamp": 1713590904
}
1.
例如:将pagePvId,goodsType,telephone,sortType,lat,lon,timeStamp,searchWord 排序为 goodsType,lat,lon,pagePvId,searchWord,sortType,telephone,timeStamp
2.
goodsType3lat31.82057lon117.22901pagePvId1searchWord烧烤sortType0telephone15555555555timeStamp1713590904
3.
88888goodsType3lat31.82057lon117.22901pagePvId1searchWord烧烤sortType0telephone15555555555timeStamp171359090488888
4.
PHP签名示例:
public function sign_create($data, $secret = '')
{
ksort($data);
$stringToBeSigned = '';
foreach ($data as $k => $v) {
if($v === "" || $v === null) continue;
if (!is_array($v) && "@" != substr($v, 0, 1)) {
if(is_bool($v)){
$stringToBeSigned .= "$k" . ($v==true ? "true":"false");
}else{
$stringToBeSigned .= "$k$v";
}
}
}
return strtolower(md5($secret.$stringToBeSigned . $secret));
}
<!--hutool工具-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.2</version>
</dependency>
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import java.util.LinkedHashMap;
import java.util.Map;
public class XiGuaZhuApiCaller {
private static final String APP_KEY = "你的appKey";
private static final String APP_SECRET = "你的appSecret";
private static final String API_URL = "你的API接口URL";
public static void main(String[] args) {
// 准备业务参数
Map<String, Object> params = new LinkedHashMap<>();
params.put("goodsType", "3");
params.put("lat", "31.82057");
params.put("lon", "117.22901");
params.put("pagePvId", "1");
params.put("searchWord", "烧烤");
params.put("sortType", "0");
params.put("telephone", "15555555555");
params.put("timeStamp", System.currentTimeMillis() / 1000); // 使用当前时间戳(秒为单位)
// 生成签名
String sign = generateSign(params, APP_SECRET);
// 合并签名到请求参数中
params.put("sign", sign);
// 发送请求
String response = callApi(params);
// 处理响应
System.out.println(response);
}
/**
* 生成签名
*
* @param params 请求参数
* @param appSecret 应用密钥
* @return 签名
*/
private static String generateSign(Map<String, Object> params, String appSecret) {
// 1. 移除sign参数(如果存在)
params.remove("sign");
// 2. 将Map转换为List<Map.Entry<String, Object>>
List<Map.Entry<String, Object>> list = new ArrayList<>(params.entrySet());
// 3. 按照参数名进行排序
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
@Override
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
// 4. 拼接参数名和参数值
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, Object> entry : list) {
sb.append(entry.getKey()).append(entry.getValue());
}
// 5. 添加app_secret
sb.insert(0, appSecret).append(appSecret);
// 6. MD5加密(小写)
return DigestUtil.md5Hex(sb.toString());
}
/**
* 调用API接口
*
* @param params 请求参数
* @return 响应内容
*/
private static String callApi(Map<String, Object> params) {
// 转换为JSON字符串
String jsonBody = JSONUtil.toJsonStr(params);
// 发送POST请求
return HttpRequest.post(API_URL)
.header("appKey", APP_KEY) // 设置请求头
.body(jsonBody) // 设置请求体
.execute()
.body(); // 获取响应体
}
}
此外,如果API需要特定的HTTP头或请求方法(如GET、PUT等),你需要相应地修改callApi方法中的HttpRequest调用。
状态码说明
code等于1,请求失败;
code等于99999,全局异常
code等于401 ,无权限调用,具体看msg