PHP腾讯云短信接口

不得不说,官网的文档就是用来装逼的。

接个接口各种问题,强行解释为 签名 及其复杂,用来增加使用第三方的成本

还有调试,在线调试也有问题,有的没的,真的 连必选参数都能弄错

话不多,上代码


 * @time 2022-09-03
 */
date_default_timezone_set("PRC");

class Tx_sms {

    //put your code here
// 参数
    private $uid = ''; //在 云API密钥 上申请的标识身份 SecretId 入口https://console.cloud.tencent.com/capi
    private $pwd = ''; //在 云API密钥 上申请的标识身份 SecretKey 
    private $TemplateID = ''; // 模板 ID,必须填写已审核通过的模板 ID  
    private $SmsSdkAppid = ''; //短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。
    private $post_url = 'https://sms.tencentcloudapi.com/';

    function __construct($templateid = '', $SmsSdkAppid = '') {
        $this->TemplateID = $templateid;
        $this->SmsSdkAppid = $SmsSdkAppid;
    }

    /**
     * 无参数短信发送
     * 注意点:腾讯短信接口 参数空字符不需要传递
     * 测试时,尽量有的没得都试一下
     */
    function send_sms2($mobile = '18520745660') {
        $Timestamp = time();
//        '您好,您在分期乐-京回收的卡券回收订单回收失败,请点击订单查看失败原因!请核对后重新提交!';
        $Nonce = mt_rand(111111, 999999);
        $TemplateParamSet = ''; //模板参数, 比如验证码的 数字
        $Sign = '京回收平台'; //短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名
//        $mobile = '+8618520745660'; //例如:+8610011112222, 其中前面有一个+号 ,86为国家码,
        $data = array(
            'Action' => 'SendSms',
            'PhoneNumberSet.0' => '+86' . $mobile,
            'TemplateID' => $this->TemplateID,
            'Sign' => $Sign,
//    'TemplateParamSet.0' => $TemplateParamSet,
            'SmsSdkAppid' => $this->SmsSdkAppid,
            'Nonce' => $Nonce,
            'Region' => 'ap-guangzhou',
            'SecretId' => $this->uid,
            'Timestamp' => $Timestamp,
//    'SessionContext'=> '您好,您在分期乐-京回收的卡券回收订单回收失败,请点击订单查看失败原因!请核对后重新提交!',
            'Version' => '2019-07-11',
        );
        $qsign = $this->tosign('POST', $data, $this->pwd);
        $data['Signature'] = $qsign;
        $result = $this->_sendRequest($this->post_url, $data, 'POST');
        $result_ary = json_decode($result, true); // json转array
        $req = $result_ary['Response']['SendStatusSet'][0]['Code'];
        if ($req == 'Ok') {
            // 发送成功
            return true;
        } else {
            //记录日志
            require_once dirname(dirname(__FILE__)) . '/ALLClass.php';
            $pub = new ALLClass();
            $pub->data_log($result, __FUNCTION__ . '.log');
        }
        return false;
    }

    /**
     * 参数只有一个或者没有短信发送
     * 注意点:腾讯短信接口 参数空字符不需要传递
     * 测试时,尽量有的没得都试一下
     * @param type $mobile              手机号
     * @param type $TemplateParamSet    模板信息
     * @return boolean                  成功返回boolean true
     */
    function send_sms($mobile = '18520745660', $TemplateParamSet='') {
        $Timestamp = time();
//        '您好,您收的卡券回收订单回收失败,请点击订单查看失败原因!请核对后重新提交!';
        $Nonce = mt_rand(111111, 999999);
//        $TemplateParamSet = ''; //模板参数, 比如验证码的 数字
        $Sign = '京回收平台'; //短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名
//        $mobile = '+8618520745660'; //例如:+8610011112222, 其中前面有一个+号 ,86为国家码,
        $data = array(
            'Action' => 'SendSms',
            'PhoneNumberSet.0' => '+86' . $mobile,
            'TemplateID' => $this->TemplateID,
            'Sign' => $Sign,
            'TemplateParamSet.0' => $TemplateParamSet,
            'SmsSdkAppid' => $this->SmsSdkAppid,
            'Nonce' => $Nonce,
            'Region' => 'ap-guangzhou',
            'SecretId' => $this->uid,
            'Timestamp' => $Timestamp,
//    'SessionContext'=> '您的卡券回收订单回收失败,请点击订单查看失败原因!请核对后重新提交!',
            'Version' => '2019-07-11',
        );
        if(empty($TemplateParamSet)){
            unset($data['TemplateParamSet.0']);
        }
        $qsign = $this->tosign('POST', $data, $this->pwd);
        $data['Signature'] = $qsign;
        $result = $this->_sendRequest($this->post_url, $data, 'POST');
        $result_ary = json_decode($result, true); // json转array
        $req = $result_ary['Response']['SendStatusSet'][0]['Code'];
        if ($req == 'Ok') {
            // 发送成功
            return true;
        } else {
            //记录日志
            require_once dirname(dirname(__FILE__)) . '/ALLClass.php';
            $pub = new ALLClass();
            $pub->data_log($result, __FUNCTION__ . '.log');
        }
        return false;
    }

    function _sendRequest($url, $paramArray, $method = 'POST') {
        $ch = curl_init();
        if ($method == 'POST') {
            $paramArray = is_array($paramArray) ? http_build_query($paramArray, null, '&', PHP_QUERY_RFC3986) : $paramArray;
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $paramArray);
        } else {
            $url .= '?' . http_build_query($paramArray, null, '&', PHP_QUERY_RFC3986);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if (false !== strpos($url, "https")) {
            // 证书
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        $resultStr = curl_exec($ch);
        return $resultStr;
    }

    function tosign($pa, $param, $pwd) {
        ksort($param);
        $signStr = $pa . "sms.tencentcloudapi.com/?";
        foreach ($param as $key => $value) {
            $signStr = $signStr . $key . "=" . $value . "&";
        }
        $signStr = substr($signStr, 0, -1);
        $signature = base64_encode(hash_hmac("sha1", $signStr, $pwd, true));
        return $signature;
    }

    function test() {
        $mobile=$_REQUEST['mobile'];
        var_dump($mobile);
        $this->send_sms($mobile,'test');
    }

}
//$sms=new Tx_sms();
//$sms->test();

调用简单,参数填写正确,直接把最后两行注释干掉,运行文件即可

下面来一首忘记了给诸君的文化瑰宝:

登鹳雀楼

作者:王之涣

白日依山尽,

黄河入海流。

欲穷千里目,

更上一层楼。

转载请注明出处。

你可能感兴趣的:(PHP,第三方,php,短信,腾讯云短信)