Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

腾讯云短信

Feature: sms-tencent

📖 官方文档:https://cloud.tencent.com/document/product/382/55981

纯 Rust 实现,通过腾讯云 SMS API 直接发送短信,不依赖第三方 SDK。

config.toml 配置

[sms_tencent]
secret_id = "your-secret-id"
secret_key = "your-secret-key"
sdk_app_id = "1400000000"    # 短信 SdkAppId
sign_name = "你的签名"        # 默认短信签名
template_id = "123456"        # 默认验证码模板 ID

API

SmsTencent

方法参数返回说明
new-SmsTencent创建空实例
sendphone_numbers[], sign_name?, template_id?, template_params?Result<TencentSmsResponse>发送短信(通用)
send_codephone_number, code, expire_minutes?Result<TencentSmsResponse>发送验证码短信
send_templatephone_numbers[], sign_name, template_id, template_params[]Result<TencentSmsResponse>发送自定义模板短信

TencentSmsResponse

字段类型说明
request_idString请求 ID
send_status_setVec<SendStatus>每个手机号的发送状态

SendStatus

字段类型说明
serial_noString发送流水号
phone_numberString手机号
feeu32计费条数
codeString状态码,"Ok" 表示成功
messageString状态描述
iso_codeString国家码

使用示例

#![allow(unused)]
fn main() {
// 发送验证码(使用 config.toml 中的默认签名和模板)
let resp = state.sms_tencent.send_code("13800138000", "1234", Some("5")).await?;

// 发送自定义模板
let resp = state
    .sms_tencent
    .send_template(
        &["13800138000"],
        "你的签名",
        "123456",
        vec!["张三", "20250101"],
    )
    .await?;

// 批量发送
let resp = state
    .sms_tencent
    .send(
        &["13800138000", "13900139000"],
        None,
        None,
        Some(vec!["5678"]),
    )
    .await?;
}

签名机制

使用腾讯云 TC3-HMAC-SHA256 签名,纯 Rust 实现。与 COS 模块使用相同的签名模式。

回执回调

启用 sms-tencent feature 后,框架会自动在 config.tomlsms_tencent.callback_path(默认 sms/tencent/report)注册 POST 路由,用于接收腾讯云推送的短信回执报告。

配置

[sms_tencent]
callback_path = "sms/tencent/report"  # 可选,默认值如左

注册回调

#![allow(unused)]
fn main() {
use afaster::SmsTencent;
use afaster::state::smstencent::{TencentSmsReport, TencentSmsCallbackResult};

let app = AFaster::new()
    .with_sms_tencent(|tencent| {
        tencent.with_report_callback(|(state, reports): (AppState, Vec<TencentSmsReport>)| {
            async move {
                for report in reports {
                    if report.report_status == "SUCCESS" {
                        tracing::info!(phone = %report.mobile, "短信送达");
                    } else {
                        tracing::warn!(phone = %report.mobile, err = %report.errmsg, "短信未送达");
                    }
                }
                Ok(TencentSmsCallbackResult::ok())
            }
        })
    })
    .run()
    .await;
}

注意:未注册回调时,回执报告会被静默丢弃并返回成功(避免云平台重试),开启 log feature 会打印 debug 日志。

TencentSmsReport 字段

字段类型说明
user_receive_timeString用户实际接收时间
nationcodeString国家码
mobileString手机号
report_statusString送达状态:SUCCESS / FAIL
errmsgString错误信息
descriptionString状态描述
sidString发送标识 ID
extString用户 session 内容

错误码

错误码English中文
41101SMS credentials not configured短信凭证未配置
51102HMAC-SHA256 init failedHMAC-SHA256 初始化失败
51103Tencent SMS request failed腾讯云短信请求失败
51104Tencent SMS response parse failed腾讯云短信响应解析失败
51105Tencent SMS API error腾讯云短信 API 返回错误
51107SMS report callback not registered短信回执回调未注册