星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com

// +----------------------------------------------------------------------

// | ShopXO 国内领先企业级B2C免费开源电商系统

// +----------------------------------------------------------------------

// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: Devil

// +----------------------------------------------------------------------

namespace base;

/**

* 短信驱动

* @author liuyi

* @blog http://ourbrnader.com/

* @version 0.0.1

* @datetime 2020-05-18

*/

class TencentSms

{

// 保存错误信息

public $error;

// Access Key ID

private $accessKeyId = '';

// Access Access Key Secret

private $accessKeySecret = '';

// 签名

private $signName = '';

private $apiHost = "sms.tencentcloudapi.com";

//短信平台返回的原始数据

public $rawData;

/**

* [__construct 构造方法]

* @param [int] $param['interval_time'] [间隔时间(默认30)单位(秒)]

* @param [int] $param['expire_time'] [到期时间(默认30)单位(秒)]

* @param [string] $param['key_prefix'] [验证码种存储前缀key(默认 空)]

* @version 0.0.1

* @datetime 2017-03-07T14:03:02+0800

* @author Devil

* @blog http://gong.gg/

*/

public function __construct()

{

$this->signName = MyC('common_sms_sign');

$this->accessKeyId = MyC('common_sms_apikey');

$this->accessKeySecret = MyC('common_sms_apisecret');

$this->platform_appid = MyC('common_sms_sdk_appid');

}

/**

* 签名

*

* @param unknown $parameters

* @param unknown $accessKeySecret

* @return string

*/

private function computeSignature($host, $payload, $timestamp)

{

$secretId = $this->accessKeyId;

$secretKey = $this->accessKeySecret;

$service = 'sms';

$algorithm = "TC3-HMAC-SHA256";

$httpRequestMethod = 'POST';

$canonicalUri = "/";

$canonicalQueryString = "";

$canonicalHeaders = "content-type:application/json\n" . "host:" . $host . "\n";

$signedHeaders = "content-type;host";

// $payload = json_encode($param,JSON_UNESCAPED_UNICODE);

// echo $payload.PHP_EOL;

$hashedRequestPayload = hash("SHA256", $payload);

$canonicalRequest = $httpRequestMethod . "\n"

. $canonicalUri . "\n"

. $canonicalQueryString . "\n"

. $canonicalHeaders . "\n"

. $signedHeaders . "\n"

. $hashedRequestPayload;

// echo $canonicalRequest.PHP_EOL;

// step 2: build string to sign

$date = gmdate("Y-m-d", $timestamp);

$credentialScope = $date . "/" . $service . "/tc3_request";

$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);

$stringToSign = $algorithm . "\n"

. $timestamp . "\n"

. $credentialScope . "\n"

. $hashedCanonicalRequest;

// echo $stringToSign.PHP_EOL;

// step 3: sign string

$secretDate = hash_hmac("SHA256", $date, "TC3" . $secretKey, true);

$secretService = hash_hmac("SHA256", $service, $secretDate, true);

$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);

$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);

// echo $signature.PHP_EOL;

// step 4: build authorization

$authorization = $algorithm

. " Credential=" . $secretId . "/" . $credentialScope

. ", SignedHeaders=content-type;host, Signature=" . $signature;

// echo $authorization.PHP_EOL;

return $authorization;//返回认证签名

}

/**

* 短信发送

* @param [string] $mobile [手机号码,多个以 英文逗号 , 分割]

* @param [string|array] $code [变量code(单个直接传入 code 即可,多个传入数组)]

* @param [string] $template_code [模板 id]

* @param [boolean] $sign_name [自定义签名,默认使用基础配置的签名]

* @author Devil

* @blog http://gong.gg/

* @version 1.0.0

* @date 2020-04-02

* @desc description

*/

public function SendCode($mobile, $code, $template_code, $sign_name = '')

