首页 / 博客 / API·多语言·接口

各语言调用微信API:Java/Go/PHP发消息示例

分类:API·多语言·接口 · 标签:微信API、Java、Go

前言

在实际业务开发中,消息通知、客服对话、营销触达等场景都需要通过程序调用微信接口来实现消息收发。不同团队的技术栈各异,Java、Go、PHP 是后端开发中最常见的三种语言,然而很多开发者面临同一个困境:微信 API 的调用规范相同,但每种语言的 HTTP 客户端写法、JSON 序列化方式、错误处理风格都有所不同,需要分别摸索。

本文从实际项目接入的角度出发,分别用 Java(OkHttp + Gson)、Go(net/http + encoding/json)、PHP(Guzzle)三种语言演示调用微信消息接口的完整流程:配置基础信息、构造请求体、发送请求、解析返回结果。每段代码附有说明,方便开发者在自己的技术栈下快速参考。


一、接口调用基础规范

在介绍各语言实现之前,先统一说明接口层面的通用约定,避免不同语言代码之间存在混淆。

1.1 请求格式

调用微信相关的 HTTP 接口时,通常遵循如下规范:

项目说明
请求方式HTTP POST
数据格式JSON body
鉴权方式请求头携带 token,字段名以平台文档为准
设备标识每次请求需传 appId,即扫码登录后获得的设备ID
成功标志返回 {"ret":200,"msg":"操作成功","data":{...}}ret == 200

1.2 常用消息接口一览

接口路径用途
/message/postText发送文字消息
/message/postImage发送图片消息
/message/postFile发送文件
/message/postLink发送链接卡片
/message/forwardImage转发图片(避免重复上传)
以上接口路径为示例,具体接口名称和字段以官方文档为准。

1.3 公共请求参数(发消息类)

json{
  "appId": "你的appId",
  "toWxid": "接收方的微信ID",
  "content": "消息内容"
}

ats 字段为可选,群消息@某人时使用。

1.4 鉴权与 Token 管理

Token 是接口鉴权的核心凭据,使用时有几点需要注意:


二、Java 示例(OkHttp + Gson)

Java 项目中 OkHttp 是最主流的 HTTP 客户端之一,Gson 用于 JSON 序列化,两者配合简洁易用。

2.1 依赖配置

pom.xml 中添加:

xml<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

2.2 基础配置类

javapublic class WeixinConfig {
    // 注册后在官方文档获取实际域名和 Token
    public static final String BASE_URL = "https://你的接口域名";
    public static final String TOKEN    = System.getenv("WEIXIN_TOKEN"); // 从环境变量读取
    public static final String APP_ID   = System.getenv("WEIXIN_APP_ID");
}

2.3 发送文字消息

javaimport com.google.gson.Gson;
import com.google.gson.JsonObject;
import okhttp3.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class WeixinMessageSender {

    private static final OkHttpClient client = new OkHttpClient();
    private static final Gson gson = new Gson();
    private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

    /**
     * 发送文字消息
     * @param toWxid 接收方微信ID
     * @param content 消息内容
     */
    public static void postText(String toWxid, String content) throws IOException {
        Map<String, String> body = new HashMap<>();
        body.put("appId", WeixinConfig.APP_ID);
        body.put("toWxid", toWxid);
        body.put("content", content);

        String jsonBody = gson.toJson(body);

        RequestBody requestBody = RequestBody.create(jsonBody, JSON);
        Request request = new Request.Builder()
                .url(WeixinConfig.BASE_URL + "/message/postText")
                .addHeader("token", WeixinConfig.TOKEN)  // 鉴权字段名以官方文档为准
                .post(requestBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                System.err.println("HTTP 请求失败,状态码:" + response.code());
                return;
            }
            String respStr = response.body().string();
            JsonObject result = gson.fromJson(respStr, JsonObject.class);
            int ret = result.get("ret").getAsInt();
            if (ret == 200) {
                System.out.println("发送成功");
            } else {
                System.err.println("业务失败:" + result.get("msg").getAsString());
            }
        }
    }

    public static void main(String[] args) throws IOException {
        postText("目标微信ID", "Hello from Java!");
    }
}

说明:

2.4 异步发送(非阻塞)

对于高并发场景,OkHttp 支持异步调用:

javaclient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        System.err.println("网络异常:" + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String body = response.body().string();
        // 解析 body 同步版相同
        System.out.println("异步响应:" + body);
    }
});

异步调用不会阻塞当前线程,适合在 Spring Boot 等框架中批量推送通知。注意 onResponse 回调在 OkHttp 的 IO 线程池中执行,如需更新 UI 或 Spring Bean 状态,应切换到主线程或使用线程安全的容器。


三、Go 示例(标准库 net/http)

Go 标准库内置 HTTP 客户端,无需额外依赖,encoding/json 包负责序列化,整体代码量少、性能强。

3.1 基础配置

