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(); // 获取响应体
}
}