{

// 签名

$sign_name = empty($sign_name) ? $this->signName : $sign_name;

// 请求参数

$params = array( //此处作了修改

'PhoneNumberSet' => $mobile,

'TemplateID' => $template_code,

'Sign' => $sign_name,

'TemplateParamSet' => $code,

'SessionContext' => '',

'SmsSdkAppid' => $this->platform_appid

);

// 计算签名并把签名结果加入请求参数

$timestamp = time();

$url = 'https://' . $this->apiHost;

$version = '2019-07-11';

$action = "SendSms";

$payload = json_encode($params, JSON_UNESCAPED_UNICODE);

$authorization = $this->computeSignature($this->apiHost, $payload, $timestamp);

$headers = array(

"Authorization:$authorization",

"Content-type:application/json",

"Host:$this->apiHost",

"X-TC-Action:$action",

"X-TC-Version:$version",

"X-TC-Timestamp:$timestamp",

// "X-TC-Region:$region"

);

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);

curl_setopt($curl, CURLOPT_AUTOREFERER, 1);

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);

curl_setopt($curl, CURLOPT_POST, 1);

$result = curl_exec($curl);

curl_close($curl);

if ($result == false) {

$this->error = "访问腾讯云短信服务失败";

} else {

$result = json_decode($result, true);

}

//因为一般业务情况是发给一个人,这里就简单处理为取第一个短信的状态。

//如果是批量的话,需要遍历获得所有的情况,这样的可以另外写一个接口。

$this->rawData = $result;

if (isset($result["Response"]['Error'])) {

$errorCode = $result["Response"]['Error']['Code'];

} else if (isset($result["Response"]["SendStatusSet"][0])) {

$sendStatusItem = $result["Response"]["SendStatusSet"][0];

$errorCode = $sendStatusItem['Code'];

} else {

$errorCode = '';

}

if (strtolower($errorCode) != 'ok') {

$this->error = $this->getErrorMessage($errorCode);

return false;

}

return true;

}

/**

* 获取详细错误信息

*

* @param unknown $status

*/

public function getErrorMessage($status)

{

//查询错误码地址:

//https://cloud.tencent.com/document/product/382/38780

$message = array(

'FailedOperation.ContainSensitiveWord' => '短信内容中含有敏感词',

'FailedOperation.FailResolvePacket' => '请求包解析失败,通常情况下是由于没有遵守 API 接口说明规范导致的',

'FailedOperation.InsufficientBalanceInSmsPackage' => '套餐包余量不足',

'FailedOperation.JsonParseFail' => '解析请求包体时候失败',

'FailedOperation.MarketingSendTimeConstraint' => '营销短信发送时间限制,为避免骚扰用户,营销短信只允许在8点到22点发送。',

'FailedOperation.MissingSignature' => '没有申请签名之前,无法申请模板,请根据 创建签名 申请完成之后再次申请。',

'FailedOperation.PhoneNumberInBlacklist' => '手机号在黑名单库中,通常是用户退订或者命中运营商黑名单导致的,可联系 sms helper 解决。',

'FailedOperation.PhoneNumberOnBlacklist' => '手机号在黑名单库中,通常是用户退订或者命中运营商黑名单导致的,可联系 sms helper 解决。',

'InternalError.RequestTimeException' => '请求发起时间不正常,通常是由于您的服务器时间与腾讯云服务器时间差异超过10分钟导致的,请核对服务器时间及 API 接口中的时间字段是否正常。',

'InternalError.Timeout' => '请求下发短信超时,请参考 60008错误详解。',

'InvalidParameterValue.IncorrectPhoneNumber' => '手机号格式错误,请参考 1016错误详解',

'InvalidParameterValue.ProhibitedUseUrlInTemplateParameter' => '禁止在模板变量中使用 URL。',

'InvalidParameterValue.TemplateParameterFormatError' => '验证码模板参数格式错误,验证码类模版,模版变量只能传入0 - 6位(包括6位)纯数字',

'LimitExceeded.AppDailyLimit' => '业务短信日下发条数超过设定的上限 ,可自行到控制台调整短信频率限制策略。',

'LimitExceeded.DailyLimit' => '短信日下发条数超过设定的上限 (国际/港澳台),如需调整限制,可联系 sms helper。',

'LimitExceeded.DeliveryFrequencyLimit' => '下发短信命中了频率限制策略,可自行到控制台调整短信频率限制策略,如有其他需求请联系 sms helper。',

'LimitExceeded.PhoneNumberCountLimit' => '调用短信发送 API 接口单次提交的手机号个数超过200个',

'LimitExceeded.PhoneNumberDailyLimit' => '单个手机号日下发短信条数超过设定的上限,可自行到控制台调整短信频率限制策略。',

'LimitExceeded.PhoneNumberOneHourLimit' => '单个手机号1小时内下发短信条数超过设定的上限,可自行到控制台调整短信频率限制策略。',

'LimitExceeded.PhoneNumberSameContentDailyLimit' => '单个手机号下发相同内容超过设定的上限,可自行到控制台调整短信频率限制策略。',

'LimitExceeded.PhoneNumberThirtySecondLimit' => '单个手机号30秒内下发短信条数超过设定的上限,可自行到控制台调整短信频率限制策略。',

'MissingParameter.EmptyPhoneNumberSet' => '传入的号码列表为空,请确认您的参数中是否传入号码。',

'UnauthorizedOperation.IndividualUserMarketingSmsPermissionDeny' => '个人用户没有发营销短信的权限',

'UnauthorizedOperation.RequestIpNotInWhitelist' => '请求 IP 不在白名单中,您配置了校验请求来源 IP,但是检测到当前请求 IP 不在配置列表中,',

'UnauthorizedOperation.SerivceSuspendDueToArrears' => '欠费被停止服务,可自行登录腾讯云充值来缴清欠款。',

'ContainDomesticAndInternationalPhoneNumber' => '群发请求里既有国内手机号也有国际手机号。',

'UnsupportedOperation.UnsuportedRegion' => '不支持该地区短信下发。',

);

if (isset ($message [$status])) {

return $message [$status];

}

return '错误状态码:' . $status . ',详细错查询:https://cloud.tencent.com/document/product/382/38780';

}

}