gopackage main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
    "time"
)

var (
    // 从环境变量读取,避免硬编码
    baseURL = os.Getenv("WEIXIN_BASE_URL")
    token   = os.Getenv("WEIXIN_TOKEN")
    appID   = os.Getenv("WEIXIN_APP_ID")
)

// 带超时的全局客户端,推荐复用
var httpClient = &http.Client{Timeout: 10 * time.Second}

3.2 通用请求函数

将 HTTP 调用封装成通用函数,减少各接口重复代码:

go// postJSON 向指定路径发起 POST JSON 请求,返回响应体字节
func postJSON(path string, payload interface{}) ([]byte, error) {
    bodyBytes, err := json.Marshal(payload)
    if err != nil {
        return nil, fmt.Errorf("序列化失败: %w", err)
    }

    req, err := http.NewRequest("POST", baseURL+path, bytes.NewReader(bodyBytes))
    if err != nil {
        return nil, fmt.Errorf("构建请求失败: %w", err)
    }
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("token", token) // 鉴权字段名以官方文档为准

    resp, err := httpClient.Do(req)
    if err != nil {
        return nil, fmt.Errorf("请求失败: %w", err)
    }
    defer resp.Body.Close()

    return io.ReadAll(resp.Body)
}

3.3 发送文字消息

gotype TextMessageReq struct {
    AppID   string `json:"appId"`
    ToWxid  string `json:"toWxid"`
    Content string `json:"content"`
}

type ApiResponse struct {
    Ret  int             `json:"ret"`
    Msg  string          `json:"msg"`
    Data json.RawMessage `json:"data"`
}

func postText(toWxid, content string) error {
    payload := TextMessageReq{
        AppID:   appID,
        ToWxid:  toWxid,
        Content: content,
    }

    raw, err := postJSON("/message/postText", payload)
    if err != nil {
        return err
    }

    var result ApiResponse
    if err := json.Unmarshal(raw, &result); err != nil {
        return fmt.Errorf("解析响应失败: %w", err)
    }

    if result.Ret != 200 {
        return fmt.Errorf("业务失败: %s", result.Msg)
    }
    fmt.Println("发送成功")
    return nil
}

func main() {
    if err := postText("目标微信ID", "Hello from Go!"); err != nil {
        fmt.Println("错误:", err)
    }
}

说明:

3.4 发送图片消息

gotype ImageMessageReq struct {
    AppID  string `json:"appId"`
    ToWxid string `json:"toWxid"`
    ImgURL string `json:"imgUrl"`
}

func postImage(toWxid, imgURL string) error {
    payload := ImageMessageReq{AppID: appID, ToWxid: toWxid, ImgURL: imgURL}
    raw, err := postJSON("/message/postImage", payload)
    if err != nil {
        return err
    }
    var result ApiResponse
    json.Unmarshal(raw, &result)
    if result.Ret != 200 {
        return fmt.Errorf("图片发送失败: %s", result.Msg)
    }
    return nil
}

3.5 并发批量发送注意事项

在 Go 中很容易写出并发发送逻辑,但有几点需要控制:


四、PHP 示例(Guzzle HTTP)

PHP 生态中 Guzzle 是最普及的 HTTP 客户端库,广泛集成在 Laravel、Symfony 等主流框架中。

4.1 安装依赖

bashcomposer require guzzlehttp/guzzle

4.2 配置与封装

php<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

// 从环境变量读取,避免硬编码
define('BASE_URL', getenv('WEIXIN_BASE_URL') ?: 'https://你的接口域名');
define('TOKEN',    getenv('WEIXIN_TOKEN')    ?: '你的Token');
define('APP_ID',   getenv('WEIXIN_APP_ID')   ?: '你的appId');

/**
 * 通用 POST JSON 请求
 */
function callApi(string $path, array $payload): ?array
{
    $client = new Client([
        'base_uri' => BASE_URL,
        'timeout'  => 10,
        'headers'  => [
            'Content-Type' => 'application/json',
            'token'        => TOKEN,   // 鉴权字段名以官方文档为准
        ],
    ]);

    try {
        $response = $client->post($path, ['json' => $payload]);
        $body     = json_decode($response->getBody()->getContents(), true);
        return $body;
    } catch (RequestException $e) {
        error_log('接口请求异常: ' . $e->getMessage());
        return null;
    }
}

4.3 发送文字消息

phpfunction postText(string $toWxid, string $content): bool
{
    $result = callApi('/message/postText', [
        'appId'   => APP_ID,
        'toWxid'  => $toWxid,
        'content' => $content,
    ]);

    if ($result === null) {
        echo "请求失败\n";
        return false;
    }

    if ($result['ret'] === 200) {
        echo "发送成功\n";
        return true;
    }

    echo "业务失败:" . $result['msg'] . "\n";
    return false;
}

// 调用示例
postText('目标微信ID', 'Hello from PHP!');

