欢迎您!
API文档中心
入门指南
快速接入 签名算法 调用示例
参考文档
SDK 参考 错误码速查

SDK 代码参考

以下提供 7 种常用语言/工具的 SDK 代码参考。SDK 本身不保存任何业务参数,调用方需要传入 hostpidappkeyjk_mark 以及业务参数。

签名算法统一为 MD5("pid=" + pid + appkey),业务参数不参与签名。完整调用示例请查看调用示例

  • PHP
  • Python
  • Go
  • Java
  • C#
  • Objective-C
  • cURL
<?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]];
    }];
    // 用 &amp; 连接所有参数并设为请求体
    request.HTTPBody = [[pairs componentsJoinedByString:@"&amp;"] 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:&amp;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 指定请求参数,多个参数用 &amp; 连接
curl -X POST "$URL" \
    -d "pid=${PID}&amp;sign=${SIGN}&amp;ip=8.8.8.8"

# 说明:
#   pid 和 sign 为公共参数,任何接口都必须携带
#   ip=8.8.8.8 为 ipquery 接口的业务参数
#   其他接口请按接口文档替换业务参数
完整调用示例请查看调用示例,完整错误码请查看错误码速查

© 网程科技(林州网程科技有限公司)   |  豫ICP备2025120409号-2   |  豫B2-20230220   |  豫公网安备 41058102000262号