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’(后面要用)。

阿里云->控制台(要登录)->产品与服务->云通信->短信服务,选择开通服务,

至此已获得后两个参数

在这里生成‘access_key_id’,‘access_key_secret’。这样就获得了aliyun所需要的四个参数。

2、螺丝帽,需要api_key和‘签名’

首先,注册账号(不多说),点击触发管理->显示API KEY,可以获取到api_key。然后点击签名管理->添加新签名

至此,螺丝帽所需参数也已获取齐全。

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,清除缓存即可。

第一次写博客,不足之处,多多指正!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值