Heim  >  Artikel  >  Backend-Entwicklung  >  Die neueste Alibaba Cloud SMS-Serviceschnittstellenklasse [Persönlicher Test erfolgreich]

Die neueste Alibaba Cloud SMS-Serviceschnittstellenklasse [Persönlicher Test erfolgreich]

PHP中文网
PHP中文网Original
2018-05-29 17:37:066930Durchsuche

Die neueste Alibaba Cloud SMS-Schnittstelle ist für die Situation nach dem Umzug von Alibaba geeignet.
Ich habe die SMS-Schnittstelle von Alibaba Cloud bereits verwendet. Als ich kürzlich an einem Projekt arbeitete, entdeckte ich, dass Alibaba Cloud stillschweigend auf Alibaba Cloud umgestiegen ist! Alibaba Cloud hat so viele SDK-Dateien, dass es verwirrend ist! Der folgende Code ist die neueste Klasse, die für den Alibaba Cloud SMS-Dienst gilt. Der persönliche Test war erfolgreich!
Ein Master hat den Code schon einmal veröffentlicht, aber nach dem Testen wird er zurückkommen: „Die SMS-Schnittstelle gibt den Fehlercode zurück: InvalidDayuStatus.Malformed, der SMS-Aktivierungsstatus des Kontos ist falsch“! (Nach dem Testen eignet sich dieser Code für Alibaba-Schnittstellen, jedoch nicht für den SMS-Dienst in der neuesten Alibaba Cloud-Konsole)
Nach detaillierter Überprüfung der SDK-Einführung Linkadresse :
"Sie Nun, es gibt derzeit kein SDK für andere Sprachen. Wir arbeiten hart daran, es zu aktualisieren. Das SDK hilft nur beim Zusammenfügen der HTTP-Anfrage und beim Parsen der Antwortnachricht. Sie können die HTTP-Anforderungsschnittstelle selbst verbinden. Es handelt sich lediglich um einen HTTP-Anforderungsaufruf ohne Sprachbeschränkungen. Um HTTP-Anforderungen zu verbinden, klicken Sie bitte auf den Link oben oder auf den Quellcode im SDK: Klicken Sie darauf zum Herunterladen

Ändern Sie den obigen Mastercode (hauptsächlich die eingehenden Parameter und das Gateway) wie folgt, erfolgreich

<?php
/**
 * 阿里云短信验证码发送类
 * @author Administrator
 *
 */
