天天看點

laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務

       花了兩天時間搞懂了着這幾個平台的短信服務,受益于超哥的easysms,調用短信接口變得很友善,是以在調用短信接口之前,有必要先了解一下easysms:https://github.com/overtrue/easy-sms ,本文以發送驗證碼為例:

首先,需要安裝easysms,執行指令:composer require "overtrue/easy-sms"

然後,建立配置檔案并添加内容:1、建立檔案:執行”touch config/easysms.php“或直接在項目的config目錄下建立easysms.php檔案;2、添加内容:

然後在 easysms.php 檔案内 添加以下内容:

<?php
return [
    // HTTP 請求的逾時時間(秒)
    'timeout' => 5.0,

    // 預設發送配置
    'default' => [
        // 網關調用政策,預設:順序調用
        'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

        // 預設可用的發送網關
        'gateways' => [
            'yunpian','luosimao','aliyun'
        ],
    ],
    // 可用的網關配置
    'gateways' => [
        'errorlog' => [
            'file' => '/tmp/easy-sms.log',
        ],
        'yunpian' => [
            'api_key' => env('YUNPIAN_API_KEY'),
            'sign_name' =>env('YUNPIAN_SIGN_NAME'),
        ],
        'aliyun' => [
            'access_key_id' => env('ALIYUN_ACCESS_KEY_ID'),
            'access_key_secret' => env('ALIYUN_ACCESS_KEY_SECRET'),
            'sign_name' => env('ALIYUN_SIGN_NAME'),
        ],
        //luosimao 沒有sign_name屬性,且簽名要放在content最後面
        'luosimao' =>[
            'api_key' => env('LUOSIMAO_API_KEY'),
        ],
    ],
];
           

接着,先别管env()中的内容,1、建立一個EasySmsServiceProvider:在項目根目錄下執行”php artisan make:provider EasySmsServiceProvider“,或直接在/app/Providers/下建立。2、添加内容:

<?php

namespace App\Providers;

use Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;

class EasySmsServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(EasySms::class, function ($app) {
            return new EasySms(config('easysms'));
        });

        $this->app->alias(EasySms::class, 'easysms');
    }
}
           

最後,再将建立的EasySmsServiceProvider添加到config/app.php 的 providers中:

<?php

use App\Service\CIEnv;

$env = CIEnv::ENV();

return [
 'providers' => [
    App\Providers\EasySmsServiceProvider::class,
    ],
];
           

至此,easysms的配置已基本完成,下面需要做的就是到短信服務提供商處擷取‘api_key’、‘sign_name’、‘access_key_id’、‘access_key_secret’等,并将其寫入項目的.env檔案。

我們再來看一下easysms的說明檔案,

阿裡雲

短信内容使用 

template

 + 

data

'aliyun' => [
        'access_key_id' => '',
        'access_key_secret' => '',
        'sign_name' => '',
    ],
           

雲片

短信内容使用 

content

'yunpian' => [
        'api_key' => '',
        'signature' => '【預設簽名】', // 内容中無簽名時使用
    ],
           

螺絲帽

短信内容使用 

content

'luosimao' => [
        'api_key' => '',
    ],
           

按照需求,1、首先要去阿裡雲擷取‘access_key_id’,‘access_key_secret’,‘sign_name’,‘template’(後面要用)。

阿裡雲->控制台(要登入)->産品與服務->雲通信->短信服務,選擇開通服務,

laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務
laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務

至此已獲得後兩個參數

laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務
laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務
laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務

在這裡生成‘access_key_id’,‘access_key_secret’。這樣就獲得了aliyun所需要的四個參數。

2、螺絲帽,需要api_key和‘簽名’

首先,新增賬號(不多說),點選觸發管理->顯示API KEY,可以擷取到api_key。然後點選簽名管理->添加新簽名

laravel5.1 使用easysms調用yunpian、aliyun、luosimao的短信服務

至此,螺絲帽所需參數也已擷取齊全。

3、雲片,需要api_key,sign_name(即簽名)

