# 如何通过代码发送短信：使用Python、PHP、Node.js、Java、Go和C# 进行一次REST调用

> 通过代码发送短信是通过一次经过身份验证的HTTPS POST请求实现的：包含一个Bearer令牌、一个带有发送者ID、目标号码、消息内容和消息类型的JSON正文，并返回一个消息ID。以下是Python、PHP、Node.js、Java、Go和C# 中的相同请求示例，以及错误处理和生产环境建议。

- 规范网址: https://www.broadnet.me/zh/blog/send-sms-api-python-php-nodejs-java-csharp
- 语言: zh
- 最后更新: 2026-09-28
- 发布方: BroadNet (https://www.broadnet.me)

- 发布日期: 2026-09-28
- 作者: BroadNet Editorial Team

要通过代码发送短信，请向 https://api.broadnet.me/sms/sendSms 发起一次HTTPS POST请求，包含Authorization: Bearer请求头和包含senderId、destinationNumber、消息内容及messageType的JSON正文。调用成功后将返回HTTP 200状态码，并将消息ID作为响应体返回；送达结果随后将作为状态报告（DLR）发送到您的Webhook。以下每种语言仅使用其标准的HTTP库；唯一的官方SDK是用于TypeScript和Node.js的。

## 核心要点

- 端点：POST https://api.broadnet.me/sms/sendSms, JSON正文，Bearer令牌。
- 必填字段：senderId、destinationNumber（不带加号的国际格式）、消息内容、messageType (TEXT)。
- 响应：200状态码及消息ID；请保留该ID以便匹配状态报告。
- 错误：令牌缺失或无效会导致网关返回401；API错误将返回status、error、message、errorCode和requestUri。
- 一个官方SDK：用于TypeScript/Node.js的@broadnet/cpaas-sdk；可根据OpenAPI规范为其他语言生成客户端。

## 发送前您需要准备什么？

- 一个来自您BroadNet账户的访问令牌，请将其保存在环境变量中（如下方的BROADNET_TOKEN所示），切勿将其保存在源代码或移动应用中。
- 一个目标国家允许使用的发送者ID；某些国家需要先进行报备。
- 一个符合国际格式的目标号码，例如447700900123（一个虚构的英国号码）。

测试权限由我们的工程师提供：申请测试权限后，您将在一个工作日内获得测试凭据，通常在获得凭据后约五分钟即可发出第一条测试短信。[快速入门](https://www.broadnet.me/developers/quickstart)将引导您完成操作。

## 请求的具体格式是怎样的？

这是带有cURL的请求。以下每个示例发送的都是相同的JSON正文。

```
curl -X POST https://api.broadnet.me/sms/sendSms \
  -H "Authorization: Bearer $BROADNET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "senderId": "BroadNet",
    "destinationNumber": "447700900123",
    "message": "Your verification code is 482913",
    "messageType": "TEXT"
  }'

# 200 OK → response body is the message ID, e.g. 2603121407537573731
```

## 如何使用Python发送短信？

使用requests库时，json= 参数会自动为您设置Content-Type请求头。

```
import os, requests

r = requests.post(
    "https://api.broadnet.me/sms/sendSms",
    headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
    json={
        "senderId": "BroadNet",
        "destinationNumber": "447700900123",
        "message": "Your verification code is 482913",
        "messageType": "TEXT",
    },
)

print(r.status_code, r.text)  # message ID
```

## 如何使用PHP发送短信？

使用PHP的curl扩展即可；无需安装额外的包。

```
<?php
$ch = curl_init("https://api.broadnet.me/sms/sendSms");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        "Authorization: Bearer " . getenv("BROADNET_TOKEN"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        "senderId"          => "BroadNet",
        "destinationNumber" => "447700900123",
        "message"           => "Your verification code is 482913",
        "messageType"       => "TEXT",
    ]),
]);

$messageId = curl_exec($ch);
echo $messageId;
```

## 如何使用Node.js发送短信？

Node.js 18及更高版本已内置fetch功能：

```
// Node.js 18+ (fetch)
const res = await fetch("https://api.broadnet.me/sms/sendSms", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BROADNET_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    senderId: "BroadNet",
    destinationNumber: "447700900123",
    message: "Your verification code is 482913",
    messageType: "TEXT",
  }),
});

console.log(await res.text()); // message ID
```

或者使用官方的TypeScript/Node.js SDK，@broadnet/cpaas-sdk：

```
// npm install @broadnet/cpaas-sdk axios
import { Configuration, SMSSMSApi } from "@broadnet/cpaas-sdk";

const sms = new SMSSMSApi(
  new Configuration({
    basePath: "https://api.broadnet.me",
    accessToken: process.env.BROADNET_TOKEN!,
  }),
);

const res = await sms.smsSendsmsPost({
  sMSSmsRequest: {
    senderId: "BroadNet",
    destinationNumber: "447700900123",
    message: "Your verification code is 482913",
    messageType: "TEXT",
  },
});

console.log(res.data); // message ID
```

## 如何使用Java发送短信？

Java 11及更高版本包含java.net.http.HttpClient：

```
// Java 11+ — java.net.http is built in, nothing to install
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class SendSms {
    public static void main(String[] args) throws Exception {
        String json = "{"
            + "\"senderId\": \"BroadNet\", "
            + "\"destinationNumber\": \"447700900123\", "
            + "\"message\": \"Your verification code is 482913\", "
            + "\"messageType\": \"TEXT\""
            + "}";

        HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.broadnet.me/sms/sendSms"))
            .header("Authorization", "Bearer " + System.getenv("BROADNET_TOKEN"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpResponse<String> res = HttpClient.newHttpClient()
            .send(req, HttpResponse.BodyHandlers.ofString());

        System.out.println(res.statusCode() + " " + res.body()); // 200 + message ID
    }
}
```

## 如何使用Go发送短信？

```
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	body := []byte(`{
		"senderId": "BroadNet",
		"destinationNumber": "447700900123",
		"message": "Your verification code is 482913",
		"messageType": "TEXT"
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.broadnet.me/sms/sendSms", bytes.NewReader(body))
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("BROADNET_TOKEN"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	id, _ := io.ReadAll(res.Body)
	fmt.Println(res.StatusCode, string(id)) // 200 + message ID
}
```

## 如何使用C# 和 .NET发送短信？

.NET 6及更高版本无需NuGet包：已内置HttpClient和System.Net.Http.Json。

```
// .NET 6+ console app (Program.cs) — HttpClient is built in, no NuGet package
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("BROADNET_TOKEN"));

// PostAsJsonAsync sends Content-Type: application/json
var res = await http.PostAsJsonAsync("https://api.broadnet.me/sms/sendSms", new
{
    senderId = "BroadNet",
    destinationNumber = "447700900123",
    message = "Your verification code is 482913",
    messageType = "TEXT",
});

var id = await res.Content.ReadAsStringAsync();
Console.WriteLine($"{(int)res.StatusCode} {id}"); // 200 + message ID
```

## 返回结果是什么，以及如何处理错误？

| 响应 | 含义 | 应对措施 |
|---|---|---|
| 200 +消息ID | 已接受并准备投递 | 请将ID与您自己的记录进行存储；等待DLR |
| 400 | 验证错误或缺少字段 | 请修正请求；请勿使用原请求重试 |
| 401 | 缺少或无效的Bearer令牌 | 检查令牌和Authorization请求头 |
| 500 | 意外的服务器错误 | 请使用退避机制重试；在重新发送之前请检查消息状态 |

200表示平台已接收消息，并不代表手机已收到。送达情况由状态报告提供；请参阅[什么是DLR](https://www.broadnet.me/answers/what-is-dlr)以及[短信状态报告和错误代码](https://www.broadnet.me/blog/sms-delivery-receipts-dlr-error-codes)。API没有幂等性请求头，因此请保留返回的消息ID，并在重新发送前检查其状态，以避免重复发送。其余内容请参见[错误代码](https://www.broadnet.me/developers/error-codes)页面。

## 如何使其达到生产可用状态？

- 请将令牌保存在服务器端。切勿从浏览器或移动应用中调用短信API，因为令牌可能会被提取；请改为调用您自己的后端。
- 请知晓长短信的发送规则：GSM-7每条短信包含160个字符，Unicode (UCS-2)为70个字符，更长的文本将被拆分为计费的分段。请参阅[短信字符限制](https://www.broadnet.me/answers/sms-character-limit-explained)。
- 排队进行群发并遵守您账户的吞吐量限制；请阅读[速率限制](https://www.broadnet.me/developers/rate-limits)。
- 通过[Webhook](https://www.broadnet.me/developers/webhooks)接收状态报告并存储最终状态。
- 请先将号码验证为国际格式；请参阅[E.164电话号码验证](https://www.broadnet.me/blog/e164-phone-number-validation-msisdn)。

对于极高业务量或现有的电信技术栈，SMPP可能比REST更合适；请参阅[SMPP与REST的对比](https://www.broadnet.me/compare/sms-api-vs-smpp)。BroadNet的平台每个节点可处理每秒30,000条短信。

## 常见问题

### 通过代码发送短信最简单的方法是什么？

使用访问令牌和JSON正文向短信API发送一次HTTPS POST请求。使用BroadNet时，即向 https://api.broadnet.me/sms/sendSms 发送POST请求，并携带senderId、destinationNumber、message和messageType。

### 是否有针对Python、PHP或Java的BroadNet SDK？

没有。目前仅提供一个针对TypeScript和Node.js的官方SDK @broadnet/cpaas-sdk。其他语言可直接调用REST API（如下所示），或根据OpenAPI规范生成客户端。

### 电话号码应该使用什么格式？

包含国家代码且不带加号或空格的国际格式，例如447700900123。

### 200响应是否意味着短信已送达？

不是。这仅表示消息已被接收。状态报告（DLR）会报告消息是否已到达手机。

### 我可以直接通过Android或iOS应用发送短信吗？

不建议这样做，因为不安全。请将API调用放在您的服务器上，以确保访问令牌不会内置在应用中，并由应用调用您的服务器。

### 我在哪里可以找到完整的API参考文档？

参见[API参考资料](https://www.broadnet.me/developers/api-reference)和[OpenAPI规范](https://www.broadnet.me/developers/openapi)。

代码示例取自我们的开发者页面，并已根据已发布的OpenAPI规范进行核对。最后修订日期：2026年9月28日。请参阅我们的[编辑标准](https://www.broadnet.me/about/editorial-standards)。