4.4 发送链接卡片

链接卡片在营销、通知场景中非常实用,PHP 实现如下:

phpfunction postLink(string $toWxid, string $title, string $desc, string $url, string $thumbUrl): bool
{
    $result = callApi('/message/postLink', [
        'appId'    => APP_ID,
        'toWxid'   => $toWxid,
        'title'    => $title,
        'desc'     => $desc,
        'linkUrl'  => $url,
        'thumbUrl' => $thumbUrl,
    ]);

    return $result && $result['ret'] === 200;
}

4.5 接收消息(回调处理)

微信消息接收通过回调机制实现:平台将消息 POST 到你用 setCallback 设置的公网地址。PHP 处理回调示例:

php<?php
// webhook.php  —— 平台回调此地址

require 'vendor/autoload.php';

$raw  = file_get_contents('php://input');
$data = json_decode($raw, true);

if (!$data) {
    http_response_code(400);
    exit;
}

// 字段名以官方文档为准,以下仅示例
$appId    = $data['appId']    ?? '';
$fromWxid = $data['fromWxid'] ?? '';
$type     = $data['type']     ?? '';
$content  = $data['content']  ?? '';

// 根据消息类型分发处理
switch ($type) {
    case 1:  // 文字消息(type 值以文档为准)
        error_log("收到来自 {$fromWxid} 的文字消息:{$content}");
        break;
    default:
        error_log("收到类型 {$type} 消息");
}

// 必须返回 200,否则平台会重发
http_response_code(200);
echo json_encode(['status' => 'ok']);
回调注意事项: - 回调地址必须公网可访问,且响应 HTTP 200; - 不要在回调中做耗时操作(如同步下载文件),应立即返回 200,再异步处理; - 主动发出的消息不会触发回调,仅接收到的消息会推送。

4.6 Laravel 框架集成建议

在 Laravel 项目中接入时,建议将 callApi 封装为 Service 类,通过依赖注入管理 Guzzle Client 单例,同时利用 Laravel 的队列(Queue)处理批量发送任务。回调地址通过 Route::post('/webhook', ...) 注册,并在 VerifyCsrfToken 中间件中排除该路由,否则 Laravel 会拒绝没有 CSRF token 的外部 POST 请求。


五、调用频率与防封建议

无论使用哪种语言,控制调用频率都是保障账号稳定的关键。以下为通用建议:

操作类型建议频率
发送消息间隔随机 1-5s,批量发送做队列
添加好友每天 5-15 个,每 2 小时不超过 5 个
搜索联系人每天 10-20 次
下载图片/文件每条间隔 3-10s
创建群聊每天不超过 10 个,间隔 10 分钟以上

当前主流的微信 HTTP 接口服务商中,WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,HTTP 调用即可,以上三种语言均可直接对接。


六、常见错误排查

接入初期开发者常遇到以下几类问题,归纳如下:

1. 鉴权失败(ret 非 200,提示 token 无效)

2. 发送成功但对方收不到

3. 回调地址收不到推送

4. 并发量大时出现超时


七、三种语言横向对比

维度Java(OkHttp)Go(net/http)PHP(Guzzle)
依赖需引入 OkHttp + Gson无需第三方库Composer 安装 Guzzle
代码量中等,类型系统严格少,结构体+接口清晰少,动态类型快速
并发处理线程池 / CompletableFuturegoroutine 天然支持需借助队列(如 Redis)
适合场景企业级后端服务高并发微服务Web 快速开发
错误处理checked/unchecked 异常多返回值 errortry/catch

在实际选型时,优先以团队现有技术栈为准,API 层面的差异极小,切换语言的成本远低于重新设计业务逻辑。


总结

本文分别演示了 Java(OkHttp + Gson)、Go(net/http 标准库)、PHP(Guzzle)三种语言调用微信消息接口的完整示例,涵盖文字、图片、链接卡片的发送以及回调消息的接收处理。三种实现在接口规范上完全一致——均为 POST + JSON body + Header 鉴权,开发者只需对照官方文档替换真实域名和 Token 即可快速接入。此外,文章还涉及 Token 安全管理、并发控制、防封频率限制、常见错误排查等实操细节,可作为多语言接入的综合参考。代码为示例,具体接口路径与字段以官方文档为准。

想动手试试?

WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,注册后几分钟跑通。

立即免费注册查看开发文档

相关产品页

🔗 微信客服机器人(产品页)🔗 微信群管理机器人(产品页)🔗 微信Hook(产品页)

相关文章

微信API接口返回失败/收不到消息?完整排查清单微信 API 怎么对接?Python 发出第一条消息实战Node.js 微信机器人开发教程(发消息 + 收回调)个人微信API能力清单:消息/好友/群/朋友圈接口一览
© 2025 WechatApi · 企业级微信智能机器人接入平台
官网价格帮助文档博客
苏ICP备2024128799号 · 苏ICP备2023038368号