2024.11.08 升级,版本升级至3.0,SDK更换为腾讯云短信子集,重写代码
2020.08.13 升级,版本升级至2.0.1,SDK升级至3.0.232
2020.06.30 升级,版本升级至2.0,采用全新SDK 3.0
2019.09.20 升级,新增对国际/港澳台短信的支持。
2019.08.02 升级,新增对多个签名或模板的支持。
2019.07.21 升级,新增自动生成验证码功能,调用时code设置为0或空即可,具体参见插件目录下README.md文件。
本插件为腾讯云短信通用版,支持国内、国际/港澳台短信发送。3.0版更换为腾讯云SDK短信专用版。由于使用了PHP新特性,因此PHP版本最低要求为7.1。
另外需要说明的是,腾讯云短信会有诸多的规范,例如群发短信一次不得超过200条,因此使用本插件之前,请熟知相关规范。
为了能够正常使用本插件,在使用之前,你需要开通腾讯云短信,并准备好各项参数。每个参数的获取和注意事项,请仔细查阅腾讯云短信的相关说明,相关概念请参阅 常用概念。
请确认你已经开通了腾讯云短信服务,如未开通,请参见 腾讯短信文档 。
国内短信,需要先购买短信套餐包,国内短信套餐包购买 ,国际/港澳台短信目前使用后付费方式,请确保腾讯云账号内有充足的余额。
请在 【访问管理控制台】 >【 API密钥管理 】页面获取 SecretID 和 SecretKey。
SecretID 用于标识 API 调用者的身份。
SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥 SecretID和SecretKey非常重要,需妥善保管,避免泄露。
国内短信需要短信签名,请在短信签名处申请。国际/港澳台短信不强制要求,可有可无。
创建短信模板,转至国内短信创建, 国际/港澳台短信模板请转至国际/港澳台短信,并获取模板ID。
国内短信需要创建应用,请创建应用并获取SDK AppID。国际/港澳台短信无此选项。
国际/港澳台短信SenderID,可选,请参考国际/港澳台短信 Sender ID 说明
国际/港澳台短信还需获知相应国家的电话国际区号。
Tips: 创建模板时请仔细阅读费用说明,超过固定字数短信将被拆分为2条发送,费用也是收取2条。设计模板时要将变量参数考虑进去。
Tips: 本插件依赖腾讯云短信SDK 3.0。虽然插件会自动判断并安装该依赖包,但安装路径默认为插件所在文件夹。所以如果你想统一管理依赖,不希望依赖包安装在插件文件夹下,或者还需要在其它地方用到该SDK,那么请在安装插件之前,提前安装好依赖。
安装方法:
composer require tencentcloud/sms
特别说明: 由于安装包内文件比较多,有时可能会解压超时导致安装失败,此时可将data文件夹下的安装包手动解压至插件根目录下,即crazy_sms_tencent下,再次安装即可。
将本插件复制到public\plugins
文件夹下。
进入ThinkCMF后台管理,左侧菜单中找到并点开【应用中心】->【插件管理】,在右侧找到【腾讯云短信插件】,点击+按钮,提示成功表示正确安装。 如果安装失败,及有可能是因为你的ThinkCMF版本为5.0.x,并且没有安装腾讯云SDK,请手动安装。
Tips: 如果是5.1以上版本安装失败,则有可能是插件目录没有写入权限,可以手动解压
data\tencentCloudSms.zip
至插件目录:public\plugins\crazy_sms_tencent
下,再安装。
在上述界面安装成功后,点击插件列表右侧操作栏中的“设置”按钮,会弹出设置界面,将相关参数填好保存即可。
SecretId与SecretKey为腾讯云账户密钥对,如果按腾讯建议存放于系统环境变量中,则变量名必须为:TENCENTCLOUD_SECRET_ID
和 TENCENTCLOUD_SECRET_KEY
。本插件优先从环境变量中读取该参数。
在需要使用腾讯云短信的地方,调用ThinkCMF钩子。本插件使用的是系统钩子:send_mobile_verification_code
。例如:
// 基本使用$params = [ 'phoneNumbers' => ['13900000000'], // 必填,接收短信电话号码,数组。 'templateParam' => ['341098', '5'] // 选填,如果模板中有变量,请严格按模板设置顺序准备。];// 调用钩子并获取返回结果$result = hook_one('send_mobile_verification_code', $params);// 对结果进行判断处理if (empty($result['error'])) { // 验证码发送正确的逻辑}
所有参数的键值大小写敏感
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
phoneNumbers | array | 是 | 手机号码,无论是单个号码,还是多个号码,都必须使用数组。 |
secretId | string | 否 | 云账户SecretId,默认使用后台设置。 |
secretKey | string | 否 | 云账户SecretKey,默认使用后台设置。 |
appID | string | 否 | 应用ID,默认使用后台设置。 |
templateParam | array | 否 | 模板参数,请务必按模板变量顺序排列。 |
templateId | string | 否 | 模板id,默认使用后台设置。 |
signName | string | 否 | 短信签名,默认使用后台设置。国内短信必填。 |
nationCode | string | 否 | 电话国际码,默认使用后台设置,为中国(86) |
region | string | 否 | 产品地域,默认使用后台设置 |
senderId | string | 否 | 国际/港澳台短信选填,国内短信填空 |
sessionContext | string | 否 | 用户的 session 内容,在返回结果中会原样返回,防止调用过程中丢失某些信息时使用 |
本示例使用所有参数,以国际短信为例展示使用方法。实际开发中,仅在与后台设置不一致时,才会添加相应的参数。例如短信有多个模板,而默认的模板却只能有一个,调用其它模板时需要指定 templateId
参数。
$params = [ 'phoneNumbers' => ['543891098', '569721146'], // 多个电话号码 'templateId' => '1400000084', // 通常是14开头的 'templateParams' => ['参数一', '参数二', '参数三'], // 多个模板参数 'signName' => '某公司通知短信', // 短信签名 'nationCode' => '971', // 国际区号 'senderId' => 'Company Name', // 国际/港澳台短信 senderid,我也没见过,瞎写一个吧 'secretId' => getenv('TENCENTCLOUD_SECRET_ID'), // 从环境变量中获取 'secretKey' => config('app.secretKey'), // 从应用配置中获取 'appID' => '1400787878', // 其它方式指定 'sessionContext' => '{lang: "en"}', // 需要保留的session内容,防止页面跳转丢失 'region' => 'ap-guangzhou' // 指定广州服务器];// 调用插件并获取结果$result = hook_one('send_mobile_verification_code', $params);// 对结果进行处理if (empty($result['error'])) { // 发送成功,进行处理} else { // 发送失败,$result通常为['error' => 1, 'message' => '错误信息'] }
如果没有安装插件,或者插件安装不正确,返回结果为false
。
插件执行正常,返回结果为数组。数组键值包含error
与message
。如果error值为 0 表示正常,为 1 表示错误。message包含信息。
Tips: 成功发送请求后,返回结果
error
的值为 0,但并不能表示短信发送成功!还需要对返回结果进行处理。因为返回结果包含很多信息,因此作者不能简化处理,而是将结果的json字符串原样输出到message
中,开发人员需要自行处理。例如判断结果中的Code
字段是否为'Ok'。
// 发生普通错误时返回 // error为错误码,message为错误内容 ['error' => 1, 'message' => '没有提供手机号']
// 成功时返回Json字符串
{ "SendStatusSet": [ { "SerialNo": "d09c1bf9-dcce-4f0b-9233-64a631b51cc2", "PhoneNumber": "+971543230000", "Fee": 2, "SessionContext": "", "Code": "Ok", "Message": "send success", "IsoCode": "AE" } ], "RequestId": "0506d2cf-1190-4a23-a260-bab1ee93e6d7"}
如果是多个手机号,则SendStatusSet
数组中为多个对象。
另外,返回值也用可能是失败信息,如:
{ "SendStatusSet": [ { "SerialNo": "", "PhoneNumber": "+8613900000000", "Fee": 0, "SessionContext": "", "Code": "LimitExceeded.PhoneNumberOneHourLimit", "Message": "the number of sms messages sent from a single mobile number within 1 hour exceeds the upper limit", "IsoCode": "CN" } ], "RequestId": "6768c8d7-8722-4e60-9d1f-33e077abd9f4"}
结果说明:
参数 | 类型 | 说明 |
---|---|---|
SendStatusSet | array | 发送结果状态集,二维数组,包括每个手机号发送的结果 |
RequestId | string | 本次请求的id |
结果集说明:
参数 | 类型 | 说明 |
---|---|---|
SerialNo | string | 系列号,表示每个手机的发送序列 |
PhoneNumber | string | e.164 标准的手机号码 |
Fee | int | 本次发送消耗的短信数指标,过长的短信会被拆分,因此可能会大于1 |
SessionContext | string | 发送时附带的session信息,原样返回 |
Code | string | 返回状态码,成功为Ok ,失败时为腾讯SDK错误码 |
Message | string | 状态信息,成功时为send success,失败时为对应的错误消息 |
IsoCode | string | 接收短信的地区码,中国为CN
|
如果需要错误码的详细信息,请参阅腾讯云API文档
2024.11.08
更换SDK包为腾讯云短信专用包,版本3.0.1159,为腾讯云SDK的子集
重构代码,使用了PHP新特性,PHP版本最低要求为7.1
不再区分验证码短信与通知短信,使用更方便
测试了最新的国内、国际短信,更新了返回结果说明
2020.08.13
升级腾讯SDK包为Tencent Cloud SDK 3.0.232
修复出错时,返回结果不正确的bug
2020.06.30
升级腾讯SDK包为Tencent Cloud SDK 3.0.199
更新系统设置方式和提示信息内容
全新的使用方式,更加灵活
2019.09.20
新增对国际电话的支持
2019.08.02
新增对多模板及签名的支持
2019.07.21
新增自动生成短信验证码功能
重构服务层逻辑,优化代码
2019.07.16 正式版发布!
内置腾讯短信官方SDK,不必单独安装。
如果需要请联系作者:crazys@126.com
或者微信:
ThinkCMF模板插件交流群:550851374 ,领取阿里云1000通用代金券