<tt date-time='fdffhbfd'><acronym dir='6s976ee'></acronym></tt>
    <code date-time='fm4djq'></code>

                  1. 文章熱詞:php,阿裏雲短信接口

                    日期:2019-09-09 08:51 by admin 1969 0 收藏
                    我要分享

                    摘要:使用阿裏雲短信API,需要在控制台獲取以下必要參數,其中需要自己手機驗證+官方審核多次,尤其審核需要保持耐心。

                    1. accessKeyId  相當于你的個人賬戶密鑰;

                    2. accessKeySecret 與上是成對的;

                    3. SignName  個人簽名,在發出去的短信中,這個簽名會顯示在開頭,類似 【簽名】親愛的用戶...... 這種格式,SignName需要通過提交審核;

                    4.TemplateCode  模闆代碼,阿裏雲短信是無法完全自定義短信的,需要通過審核的模闆,然後自己再替換掉模闆中的變量,如模闆:“您的驗證碼是${code}” ,code就是變量,使用時需設置變量值{"code":"12345"}(設置變量值的過程在demo中實現),短信發出去後變成:“您的驗證碼是12345”,每個通過審核的模闆會提供一個模闆代碼;

                    最新的阿裏雲短信接口,适用于阿裏大于搬家以後的情況。
                    之前一直用阿裏大于的短信接口,最近上項目時發現阿裏大于悄悄地搬家到了阿裏雲!阿裏雲的SDK文件繁多,看得一頭霧水!下面代碼是最新的可适用于阿裏雲短信服務的類,親測成功!

                    <?php
                    /**
                     * 阿裏雲短信驗證碼發送類
                     * @author Administrator
                     *
                     */
                    class Sms {
                        // 保存錯誤信息
                        public $error;
                        // Access Key ID
                        private $accessKeyId = '';
                        // Access Access Key Secret
                        private $accessKeySecret = '';
                        // 簽名
                        private $signName = '';
                        // 模版ID
                        private $templateCode = '';
                        public function __construct($cofig = array()) {
                            $cofig = array (
                                    'accessKeyId' => 'xxxxxxxxxxx',
                                    'accessKeySecret' => 'xxxxxxxxxx',
                                    'signName' => '你的簽名',
                                    'templateCode' => 'SMS_76510109'
                            );
                            // 配置參數
                            $this->accessKeyId = $cofig ['accessKeyId'];
                            $this->accessKeySecret = $cofig ['accessKeySecret'];
                            $this->signName = $cofig ['signName'];
                            $this->templateCode = $cofig ['templateCode'];
                        }
                        private function percentEncode($string) {
                            $string = urlencode ( $string );
                            $string = preg_replace ( '/\+/', '%20', $string );
                            $string = preg_replace ( '/\*/', '%2A', $string );
                            $string = preg_replace ( '/%7E/', '~', $string );
                            return $string;
                        }
                        /**
                         * 簽名
                         *
                         * @param unknown $parameters            
                         * @param unknown $accessKeySecret            
                         * @return string
                         */
                        private function computeSignature($parameters, $accessKeySecret) {
                            ksort ( $parameters );
                            $canonicalizedQueryString = '';
                            foreach ( $parameters as $key => $value ) {
                                $canonicalizedQueryString .= '&' . $this->percentEncode ( $key ) . '=' . $this->percentEncode ( $value );
                            }
                            $stringToSign = 'GET&%2F&' . $this->percentencode ( substr ( $canonicalizedQueryString, 1 ) );
                            $signature = base64_encode ( hash_hmac ( 'sha1', $stringToSign, $accessKeySecret . '&', true ) );
                            return $signature;
                        }
                        /**
                         * @param unknown $mobile            
                         * @param unknown $verify_code            
                         *
                         */
                        public function send_verify($mobile, $verify_code) {
                            $params = array (   //此處作了修改
                                    'SignName' => $this->signName,
                                    'Format' => 'JSON',
                                    'Version' => '2017-05-25',
                                    'AccessKeyId' => $this->accessKeyId,
                                    'SignatureVersion' => '1.0',
                                    'SignatureMethod' => 'HMAC-SHA1',
                                    'SignatureNonce' => uniqid (),
                                    'Timestamp' => gmdate ( 'Y-m-d\TH:i:s\Z' ),
                                    'Action' => 'SendSms',
                                    'TemplateCode' => $this->templateCode,
                                    'PhoneNumbers' => $mobile,
                                    //'TemplateParam' => '{"code":"' . $verify_code . '"}' 
                                    'TemplateParam' => '{"time":"1234"}'   //更換爲自己的實際模版
                            );
                            //var_dump($params);die;
                            // 計算簽名并把簽名結果加入請求參數
                            $params ['Signature'] = $this->computeSignature ( $params, $this->accessKeySecret );
                            // 發送請求(此處作了修改)
                            //$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params );
                            $url = 'http://dysmsapi.aliyuncs.com/?' . 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 ['Code'] )) {
                                $this->error = $this->getErrorMessage ( $result ['Code'] );
                                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 (
                                    'InvalidDayuStatus.Malformed' => '賬戶短信開通狀态不正确',
                                    'InvalidSignName.Malformed' => '短信簽名不正确或簽名狀态不正确',
                                    'InvalidTemplateCode.MalFormed' => '短信模闆Code不正确或者模闆狀态不正确',
                                    'InvalidRecNum.Malformed' => '目标手機号不正确,單次發送數量不能超過100',
                                    'InvalidParamString.MalFormed' => '短信模闆中變量不是json格式',
                                    'InvalidParamStringTemplate.Malformed' => '短信模闆中變量與模闆内容不匹配',
                                    'InvalidSendSms' => '觸發業務流控',
                                    'InvalidDayu.Malformed' => '變量不能是url,可以将變量固化在模闆中'
                            );
                            if (isset ( $message [$status] )) {
                                return $message [$status];
                            }
                            return $status;
                        }
                    }

                    調用方法:

                    //生成驗證碼
                    $mobile = 'xxxxxxx';
                    $code = rand ( 1000, 9999 );
                    //發送短信
                    $sms = new Sms();
                    //測試模式
                    $status = $sms->send_verify($mobile, $code);
                    if (!$status) {
                      echo $sms->error;
                    }

                    上一篇:你還在用原生的支付API嗎?

                    下一篇:php的鈎子(hook),你有沒有用過?


                    評論

                    -->