\App\Support\SmsHttpSmsDriver

通用 HTTP 短信驱动——**唯一短信驱动,一切服务商差异走配置**。

参数模板 sms.http_params(JSON): { "method": "POST", // POST(JSON body)/ GET(query) "auth": "none", // 签名模式:none/basic/aliyun_rpc/tencent_tc3 "phone": "mobile", // 手机号映射字段名 "content": "content", // 内容映射字段名 "sign": "signature", // 签名映射字段名(留空不传) "extra": {"apikey": "k-123", "Action": "SendSms"} // 固定附加参数;值支持占位替换 }

值占位(extra 的值里替换):{phone} 手机号 / {content} 内容 / {sign} 签名 / {var:name} 渲染变量 (发送侧传入的模板变量,如阿里云 TemplateParam 可配 "{"code":"{var:code}"}")。

签名模式(SmsSigner 引擎):

  • none:裸请求(云片/秒嘀等 HTTP 接口型)
  • basic:Basic Auth(access_key/secret)
  • aliyun_rpc:阿里云 RPC 签名(自动附加 Action/Version/签名参数,GET 请求)
  • tencent_tc3:腾讯 TC3 签名(POST JSON body + Authorization 头)

新增服务商 = 站点配置页加通道(URL + 参数模板 + 签名模式 + 凭证),框架零改动、零代码。 成功判定:HTTP 2xx;否则抛 \RuntimeException(响应体进消息)。

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 构造注入 __construct 分区 2 · 发送 send 分区 3 · 内部辅助 fillPlaceholders / assertSafeTarget / inCidr └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
__construct()
send()
No public properties found
No constants found
No protected methods found
No protected properties found
N/A
fillPlaceholders()
assertSafeTarget()
inCidr()
$url
$params
$sign
$accessKey
$accessSecret
N/A

Properties

$url

$url : string

Type

string

$params

$params : array

Type

array

$sign

$sign : string

Type

string

$accessKey

$accessKey : string

Type

string

$accessSecret

$accessSecret : string

Type

string

Methods

__construct()

__construct(string  $url, array  $params, string  $sign, string  $accessKey = '', string  $accessSecret = '') : mixed

Parameters

string $url
array $params
string $sign
string $accessKey
string $accessSecret

Returns

mixed —

send()

send(string  $phone, string  $content, array  $data = []) : void

发送短信。

流程:① 校验接口地址非空 ② SSRF 防护校验目标主机安全 ③ 按参数模板组装载荷(手机号/内容/签名/附加参数占位替换) ④ SmsSigner 按签名模式签出最终 params + headers ⑤ 发起 HTTP 请求 ⑥ 非 2xx 抛 \RuntimeException(响应体进消息)

Parameters

string $phone
string $content
array $data

模板渲染变量(占位/服务商模板参数用)

fillPlaceholders()

fillPlaceholders(string  $value, string  $phone, string  $content, array  $data) : string

占位替换:{phone}/{content}/{sign}/{var:name}(渲染变量)

Parameters

string $value
string $phone
string $content
array $data

Returns

string —

assertSafeTarget()

assertSafeTarget() : ?string

SSRF 防护:解析目标主机并拒绝内网/保留/环回/链路本地地址;返回连接层解析 pin。

白名单 sms.http_allow_internal_hosts(逗号分隔)命中即放行(内网短信网关显式登记)。 失败一律拒绝(fail-closed)。返回 "host:port:ip" 供 curl CURLOPT_RESOLVE 固定解析—— 与本次安全检查同一解析结果直连,消除 DNS 重绑定窗口(非 curl 传输时该 pin 自然降级为不生效)。

Returns

?string —

inCidr()

inCidr(string  $ip, string  $network, int  $prefix) : bool

判断 IP 是否落在 network/prefix CIDR 网段内(IPv4/IPv6 通用位运算)

Parameters

string $ip
string $network
int $prefix

Returns

bool —