擷取方式類似螺絲帽,不贅述。

           好了,到現在為止,我們需要從短信服務商處擷取的資料都已擷取到,接下來我們需要将其填入我們的項目中。

打開.env檔案:

# 雲片
YUNPIAN_API_KEY=89aac1**********************afcc
YUNPIAN_SIGN_NAME=【**社群】
#阿裡雲
ALIYUN_ACCESS_KEY_ID=LTAIy******SY9KV
ALIYUN_ACCESS_KEY_SECRET=w00L0*******************MfiRo
ALIYUN_SIGN_NAME=**的個人部落格
#螺絲帽
LUOSIMAO_API_KEY=35ff0********************401a6f1
           

将資訊填入,注意,就簽名而言,螺絲帽的簽名寫在‘content’的末尾,且沒有‘sign_name’屬性;雲片寫在‘content’的開頭,但有‘sign_name’屬性(content和sign_name隻要寫一個);阿裡雲隻需在.env中配置,不需要填寫。

下面展示部分控制器代碼:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\BaseController;
use Overtrue\EasySms\EasySms;

class VerificationCodesController extends BaseController
{
    public function store(Request $request, EasySms $easySms)
    {    
        $phone = $request->phone_number;
        //擷取驗證碼
        $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
        //設定類型
        $type = '***';
        try {
            $result = $easySms->send($phone, [
                'content'  =>  "您的驗證碼是 {$code}(有效期10分鐘,如非本人操作,請忽略)",
                'template' => 'SMS_151***021',
                'data' => [
                    'code' => $code,
                ],
            ], [$type]);
        } catch (\GuzzleHttp\Exception\ClientException $exception) {
            $response = $exception->getResponse();
            $result = json_decode($response->getBody()->getContents(), true);
        }

    }
}
           

在代碼中,send()方法裡面第二個參數數組:雲片和螺絲帽隻需保留content部分,

1、雲片:

$result = $easySms->send($phone, [
                'content'  =>  "【**社群】您的驗證碼是 {$code}(有效期10分鐘,如非本人操作,請忽略)",//簽名如果在網關配置中寫了,則不需要了
            ],[$type]);
           

2、螺絲帽

$result = $easySms->send($phone, [
                'content'  =>  "您的驗證碼是 {$code}(有效期10分鐘,如非本人操作,請忽略)【**部落格】",//簽名必寫
                ],
            ], [$type]);
           

3、阿裡雲

$result = $easySms->send($phone, [
                'template' => 'SMS_15****21',//上面說的在這裡用到了
                'data' => [
                    'code' => $code,
                ],
            ], [$type]);
           

這樣就寫好了,可以在postman輸入手機号測試一下。

測試過程中遇到的一些常見問題:

短信接口常見錯誤之All the gateways have failed

1、使用easysms時

https://laravel-china.org/topics/8197/using-the-overtrueeasy-sms-packet-the-ali-sms-platform-failed-to-send

2、一般情況下,可能是因為發送時的類型錯誤:

如:雲片是content類型,阿裡雲是template+data類型,若使用雲片接口發送aliyun類型資料則會報該類型錯誤。

3、簽名錯誤

另外同樣使用content類型的短信接口也需注意,簽名錯誤也會導緻該錯誤,因為該短信服務提供商會對你申請的簽名進行驗證,如果簽名錯誤或位置錯誤也會導緻該類型的錯誤。如:雲片的content部分:'content' => "【**科技】您的驗證碼是 {$code}(有效期10分鐘,如非本人操作,請忽略)",,簽名在最前面,哪怕多一個空格也會報錯,而螺絲帽的content部分

'content' => "您的驗證碼是 {$code}(有效期10分鐘,如非本人操作,請忽略)【**科技】",

簽名在最後面,且沒有sign_name 屬性。

總結,使用短信接口時需要多看提供商的文檔。

備注:有時候會出現執行個體化EasySms時需要傳入數組config,否者報缺少數組參數的錯誤,注意,這是因為bootstrap目錄下的cache下出現了緩存檔案config,清除緩存即可。

第一次寫部落格,不足之處,多多指正!