class Sms {
    // 保存错误信息
    public $error;
    // Access Key ID
    private $accessKeyId = &#39;&#39;;
    // Access Access Key Secret
    private $accessKeySecret = &#39;&#39;;
    // 签名
    private $signName = &#39;&#39;;
    // 模版ID
    private $templateCode = &#39;&#39;;
    public function __construct($cofig = array()) {
        $cofig = array (
                &#39;accessKeyId&#39; => &#39;xxxxxxxxxxx&#39;,
                &#39;accessKeySecret&#39; => &#39;xxxxxxxxxx&#39;,
                &#39;signName&#39; => &#39;你的签名&#39;,
                &#39;templateCode&#39; => &#39;SMS_76510109&#39; 
        );
        // 配置参数
        $this->accessKeyId = $cofig [&#39;accessKeyId&#39;];
        $this->accessKeySecret = $cofig [&#39;accessKeySecret&#39;];
        $this->signName = $cofig [&#39;signName&#39;];
        $this->templateCode = $cofig [&#39;templateCode&#39;];
    }
    private function percentEncode($string) {
        $string = urlencode ( $string );
        $string = preg_replace ( &#39;/\+/&#39;, &#39;%20&#39;, $string );
        $string = preg_replace ( &#39;/\*/&#39;, &#39;%2A&#39;, $string );
        $string = preg_replace ( &#39;/%7E/&#39;, &#39;~&#39;, $string );
        return $string;
    }
    /**
     * 签名
     *
     * @param unknown $parameters            
     * @param unknown $accessKeySecret            
     * @return string
     */
    private function computeSignature($parameters, $accessKeySecret) {
        ksort ( $parameters );
        $canonicalizedQueryString = &#39;&#39;;
        foreach ( $parameters as $key => $value ) {
            $canonicalizedQueryString .= &#39;&&#39; . $this->percentEncode ( $key ) . &#39;=&#39; . $this->percentEncode ( $value );
        }
        $stringToSign = &#39;GET&%2F&&#39; . $this->percentencode ( substr ( $canonicalizedQueryString, 1 ) );
        $signature = base64_encode ( hash_hmac ( &#39;sha1&#39;, $stringToSign, $accessKeySecret . &#39;&&#39;, true ) );
        return $signature;
    }
    /**
     * @param unknown $mobile            
     * @param unknown $verify_code            
     *
     */
    public function send_verify($mobile, $verify_code) {
        $params = array (   //此处作了修改
                &#39;SignName&#39; => $this->signName,
                &#39;Format&#39; => &#39;JSON&#39;,
                &#39;Version&#39; => &#39;2017-05-25&#39;,
                &#39;AccessKeyId&#39; => $this->accessKeyId,
                &#39;SignatureVersion&#39; => &#39;1.0&#39;,
                &#39;SignatureMethod&#39; => &#39;HMAC-SHA1&#39;,
                &#39;SignatureNonce&#39; => uniqid (),
                &#39;Timestamp&#39; => gmdate ( &#39;Y-m-d\TH:i:s\Z&#39; ),
                &#39;Action&#39; => &#39;SendSms&#39;,
                &#39;TemplateCode&#39; => $this->templateCode,
                &#39;PhoneNumbers&#39; => $mobile,
                //&#39;TemplateParam&#39; => &#39;{"code":"&#39; . $verify_code . &#39;"}&#39; 
                &#39;TemplateParam&#39; => &#39;{"time":"1234"}&#39;   //更换为自己的实际模版
        );
        //var_dump($params);die;
        // 计算签名并把签名结果加入请求参数
        $params [&#39;Signature&#39;] = $this->computeSignature ( $params, $this->accessKeySecret );
        // 发送请求(此处作了修改)
        //$url = &#39;https://sms.aliyuncs.com/?&#39; . http_build_query ( $params );
        $url = &#39;http://dysmsapi.aliyuncs.com/?&#39; . http_build_query ( $params );
        
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_URL, $url );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 );
        $result = curl_exec ( $ch );
        curl_close ( $ch );
        $result = json_decode ( $result, true );
        //var_dump($result);die;
        if (isset ( $result [&#39;Code&#39;] )) {
            $this->error = $this->getErrorMessage ( $result [&#39;Code&#39;] );
            return false;
        }
        return true;
    }
    /**
     * 获取详细错误信息
     *
     * @param unknown $status            
     */
    public function getErrorMessage($status) {
        // 阿里云的短信 乱八七糟的(其实是用的阿里大于)
        // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450
        $message = array (
                &#39;InvalidDayuStatus.Malformed&#39; => &#39;账户短信开通状态不正确&#39;,
                &#39;InvalidSignName.Malformed&#39; => &#39;短信签名不正确或签名状态不正确&#39;,
                &#39;InvalidTemplateCode.MalFormed&#39; => &#39;短信模板Code不正确或者模板状态不正确&#39;,
                &#39;InvalidRecNum.Malformed&#39; => &#39;目标手机号不正确,单次发送数量不能超过100&#39;,
                &#39;InvalidParamString.MalFormed&#39; => &#39;短信模板中变量不是json格式&#39;,
                &#39;InvalidParamStringTemplate.Malformed&#39; => &#39;短信模板中变量与模板内容不匹配&#39;,
                &#39;InvalidSendSms&#39; => &#39;触发业务流控&#39;,
                &#39;InvalidDayu.Malformed&#39; => &#39;变量不能是url,可以将变量固化在模板中&#39; 
        );
        if (isset ( $message [$status] )) {
            return $message [$status];
        }
        return $status;
    }
}

Der Aufrufcode lautet wie folgt:

  //生成验证码
    $mobile = &#39;xxxxxxx&#39;;
    $code = rand ( 1000, 9999 );
    //发送短信
    $sms = new Sms();
        
    //测试模式
    $status = $sms->send_verify($mobile, $code);
        
    if (!$status) {
        echo $sms->error;
    }
//看你这个封装的复杂些,不知道用的是不是同一个短信接口。
//上周有个客户用的是阿里大于的短信接口,看api文档,只要这么写就行了。
<?php
$c = new TopClient;
$c->appkey = $appkey;
$c->secretKey = $secret;
$req = new AlibabaAliqinFcSmsNumSendRequest;
$req->setExtend("123456");
$req->setSmsType("normal");
$req->setSmsFreeSignName("阿里大于");
$req->setSmsParam("{\"code\":\"1234\",\"product\":\"alidayu\"}");
$req->setRecNum("13000000000");
$req->setSmsTemplateCode("SMS_585014");
$resp = $c->execute($req);
?>

Das obige ist der detaillierte Inhalt vonDie neueste Alibaba Cloud SMS-Serviceschnittstellenklasse [Persönlicher Test erfolgreich]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn