使用Java调用Whatsapp Gateway发送消息返回500错误如何解决
问题排查与修复方案
你遇到的500错误核心是请求格式错误导致网关服务端解析失败,以下是所有问题点与修复方案:
问题清单
- 非法JSON请求体:你构造的payload完全不符合JSON语法规范,键、字符串值没有加双引号,键值对用了错误的
|分隔,也没有闭合大括号,网关解析JSON直接抛出异常返回500 - 响应读取逻辑空指针:
InputStreamReader Writing被初始化为null后直接传入BufferedReader,代码执行到此处直接触发空指针异常进入catch块 - 未适配错误响应读取逻辑:返回4xx/5xx状态码时,HttpURLConnection需要从
getErrorStream而非默认的getInputStream读取响应内容,否则也会抛出IO异常 - 号码格式可能不符合要求:绝大多数WhatsApp网关要求号码携带国家码前缀,不能以0开头,比如你示例中的印尼号码需要修改为
6281275704515
修复后代码
import java.net.*; import java.io.BufferedReader; import java.io.OutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; public class JsonExample1 { // 您的网关业务ID private static final String ID_CLIENT = "替换为你真实的业务ID"; // 您的网关令牌 private static final String CLIENT_SECRET = "替换为你真实的令牌"; // 网关URL private static final String URL_GATEWAY = "替换为你真实的网关地址"; // 主方法 public static void main(String[] args) throws Exception { // Whatsapp号码 注意携带国家码,不要带+号、空格、横杠 String number = "6281275704515"; // Whatsapp消息内容 String message = "Test WhatsApp message"; sendwhatsapp(number, message); } public static void sendwhatsapp(String number, String message) { // 构造合法JSON,注意键名如果网关要求大写就改成Number、Message String payload = String.format("{\"number\":\"%s\",\"message\":\"%s\"}", number, message); // 调试可以先打印payload确认格式 System.out.println("请求体:" + payload); try { URL url = new URL(URL_GATEWAY); HttpURLConnection conex = (HttpURLConnection) url.openConnection(); configPostRequest(conex); try(OutputStream output = conex.getOutputStream()){ output.write(payload.getBytes(StandardCharsets.UTF_8)); output.flush(); } int stateCode = conex.getResponseCode(); System.out.println("请求状态码:" + stateCode); // 适配正常/错误响应读取 try(InputStreamReader reader = new InputStreamReader( stateCode >= 200 && stateCode < 300 ? conex.getInputStream() : conex.getErrorStream(), StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(reader)){ String line; StringBuilder response = new StringBuilder(); while ((line = br.readLine()) != null) { response.append(line); } System.out.println("网关响应内容:" + response); } conex.disconnect(); } catch (Exception e) { System.out.println("消息发送失败,错误信息:"); e.printStackTrace(); } } public static void configPostRequest(HttpURLConnection conex) throws ProtocolException { conex.setDoOutput(true); conex.setRequestMethod("POST"); conex.setRequestProperty("ID", ID_CLIENT); conex.setRequestProperty("CLIENT_SECRET", CLIENT_SECRET); conex.setRequestProperty("Content-Type", "application/json; charset=utf-8"); } }
补充排查建议
如果修改后还是返回错误,可以先将打印出的请求体、请求头复制到接口调试工具直接调用网关,确认参数名、鉴权信息、网关地址是否正确。
内容的提问来源于stack exchange,提问作者Nurgustianto Bahdar
相关产品推荐
相关产品推荐

