BroadNet
期刊工程部
工程部

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

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

9 分钟阅读
工程部 · 期号 28
9 分钟阅读

通过代码发送短信,请向 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(一个虚构的英国号码)。

测试权限由我们的工程师提供:申请测试权限后,您将在一个工作日内获得测试凭据,通常在获得凭据后约五分钟即可发出第一条测试短信。快速入门将引导您完成操作。

请求的具体格式是怎样的?

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

snippet
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请求头。

snippet
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扩展即可;无需安装额外的包。

snippet
<?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功能:

snippet
// 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:

snippet
// 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:

snippet
// 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发送短信?

snippet
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。

snippet
// .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以及短信状态报告和错误代码。API没有幂等性请求头,因此请保留返回的消息ID,并在重新发送前检查其状态,以避免重复发送。其余内容请参见错误代码页面。

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

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

对于极高业务量或现有的电信技术栈,SMPP可能比REST更合适;请参阅SMPP与REST的对比。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参考资料和OpenAPI规范。

代码示例取自我们的开发者页面,并已根据已发布的OpenAPI规范进行核对。最后修订日期:2026年9月28日。请参阅我们的编辑标准。

这篇文章对您有帮助吗?

我们如何撰写和审核内容

作者:

BroadNet编辑团队

编辑团队负责发布BroadNet博客。文章由BroadNet的监管事务、产品、工程、行业研究及运营商解决方案团队共同撰写,并根据我们的编辑标准进行审核。

通过电子邮件订阅期刊

每月一篇文章。 仅此而已。

订阅后,每当有新的内容(工程、监管或行业动态)发布时,我们都会第一时间发送给您。没有滴灌式营销,没有产品推销,不会与第三方共享。点击一下即可退订。

我们每月发送一封电子邮件。您可以随时退订。查看我们的 隐私政策.

您将获得的内容
  • 深度长文,拒绝标题党
    针对单一主题,提供六至十一分钟的深度阅读体验。
  • 由一线运营团队撰写
    由内部工程师、监管负责人和产品专家亲自执笔。
  • 立足区域
    关于中东及北非地区监管机构、运营商及通道组合的深度见解。
  • 每月一次
    不进行滴灌式营销。仅在有干货分享时发布文章。
停止阅读,开始交付。

我们所写的大部分内容都源于实战经验。

如果这篇文章引起了您的共鸣,我们或许应该聊聊。请带上您的应用场景、业务量和目标市场——我们将为您提供通道方案、价格体系以及可供您致电咨询的参考客户。

$ curl -X POST https://api.broadnet.me/sms/sendSms