以下提供 7 种常用语言/工具的 SDK 代码参考。SDK 本身不保存任何业务参数,调用方需要传入 host、pid、appkey、jk_mark 以及业务参数。
签名算法统一为 MD5("pid=" + pid + appkey),业务参数不参与签名。完整调用示例请查看调用示例。
<?php
/**
* 聚合API平台 PHP SDK
*
* 环境要求:PHP 5.6+,需开启 curl 扩展
* 功能:提供 makeSign 和 callApi 两个工具函数
*
* 注意事项:
* 本文件只负责签名与网络请求,不会保存任何业务参数。
* host、pid、appkey、jk_mark 均由调用方传入。
*/
/**
* 生成签名
*
* 签名规则:
* 1. 拼接字符串:"pid=" + pid + appkey
* 2. 对拼接结果执行 MD5
* 3. 返回 32 位小写十六进制字符串
*
* @param string $pid 用户ID
* @param string $appkey appkey
* @return string 32位小写MD5签名
*/
function makeSign($pid, $appkey)
{
// 拼接签名原文
$signStr = 'pid=' . $pid . $appkey;
// 返回 MD5 签名
return md5($signStr);
}
/**
* 调用 API 接口
*
* @param string $host 接口域名,例如 https://www.phpwc.cn/api/
* @param string $pid 用户ID
* @param string $appkey appkey
* @param string $jk_mark 接口CODE,例如 ipquery
* @param array $bizParams 业务参数,例如 ['ip' => '8.8.8.8']
* @param string $customHost 自定义 Host 头(仅内部测试用,外部开发者忽略此参数)
* @return array 接口返回结果
*/
function callApi($host, $pid, $appkey, $jk_mark, $bizParams = [], $customHost = '')
{
// 步骤 1:把业务参数和身份参数合并
// 注意 sign 不参与业务,只用于鉴权
$params = array_merge($bizParams, [
'pid' => $pid, // 用户ID
'sign' => makeSign($pid, $appkey), // 签名
]);
// 步骤 2:拼接完整请求地址
// 先去掉 host 末尾的 /,再拼上 /接口CODE
$url = rtrim($host, '/') . '/' . $jk_mark;
// 步骤 3:构建请求头(内部测试时可指定自定义 Host,外部开发者忽略)
$headers = [];
if ($customHost) {
$headers[] = 'Host: ' . $customHost;
}
// 步骤 4:使用 cURL 发起 POST 请求
$ch = curl_init(); // 初始化 cURL 句柄
curl_setopt_array($ch, [
CURLOPT_URL => $url, // 请求地址
CURLOPT_POST => true, // POST 方式
CURLOPT_POSTFIELDS => http_build_query($params), // 表单格式参数
CURLOPT_RETURNTRANSFER => true, // 返回响应内容
CURLOPT_FOLLOWLOCATION => true, // 跟随重定向(兼容 HTTP→HTTPS)
CURLOPT_TIMEOUT => 30, // 30秒超时
CURLOPT_SSL_VERIFYPEER => false, // 开发环境关闭证书验证,生产环境建议开启
CURLOPT_SSL_VERIFYHOST => 0, // 不检查证书域名
]);
if ($headers) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
}
$response = curl_exec($ch); // 执行请求
$error = curl_error($ch); // 获取 cURL 错误信息
curl_close($ch); // 释放句柄
// 步骤 5:处理网络错误
if ($error) {
return ['code' => -1, 'desc' => 'cURL错误: ' . $error];
}
// 步骤 6:解析 JSON 响应,解析失败时返回默认值
return json_decode($response, true) ?: ['code' => -1, 'desc' => '响应解析失败'];
}
import hashlib # 用于 MD5 签名
import requests # 用于发起 HTTP 请求
"""
聚合API平台 Python SDK
环境要求:Python 3.6+
依赖安装:pip install requests
功能:提供 make_sign 和 call_api 两个工具函数
注意事项:
本文件只负责签名与网络请求,不会保存任何业务参数。
host、pid、appkey、jk_mark 均由调用方传入。
"""
def make_sign(pid: str, appkey: str) -> str:
"""
生成签名
签名规则:
1. 拼接字符串:"pid=" + pid + appkey
2. 对拼接结果执行 MD5
3. 返回 32 位小写十六进制字符串
Args:
pid: 用户ID
appkey: appkey
Returns:
32位小写MD5签名
"""
# 拼接签名原文
sign_str = f"pid={pid}{appkey}"
# 使用 UTF-8 编码后计算 MD5,再转为十六进制字符串
return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
def call_api(host: str, pid: str, appkey: str, jk_mark: str, biz_params: dict = None) -> dict:
"""
调用 API 接口
Args:
host: 接口域名,例如 https://www.phpwc.cn/api/
pid: 用户ID
appkey: appkey
jk_mark: 接口CODE,例如 ipquery
biz_params: 业务参数,例如 {'ip': '8.8.8.8'}
Returns:
接口返回结果(字典)
"""
# 步骤 1:如果业务参数为空,则初始化为空字典
biz_params = biz_params or {}
# 步骤 2:把业务参数和身份参数合并
# 注意 sign 不参与业务,只用于鉴权
params = {
**biz_params, # 业务参数
'pid': pid, # 用户ID
'sign': make_sign(pid, appkey), # 签名
}
# 步骤 3:拼接完整请求地址
# 先去掉 host 末尾的 /,再拼上 /接口CODE
url = host.rstrip('/') + '/' + jk_mark
# 步骤 4:发起 POST 请求,30秒超时
resp = requests.post(url, data=params, timeout=30)
# 步骤 5:返回 JSON 解析结果
return resp.json()
package main
// 引入标准库
import (
"crypto/md5" // 用于 MD5 签名
"encoding/json" // 用于 JSON 解析
"fmt" // 用于格式化输出
"io" // 用于读取响应体
"net/http" // 用于发起 HTTP 请求
"net/url" // 用于构建表单参数
"strings" // 用于字符串处理
"time" // 用于设置超时
)
/*
聚合API平台 Go SDK
环境要求:Go 1.16+
功能:提供 makeSign 和 CallAPI 两个工具函数
注意事项:
本文件只负责签名与网络请求,不会保存任何业务参数。
host、pid、appkey、jkMark 均由调用方传入。
*/
// makeSign 生成签名
// 签名规则:MD5("pid=" + pid + appkey)
func makeSign(pid, appkey string) string {
// 拼接签名原文
raw := "pid=" + pid + appkey
// 计算 MD5
hash := md5.Sum([]byte(raw))
// 转为 32 位小写十六进制字符串
return fmt.Sprintf("%x", hash)
}
// CallAPI 调用 API 接口
//
// 参数说明:
// host - 接口域名,例如 https://www.phpwc.cn/api/
// pid - 用户ID
// appkey - appkey
// jkMark - 接口CODE,例如 ipquery
// bizParams- 业务参数,例如 {"ip": "8.8.8.8"}
func CallAPI(host, pid, appkey, jkMark string, bizParams map[string]string) (map[string]interface{}, error) {
// 步骤 1:构建表单参数
params := url.Values{}
// 先写入业务参数
for k, v := range bizParams {
params.Set(k, v)
}
// 再写入身份参数和签名
params.Set("pid", pid) // 用户ID
params.Set("sign", makeSign(pid, appkey)) // 签名
// 步骤 2:拼接完整请求地址
// 先去掉 host 末尾的 /,再拼上 /接口CODE
apiURL := strings.TrimRight(host, "/") + "/" + jkMark
// 步骤 3:创建 HTTP 客户端,设置 30 秒超时
client := &http.Client{Timeout: 30 * time.Second}
// 步骤 4:发起 POST 请求(Content-Type: application/x-www-form-urlencoded)
resp, err := client.PostForm(apiURL, params)
if err != nil {
return nil, err
}
defer resp.Body.Close() // 请求结束后关闭响应体
// 步骤 5:读取响应体
body, _ := io.ReadAll(resp.Body)
// 步骤 6:解析 JSON 响应
var result map[string]interface{}
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return result, nil
}
/**
* 聚合API平台 Java SDK
*
* 环境要求:Java 8+
* 依赖:无需第三方库(使用 JDK 内置 HttpURLConnection)
* 功能:提供 makeSign 和 callApi 两个工具函数
*
* 注意事项:
* 本文件只负责签名与网络请求,不会保存任何业务参数。
* host、pid、appkey、jkMark 均由调用方传入。
*/
import java.io.BufferedReader; // 用于读取响应
import java.io.InputStreamReader; // 用于转换输入流
import java.io.OutputStream; // 用于写入请求体
import java.net.HttpURLConnection; // 用于 HTTP 连接
import java.net.URL; // 用于构建 URL
import java.nio.charset.StandardCharsets;// 用于 UTF-8 编码
import java.security.MessageDigest; // 用于 MD5 签名
import java.util.HashMap; // 用于存储参数
import java.util.Map; // 用于声明 Map 类型
public class WcapiSdk {
/**
* 生成签名
*
* 签名规则:
* 1. 拼接字符串:"pid=" + pid + appkey
* 2. 对拼接结果执行 MD5
* 3. 返回 32 位小写十六进制字符串
*
* @param pid 用户ID
* @param appkey appkey
* @return 32位小写MD5签名
*/
private static String makeSign(String pid, String appkey) throws Exception {
// 拼接签名原文
String raw = "pid=" + pid + appkey;
// 获取 MD5 摘要实例
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算 MD5
byte[] digest = md.digest(raw.getBytes(StandardCharsets.UTF_8));
// 把字节数组转为 32 位小写十六进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
/**
* 调用 API 接口(application/x-www-form-urlencoded)
*
* @param host 接口域名,例如 https://www.phpwc.cn/api/
* @param pid 用户ID
* @param appkey appkey
* @param jkMark 接口CODE,例如 ipquery
* @param bizParams 业务参数,例如 {"ip": "8.8.8.8"}
* @return 接口返回的 JSON 字符串
*/
public static String callApi(String host, String pid, String appkey, String jkMark, Map<String, String> bizParams) throws Exception {
// 步骤 1:创建参数 Map
Map<String, String> params = new HashMap<>();
// 如果业务参数不为空,则加入
if (bizParams != null) {
params.putAll(bizParams);
}
// 加入身份参数和签名
params.put("pid", pid); // 用户ID
params.put("sign", makeSign(pid, appkey)); // 签名
// 步骤 2:拼接完整请求地址
// 先去掉 host 末尾的 /,再拼上 /接口CODE
String urlStr = host.replaceAll("/+$", "") + "/" + jkMark;
URL url = new URL(urlStr);
// 步骤 3:建立 HTTP 连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST"); // POST 方式
conn.setDoOutput(true); // 允许写入请求体
conn.setConnectTimeout(30000); // 连接超时 30 秒
conn.setReadTimeout(30000); // 读取超时 30 秒
// 步骤 4:构建 application/x-www-form-urlencoded 请求体
StringBuilder body = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
// 多个参数之间用 & 分隔
if (body.length() > 0) body.append("&");
// key=value 形式拼接
body.append(entry.getKey()).append("=").append(entry.getValue());
}
// 写入请求体
try (OutputStream os = conn.getOutputStream()) {
os.write(body.toString().getBytes(StandardCharsets.UTF_8));
}
// 步骤 5:读取响应
StringBuilder response = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
String line;
// 逐行读取响应内容
while ((line = br.readLine()) != null) {
response.append(line);
}
}
// 断开连接
conn.disconnect();
// 步骤 6:返回 JSON 字符串
return response.toString();
}
}
/*
* 聚合API平台 C# SDK
*
* 环境要求:.NET 6+ 或 .NET Framework 4.6.1+
* 依赖:无需第三方 NuGet 包(使用内置 HttpClient)
* 功能:提供 WcapiClient 类
*
* 注意事项:
* 本类不保存任何业务参数,
* host、pid、appkey、jkMark 均由调用方传入。
*/
using System; // 基础类型
using System.Collections.Generic; // 字典类型
using System.Net.Http; // HTTP 请求
using System.Security.Cryptography; // MD5 签名
using System.Text; // 文本编码
using System.Threading.Tasks; // 异步任务
namespace WcapiSdk
{
/// <summary>
/// 聚合API平台 SDK 客户端
/// </summary>
public class WcapiClient
{
// 内部 HttpClient 实例
private readonly HttpClient _httpClient;
/// <summary>
/// 构造函数:初始化 HttpClient
/// </summary>
public WcapiClient()
{
// 创建 HttpClientHandler,开发环境跳过证书验证
var handler = new HttpClientHandler
{
// 注意:生产环境请勿跳过证书验证
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
};
// 初始化 HttpClient,设置 30 秒超时
_httpClient = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
}
/// <summary>
/// 生成签名:MD5("pid=" + pid + appkey)
/// </summary
/// <param name="pid">用户ID</param>
/// <param name="appkey">appkey</param>
/// <returns>32位小写MD5签名</returns>
private static string MakeSign(string pid, string appkey)
{
// 拼接签名原文
string raw = "pid=" + pid + appkey;
// 计算 MD5
byte[] hash = MD5.HashData(Encoding.UTF8.GetBytes(raw));
// 转为 32 位小写十六进制字符串
return Convert.ToHexStringLower(hash);
}
/// <summary
/// 调用 API 接口
/// </summary>
/// <param name="host">接口域名,例如 https://www.phpwc.cn/api/</param>
/// <param name="pid">用户ID</param>
/// <param name="appkey">appkey</param>
/// <param name="jkMark">接口CODE,例如 ipquery</param>
/// <param name="bizParams">业务参数,例如 {"ip", "8.8.8.8"}</param>
/// <returns>接口返回的 JSON 字符串</returns>
public async Task<string> CallApiAsync(string host, string pid, string appkey, string jkMark, Dictionary<string, string> bizParams = null)
{
// 步骤 1:构建表单参数
var formData = new FormUrlEncodedContent(
new Dictionary<string, string>(bizParams ?? new())
{
["pid"] = pid, // 用户ID
["sign"] = MakeSign(pid, appkey) // 签名
});
// 步骤 2:拼接完整请求地址
string url = host.TrimEnd('/') + "/" + jkMark;
// 步骤 3:发起 POST 请求
HttpResponseMessage resp = await _httpClient.PostAsync(url, formData);
// 步骤 4:读取响应字符串
return await resp.Content.ReadAsStringAsync();
}
}
}
/*
* 聚合API平台 Objective-C SDK
*
* 环境要求:iOS 10+ / macOS 10.12+
* 依赖:Foundation / NSURLSession(系统内置,无需第三方库)
* 功能:提供 WcapiClient 类
*
* 注意事项:
* 本类不保存任何业务参数,
* host、pid、appkey、jkMark 均由调用方传入。
*/
#import <Foundation/Foundation.h>
/*
* WcapiClient 接口声明
*/
@interface WcapiClient : NSObject
/**
* 调用 API 接口(异步)
*
* @param host 接口域名,例如 https://www.phpwc.cn/api/
* @param pid 用户ID
* @param appkey appkey
* @param jkMark 接口CODE,例如 ipquery
* @param bizParams 业务参数,例如 {@@"ip": @@"8.8.8.8"}
* @param completion 回调,result 为解析后的字典,error 为错误信息
*/
+ (void)callApiWithHost:(NSString *)host
pid:(NSString *)pid
appkey:(NSString *)appkey
jk_mark:(NSString *)jkMark
biz_params:(NSDictionary<NSString *, NSString *> *)bizParams
completion:(void (^)(NSDictionary *result, NSError *error))completion;
@end
/*
* WcapiClient 实现
*/
@implementation WcapiClient
/**
* 生成签名:MD5("pid=" + pid + appkey)
*
* @param pid 用户ID
* @param appkey appkey
* @return 32位小写MD5签名
*/
+ (NSString *)makeSignWithPid:(NSString *)pid appkey:(NSString *)appkey
{
// 拼接签名原文
NSString *raw = [NSString stringWithFormat:@"pid=%@%@", pid, appkey];
// 转为 UTF-8 编码的 NSData
NSData *data = [raw dataUsingEncoding:NSUTF8StringEncoding];
// 计算 MD5
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(data.bytes, (CC_LONG)data.length, digest);
// 转为 32 位小写十六进制字符串
NSMutableString *hex = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[hex appendFormat:@"%02x", digest[i]];
}
return hex;
}
/**
* 调用 API 接口(异步)
*/
+ (void)callApiWithHost:(NSString *)host
pid:(NSString *)pid
appkey:(NSString *)appkey
jk_mark:(NSString *)jkMark
biz_params:(NSDictionary<NSString *, NSString *> *)bizParams
completion:(void (^)(NSDictionary *result, NSError *error))completion
{
// 步骤 1:合并业务参数和身份参数
NSMutableDictionary *params = [bizParams mutableCopy] ?: [NSMutableDictionary dictionary];
params[@"pid"] = pid; // 用户ID
params[@"sign"] = [self makeSignWithPid:pid appkey:appkey]; // 签名
// 步骤 2:拼接完整请求地址
NSString *urlString = [NSString stringWithFormat:@"%@/%@",
[host stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]],
jkMark];
NSURL *url = [NSURL URLWithString:urlString];
// 步骤 3:创建 POST 请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST"; // POST 方式
request.timeoutInterval = 30; // 30秒超时
// 步骤 4:把参数编码为 application/x-www-form-urlencoded 格式
NSMutableArray *pairs = [NSMutableArray array];
[params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
// 对 key 和 value 进行 URL 编码
NSString *encodedKey = [key stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *encodedValue = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// 以 key=value 形式加入数组
[pairs addObject:[NSString stringWithFormat:@"%@=%@", encodedKey, encodedValue]];
}];
// 用 & 连接所有参数并设为请求体
request.HTTPBody = [[pairs componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding];
// 步骤 5:发起网络请求
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// 如果发生网络错误,回调返回错误
if (error) {
completion(nil, error);
return;
}
// 解析 JSON 响应
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
completion(result, error);
}];
[task resume];
}
@end
#!/bin/bash
# 聚合API平台 cURL 调用示例
# 适用于 Linux / macOS / Windows Git Bash 等支持 bash 的环境
# ================= 配置区(请修改为你的实际值) =================
# host:接口域名,平台全局统一地址
HOST="https://www.phpwc.cn/api/"
# pid:用户ID,登录用户中心可见
PID="1000"
# appkey:用户中心-API设置获取
APPKEY="tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA"
# jk_mark:接口CODE,见接口详情页,这里以 ipquery 为例
JK_MARK="ipquery"
# ===============================================================
# 步骤 1:生成签名
# 拼接签名原文:pid=1000tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA
SIGN_STR="pid=${PID}${APPKEY}"
# 使用 md5sum 计算 MD5(macOS 可使用 md5 命令)
SIGN=$(echo -n "$SIGN_STR" | md5sum | awk '{print $1}')
# 输出签名值
# echo "sign: $SIGN"
# 步骤 2:拼接完整请求地址
URL="${HOST%/}/${JK_MARK}"
# 步骤 3:使用 cURL 发起 POST 请求
# -X POST 指定请求方式为 POST
# -d 指定请求参数,多个参数用 & 连接
curl -X POST "$URL" \
-d "pid=${PID}&sign=${SIGN}&ip=8.8.8.8"
# 说明:
# pid 和 sign 为公共参数,任何接口都必须携带
# ip=8.8.8.8 为 ipquery 接口的业务参数
# 其他接口请按接口文档替换业务参数
© 网程科技(林州网程科技有限公司) | 豫ICP备2025120409号-2 | 豫B2-20230220 | 豫公网安备 41058102000262号