ThinkPHP5.1 接入阿里雲簡訊服務 (原大魚最新版) 指導

moTzxx發表於2019-05-09

  • 隨著科技發展的推動,曾經充滿溫馨問候與回憶的簡訊業務,如今絕大多數侷限於 驗證碼傳送詐騙/騷擾資訊業務推送 的使用
  • 而作為一名IT搬磚的碼農,對於第三方服務的接入也是必須掌握的技能,此處介紹一下 ThinkPHP5.1框架下阿里雲簡訊最新版(原大魚)的接入方法

  • 操作環境:
    >PHP版本 :        7.0.2 (如果是低版本,報錯時,可參考附錄解決方案)
    >ThinkPHP版本:    ThinkPHP5.1
    >技能需求:      Composer 安裝依賴

    本文主要針對 簡訊 — 驗證碼 接入,作為指導講解,>>> 官方文件:阿里雲-簡訊服務


①. 前期準備-簡訊使用流程

  • 作為前期準備的重要指引,入駐-認證-開通服務-建立-獲得引數 等在此不做贅述

詳細指導參見:阿里雲簡訊服務文件使用指引

  • 作為ThinkPHP5 超方便的工具,強烈建議使用 Composer,你會發現它的便利與快捷性

執行命令: composer require alibabacloud/client

③. 快速學習(此步驟,跳過也可.)

  • 阿里雲提供了極其方便的線上測試功能,可以通過 快速學習,測試你是否獲取了所有所需的配置資訊

    簡訊服務】——【快速學習】——【OpenAPI Explorer

④. 程式碼實現

  • 注意在整合方法呼叫前,要先進行類的引用
    use AlibabaCloud\Client\AlibabaCloud;
    use AlibabaCloud\Client\Exception\ClientException;
    use AlibabaCloud\Client\Exception\ServerException;
  • 提供整合方法如下:

    /**
     * 整合方法:阿里雲(原大魚)傳送簡訊驗證碼
     * @param string $phoneNumber 目標手機號
     * TODO 注意 accessKeyId、accessSecret、signName、templateCode 重要引數的獲取配置
     */
    public function sendAliDaYuAuthCode($phoneNumber = '151xxxxxxx3')
    {
        $accessKeyId = 'LTAXXXXXXXXXC';
        $accessSecret = '8gfwbXXXXXXXXXXXXXXXXXXXXXXXXXXXXA'; //注意不要有空格
        $signName = 'XXXXX'; //配置簽名
        $templateCode = 'SMS_1XXXXXX5';//配置簡訊模板編號
        //TODO 隨機生成一個6位數
        $authCodeMT = mt_rand(100000,999999);
        //TODO 簡訊模板變數替換JSON串,友情提示:如果JSON中需要帶換行符,請參照標準的JSON協議。
        $jsonTemplateParam = json_encode(['code'=>$authCodeMT]);
    
        AlibabaCloud::accessKeyClient($accessKeyId, $accessSecret)
            ->regionId('cn-hangzhou')
            ->asGlobalClient();
        try {
            $result = AlibabaCloud::rpcRequest()
                ->product('Dysmsapi')
                // ->scheme('https') // https | http
                ->version('2017-05-25')
                ->action('SendSms')
                ->method('POST')
                ->options([
                    'query' => [
                        'RegionId' => 'cn-hangzhou',
                        'PhoneNumbers' => $phoneNumber,//目標手機號
                        'SignName' => $signName,
                        'TemplateCode' => $templateCode,
                        'TemplateParam' => $jsonTemplateParam,
                    ],
                ])
                ->request();
            $opRes = $result->toArray();
            //print_r($opRes);
            if ($opRes && $opRes['Code'] == "OK"){
                //進行Cookie儲存
                cookie("authCodeMT",$authCodeMT,300);
            }
        } catch (ClientException $e) {
            echo $e->getErrorMessage() . PHP_EOL;
        } catch (ServerException $e) {
            echo $e->getErrorMessage() . PHP_EOL;
        }
    }

⑤. 執行效果


①. Ramsey\Uuid\Generator\random_int() 報錯

②. isv.INVALID_JSON_PARAM 報錯的一種情況

  • 如果在測試階段,直接複製了 OpenAPI Explorer 生成的程式碼,有時會因為模板引數的 json 拼合無法識別
    建議,可參考我的程式碼思路,使用 json_encode()進行轉化

③. InvalidAccessKeyId.NotFound

  • 這種提示資訊,只能說明你的 accessKeyId 配置錯誤,注意不要配置成了 簡訊應用中的 AppKey
    過來人,友情提示,請看存放位置:

相關文章