?>

一键复制

编辑

原始数据

按行查看

历史

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中云模型,云模型简介与个人理解matlab程序.doc

.........................专业资料分享随着不确定性研究的深入,越来越多的科学家相信,不确定性是这个世界的魅力所在,只有不确定性本身才是确定的。在众多的不确定性中, HYPERLINK "/view/606111.htm" \t "_blank…

php dns刷新,Windows DNS缓存自动刷新

Windows DNS缓存自动刷新admin • 2018 年 09 月 04 日DNS(域名服务器)DNS(Domain Name Server)是进行域名和与之相对应的ip地址转换的服务器。DNS中保存了一张域名和与之相应的ip地址的表,以解析消息的域名。DNS轮训在统一主机添加多条A记录,这就是DNS轮…

php日期相减函数,倒计时函数_计算两个时间相差值_PHP函数

**PHP倒计时函数、求两个日期时间之间相差的时间函数、计算时差函数_PHP函数笔记**php/*** 求两个日期时间之间相差的时间* (针对1970年1月1日之后,求之前可以采用泰勒公式)* param string $day1 2016-10-01 10:01:08* param string $day2 2020-10-01 10:01:08* ret…

jq上传file到php,jQuery文件上传

插件描述:这是一个文件上传的展示,看很多插件,并不满意就自己写了一个,可能兼容性不是很好,没有准确进行测试过,还请各位不吝赐教更新时间:2019/3/25 下午8:53:17更新说明:修复上传成…

oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解

hibernate配合oracle自动生成主键策略有两种方法:A)设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的…

oracle找到表的位置,查看Oracle表中的指定记录在数据文件中的位置

查看Oracle表中的指定记录位置select rowid,user_id from sshr.xx_user where user_id3010586select rowid,dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_num…

oracle异常抛出,ORACLE 存储过程异常捕获并抛出

for tab_name in tables loopexecute immediate drop table ||tab_name; --此处可能会报错end loop;当前情况是,循环表,进行删除,如果出现表不存在,则会异常中断,导致整个存储过程挂掉,需求是要能跳过错误的…

oracle的主目录怎么删除,删除oracle数据库卸载

oracle 10g在win上卸载软件环境1 、Windows XPOracle 10g2、 Oracle安装路径为 d:\Oracle实现方法1 、开始—设置—控制面板—管理工具—服务停止所有 Oracle服务;Or acleUfiCQiisoXeorcl 名称 I细I好I启动类型I aat为ffetwork Frov-isi. 「, 巴SOrae le StrTice…

oracle数据库相关知识,Oracle数据库相关知识点复习

一.Oracle数据库中常用的数据类型varchar2(长度)可变长字符串char(长度)定长number()表示整数或者浮点数number(8) number(8,2)clog字符的大对象blog二进制的大对象二.数据库查询1)SELECT语句从表中提取查询数据.语法为SELECT [DISTINCT] {column1,column2,…} FROM tablename …

Linux中批量创建空白文件,在Linux中批量创建和修改文件或目录

1. 用一条命令直接创建[fredRoyalmile Auto_Ops]$ touch seq 10[fredRoyalmile Auto_Ops]$ ls1 10 2 3 4 5 6 7 8 9[fredRoyalmile Auto_Ops]$ touch linux-{A..G}[fredRoyalmile Auto_Ops]$ lslinux-A linux-B linux-C linux-D linux-E linux-F linux-G[fredRo…

linux查看cpu占用最多的进程,Linux下查看占用CPU资源最多的几个进程

BPM SharePoint解决方案分享一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...nodejs字符与字节之间的转换new Buffer("Hello W…

linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决

。函数原型如下:2.4 内核int request_irq (unsignedintirq,void (*handler)(int,void*,structpt_regs*),unsignedlongfrags,constchar*device,void*dev_id);2.6 内核request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev);参…

linux缓存文件用户权限错误,Laravel运行缓存权限问题

Laravel 开发中遇到权限问题 failed to open stream: Permission denied错误现象:messg:"file_put_contents(.../storage/framework/cache/data/03/8c/03xxxxxx):failed to open stream: Permission denied"status: 500经过搜索发现网络上大量的解决方案是…

linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法

UNDO表空间下的数据文件被误删除后的处理方法:操作前备份数据库,以避免更大的损失。思路:1、把误删除的数据文件offline2、正常打开数据库后创建新的UNDO表空间及数据文件3、修改相应参数指向新的UNDO表空间4、重新启动数据库验证5、删除旧的…

linux内核有ebpf吗,聊聊很重要的内核技术eBPF

在2018年的 Linux Plumber 大会上,eBPF成了亮点,有24个议题提到了 eBPF,可以预计eBPF会成为一大技术热点。eBPF(Extended Berkeley Packet Filter) 的核心是驻留在 kernel 的高效虚拟机。最初的目的是高效网络过滤框架,前身是 BPF…

linux 访问日志ip排序,Linux通过日志文件统计IP访问次数排序

假设我的日志文件内容如下:218.92.217.53 - - [22/Nov/2017:17:26:27 0800] "GET /images/rand HTTP/1.0" 200 1785 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC…

Linux系统自动备份脚本,供参考的Linux系统中自动执行分段备份脚本

供参考的Linux系统中自动执行分段备份脚本发布时间:2014-04-21 15:49:00来源:红联作者:tioced以下脚本仅做学习参考,需加到/etc/crontab文件,每天执行一次的脚本自动执行分段备份/www/users下的网页文件夹。[code]#!/usr/bin/perl$all_day date;chdir &…

linux+last命令菜鸟,Linux基本命令。。。菜鸟保留

以下命令都是以root身份输入的1.从图形界面进入问文本界面:init 32.从文本界面进入图形界面:startx3.从普通用户进入root用户:su4.进入文件夹:cd /文件路径5.返回上一个文件夹:cd ..6.查看当前位置的文件以及文件夹&am…

嵌入式linux tftp rpm,嵌入式linux的tftp配置

tftp是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。嵌入式linux的 tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为u- boot本身内置支持tftp-client,所以嵌…

oom linux 导致ssh,Linux OOM

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?某个机器看到一条日志:Out of Memory: Kill process xxx (xxx) score 707 or sacrifice child并且syslog, ssh等进程都被kill掉了.简单了解了下OOM(Out of Memory)…