智慧云信

使用C语言调用短信接口发送验证码短信教程

C对接验证码短信接口DEMO示例

圆点

短信验证码几乎是所有 App 和网站注册、登录环节的标配。这篇教程讲怎么用 C 语言通过 HTTP POST 请求调用短信接口,以 https://api.3yit.com/api/send-sms-single 为例,把请求、响应、JSON 解析完整走一遍。

准备工作

动手之前,先确认两件事:一是从接口文档拿到 sp_idpassword(如果接口要求签名算法,也一并准备好);二是装一个能发 HTTP 请求的库,这里用 libcurl。

参数获取

登录智慧云信官网,点击对应的产品,比如「验证码」,在上方选项卡选「开发者」→「HTTP开发文档」,里面能看到具体的 API 方法名和每个参数的 key 与含义。常用参数有这么几个:

  • sp_id:产品编号,6 位数字,唯一标识。
  • mobile:手机号码。
  • content:短信内容,含签名和正文。例如「【智慧云信】您的验证码是456790,请妥善保管」——【智慧云信】是签名(在签名报备里申请),「您的验证码是456790,请妥善保管」是短信模板(在模板报备里申请),都审核通过后才能发送。
  • password:用 SP_ID 密码做 MD5 加密后生成的接口密码(不是登录密码),32 位随机字符串。

发送 HTTP POST 请求

用 libcurl 发送 POST 请求,下面的代码构建并发送了带完整参数的请求:

#include <stdio.h>
#include <curl/curl.h>
// 接收响应数据的回调
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
CURL *curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
curl_easy_setopt(curl, CURLOPT_URL, "https://api.3yit.com/api/send-sms-single");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,
"sp_id=5xxxxx&mobile=176xxxxxxxx&content=%E3%80%90%E7%AD%BE%E5%90%8D%E3%80%91%E9%A2%98%E7%AD%BE%E7%A0%81123&password=xxxxxxxxxxx");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
} else {
printf("Response: %s\n", readBuffer.c_str());
// 解析JSON响应(可用 jansson 或 cJSON)
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}

解析 JSON 响应

C 标准库不带 JSON 解析,需要引入 jansson 或 cJSON。以 jansson 为例:

json_error_t error;
json_t *root = json_loads(json_str.c_str(), 0, &error);
if(!root) {
fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
return;
}
int code = json_integer_value(json_object_get(root, "code"));
const char *msg = json_string_value(json_object_get(root, "msg"));
const char *msg_id = json_string_value(json_object_get(root, "msg_id"));
// 根据 code、msg、msg_id 做相应处理
json_decref(root);

几个容易踩的坑

  • 别硬编码密钥:sp_id 和 password 这类敏感信息不要写死在代码里,从配置文件或环境变量读。
  • 错误处理要到位:请求失败、JSON 解析失败都要有处理逻辑,上面的示例只给了基础框架。
  • 签名算法:如果接口要求签名,按文档实现并在 POST 里带上签名参数。
  • 内容要 URL 编码:content 里可能有空格、引号等特殊字符,传输前用 curl_easy_escape 或手动编码,示例里的 %E3%80%90 就是编码后的结果。
  • 校验响应格式:实际开发中先检查状态码和 Content-Type,确认是预期 JSON 再解析。
  • 依赖用包管理器装:libcurl、jansson 可以用 vcpkg、apt-get 等安装,别忘了在构建系统里配好头文件和库路径。
  • 留日志:开发期用 printf、fprintf 或 log4c 记录请求和响应,出问题好排查。
  • 上线前测试:单测覆盖请求构建和 JSON 解析,再跑集成测试,把成功、失败、超时这些情况都过一遍。
  • 量大再优化:如果短信发送量很大,用连接池复用 HTTP 连接,或上异步 I/O、并发,比一条条串行发高效得多。

其他语言教程:PHP · Java · ASP · ASP.NET(C#) · JSP · Node.js · Delphi · Go · Python · Ruby · Shell · VB · C++。更多信息见短信API接入指南

代码里的 API 地址、账号和密码替换成你自己的就能跑通。如果还没有账号,去智慧云信官网注册一个,注册就能免费测试,验证码、通知、营销短信都支持。

内容可信度说明

作者:智慧云信通信技术团队

技术审核:国际短信与号码检测产品组

最后更新:2026-08-13

适用范围:国际短信、国际验证码短信、国际语音筛单、空号检测、号码实时检测等出海通信与号码检测场景。

本文结合智慧云信平台产品能力、客户接入问题和通道运营经验整理。不同国家/地区的 Sender ID、模板审核、计费方式和合规要求可能变化,实际发送前建议以当前通道审核与项目沟通结果为准。