📲 一款满足你的多种发送需求的短信发送组件

Last update: Jul 27, 2022

Easy SMS

📲 一款满足你的多种发送需求的短信发送组件

Build Status Latest Stable Version Latest Unstable Version Code Coverage Total Downloads License

Sponsor me

特点

  1. 支持目前市面多家服务商
  2. 一套写法兼容所有平台
  3. 简单配置即可灵活增减服务商
  4. 内置多种服务商轮询策略、支持自定义轮询策略
  5. 统一的返回值格式,便于日志与监控
  6. 自动轮询选择可用的服务商
  7. 更多等你去发现与改进...

平台支持

环境需求

  • PHP >= 5.6

安装

$ composer require "overtrue/easy-sms"

For Laravel notification

如果你喜欢使用 Laravel Notification, 可以考虑直接使用朋友封装的拓展包:

https://github.com/yl/easysms-notification-channel

使用

use Overtrue\EasySms\EasySms;

$config = [
    // HTTP 请求的超时时间(秒)
    'timeout' => 5.0,

    // 默认发送配置
    'default' => [
        // 网关调用策略,默认:顺序调用
        'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

        // 默认可用的发送网关
        'gateways' => [
            'yunpian', 'aliyun',
        ],
    ],
    // 可用的网关配置
    'gateways' => [
        'errorlog' => [
            'file' => '/tmp/easy-sms.log',
        ],
        'yunpian' => [
            'api_key' => '824f0ff2f71cab52936axxxxxxxxxx',
        ],
        'aliyun' => [
            'access_key_id' => '',
            'access_key_secret' => '',
            'sign_name' => '',
        ],
        //...
    ],
];

$easySms = new EasySms($config);

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);

短信内容

由于使用多网关发送,所以一条短信要支持多平台发送,每家的发送方式不一样,但是我们抽象定义了以下公用属性:

  • content 文字内容,使用在像云片类似的以文字内容发送的平台
  • template 模板 ID,使用在以模板ID来发送短信的平台
  • data 模板变量,使用在以模板ID来发送短信的平台

所以,在使用过程中你可以根据所要使用的平台定义发送的内容。

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);

你也可以使用闭包来返回对应的值:

$easySms->send(13188888888, [
    'content'  => function($gateway){
        return '您的验证码为: 6379';
    },
    'template' => function($gateway){
        return 'SMS_001';
    },
    'data' => function($gateway){
        return [
            'code' => 6379
        ];
    },
]);

你可以根据 $gateway 参数类型来判断返回值,例如:

$easySms->send(13188888888, [
    'content'  => function($gateway){
        if ($gateway->getName() == 'yunpian') {
            return '云片专用验证码:1235';
        }
        return '您的验证码为: 6379';
    },
    'template' => function($gateway){
        if ($gateway->getName() == 'aliyun') {
            return 'TP2818';
        }
        return 'SMS_001';
    },
    'data' => function($gateway){
        return [
            'code' => 6379
        ];
    },
]);

发送网关

默认使用 default 中的设置来发送,如果某一条短信你想要覆盖默认的设置。在 send 方法中使用第三个参数即可:

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
 ], ['yunpian', 'juhe']); // 这里的网关配置将会覆盖全局默认值

返回值

由于使用多网关发送,所以返回值为一个数组,结构如下:

[
    'yunpian' => [
        'gateway' => 'yunpian',
        'status' => 'success',
        'result' => [...] // 平台返回值
    ],
    'juhe' => [
        'gateway' => 'juhe',
        'status' => 'failure',
        'exception' => \Overtrue\EasySms\Exceptions\GatewayErrorException 对象
    ],
    //...
]

如果所选网关列表均发送失败时,将会抛出 Overtrue\EasySms\Exceptions\NoGatewayAvailableException 异常,你可以使用 $e->results 获取发送结果。

你也可以使用 $e 提供的更多便捷方法:

$e->getResults();               // 返回所有 API 的结果,结构同上
$e->getExceptions();            // 返回所有调用异常列表
$e->getException($gateway);     // 返回指定网关名称的异常对象
$e->getLastException();         // 获取最后一个失败的异常对象

自定义网关

本拓展已经支持用户自定义网关,你可以很方便的配置即可当成与其它拓展一样的使用:

$config = [
    ...
    'default' => [
        'gateways' => [
            'mygateway', // 配置你的网站到可用的网关列表
        ],
    ],
    'gateways' => [
        'mygateway' => [...], // 你网关所需要的参数,如果没有可以不配置
    ],
];

$easySms = new EasySms($config);

// 注册
$easySms->extend('mygateway', function($gatewayConfig){
    // $gatewayConfig 来自配置文件里的 `gateways.mygateway`
    return new MyGateway($gatewayConfig);
});

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);

国际短信

国际短信与国内短信的区别是号码前面需要加国际码,但是由于各平台对国际号码的写法不一致,所以在发送国际短信的时候有一点区别:

use Overtrue\EasySms\PhoneNumber;

// 发送到国际码为 31 的国际号码
$number = new PhoneNumber(13188888888, 31);

$easySms->send($number, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);

定义短信

你可以根据发送场景的不同,定义不同的短信类,从而实现一处定义多处调用,你可以继承 Overtrue\EasySms\Message 来定义短信模型:



use Overtrue\EasySms\Message;
use Overtrue\EasySms\Contracts\GatewayInterface;
use Overtrue\EasySms\Strategies\OrderStrategy;

class OrderPaidMessage extends Message
{
    protected $order;
    protected $strategy = OrderStrategy::class;           // 定义本短信的网关使用策略,覆盖全局配置中的 `default.strategy`
    protected $gateways = ['alidayu', 'yunpian', 'juhe']; // 定义本短信的适用平台,覆盖全局配置中的 `default.gateways`

    public function __construct($order)
    {
        $this->order = $order;
    }

    // 定义直接使用内容发送平台的内容
    public function getContent(GatewayInterface $gateway = null)
    {
        return sprintf('您的订单:%s, 已经完成付款', $this->order->no);
    }

    // 定义使用模板发送方式平台所需要的模板 ID
    public function getTemplate(GatewayInterface $gateway = null)
    {
        return 'SMS_003';
    }

    // 模板参数
    public function getData(GatewayInterface $gateway = null)
    {
        return [
            'order_no' => $this->order->no
        ];
    }
}

更多自定义方式请参考:Overtrue\EasySms\Message

发送自定义短信:

$order = ...;
$message = new OrderPaidMessage($order);

$easySms->send(13188888888, $message);

各平台配置说明

阿里云

短信内容使用 template + data

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

阿里云Rest

短信内容使用 template + data

    'aliyunrest' => [
        'app_key' => '',
        'app_secret_key' => '',
        'sign_name' => '',
    ],

阿里云国际

短信内容使用 template + data

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

发送示例:

521410, ], ]);">
use Overtrue\EasySms\PhoneNumber;

$easySms = new EasySms($config);
$phone_number = new PhoneNumber(18888888888, 86);

$easySms->send($phone_number, [
    'content' => '您好:先生/女士!您的验证码为${code},有效时间是5分钟,请及时验证。',
    'template' => 'SMS_00000001', // 模板ID
    'data' => [
        "code" => 521410,
    ],
]);

云片

短信内容使用 content

    'yunpian' => [
        'api_key' => '',
        'signature' => '【默认签名】', // 内容中无签名时使用
    ],

Submail

短信内容使用 data

    'submail' => [
        'app_id' => '',
        'app_key' => '',
        'project' => '', // 默认 project,可在发送时 data 中指定
    ],

螺丝帽

短信内容使用 content

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

容联云通讯

短信内容使用 template + data

    'yuntongxun' => [
        'app_id' => '',
        'account_sid' => '',
        'account_token' => '',
        'is_sub_account' => false,
    ],

互亿无线

短信内容使用 content

    'huyi' => [
        'api_id' => '',
        'api_key' => '',
        'signature' => '',
    ],

聚合数据

短信内容使用 template + data

    'juhe' => [
        'app_key' => '',
    ],

SendCloud

短信内容使用 template + data

    'sendcloud' => [
        'sms_user' => '',
        'sms_key' => '',
        'timestamp' => false, // 是否启用时间戳
    ],

百度云

短信内容使用 template + data

    'baidu' => [
        'ak' => '',
        'sk' => '',
        'invoke_id' => '',
        'domain' => '',
    ],

华信短信平台

短信内容使用 content

    'huaxin' => [
        'user_id'  => '',
        'password' => '',
        'account'  => '',
        'ip'       => '',
        'ext_no'   => '',
    ],

253云通讯(创蓝)

短信内容使用 content

    'chuanglan' => [
        'account' => '',
        'password' => '',

        // 国际短信时必填
        'intel_account' => '',
        'intel_password' => '',

        // \Overtrue\EasySms\Gateways\ChuanglanGateway::CHANNEL_VALIDATE_CODE  => 验证码通道(默认)
        // \Overtrue\EasySms\Gateways\ChuanglanGateway::CHANNEL_PROMOTION_CODE => 会员营销通道
        'channel'  => \Overtrue\EasySms\Gateways\ChuanglanGateway::CHANNEL_VALIDATE_CODE,

        // 会员营销通道 特定参数。创蓝规定:api提交营销短信的时候,需要自己加短信的签名及退订信息
        'sign' => '【通讯云】',
        'unsubscribe' => '回TD退订',
    ],

融云

短信分为两大类,验证类和通知类短信。 发送验证类短信使用 template + data

    'rongcloud' => [
        'app_key' => '',
        'app_secret' => '',
    ]

天毅无线

短信内容使用 content

    'tianyiwuxian' => [
        'username' => '', //用户名
        'password' => '', //密码
        'gwid' => '', //网关ID
    ]

twilio

短信使用 content 发送对象需要 使用+添加区号

    'twilio' => [
        'account_sid' => '', // sid
        'from' => '', // 发送的号码 可以在控制台购买
        'token' => '', // apitoken
    ],

tiniyo

短信使用 content 发送对象需要 使用+添加区号

    'tiniyo' => [
        'account_sid' => '', // auth_id from https://tiniyo.com
        'from' => '', // 发送的号码 可以在控制台购买
        'token' => '', // auth_secret from https://tiniyo.com
    ],	    

腾讯云 SMS

短信内容使用 template + data

    'qcloud' => [
        'sdk_app_id' => '', // 短信应用的 SDK APP ID
        'secret_id' => '', // SECRET ID
        'secret_key' => '', // SECRET KEY
        'sign_name' => '腾讯CoDesign', // 短信签名
    ],

发送示例:

$easySms->send(18888888888, [
    'template' => 101234, // 模板ID
    'data' => [ 
        "a", 'b', 'c', 'd', //按占位顺序给值
    ],
]);

阿凡达数据

短信内容使用 template + data

    'avatardata' => [
        'app_key' => '', // APP KEY
    ],

华为云 SMS

短信内容使用 template + data

    'huawei' => [
        'endpoint' => '', // APP接入地址
        'app_key' => '', // APP KEY
        'app_secret' => '', // APP SECRET
        'from' => [
            'default' => '1069012345', // 默认使用签名通道号
            'custom' => 'csms12345', // 其他签名通道号 可以在 data 中定义 from 来指定
            'abc' => 'csms67890', // 其他签名通道号
            ...
        ],
        'callback' => '' // 短信状态回调地址
    ],

使用默认签名通道 default

$easySms->send(13188888888, [
    'template' => 'SMS_001',
    'data' => [
        6379
    ],
]);

使用指定签名通道

$easySms->send(13188888888, [
    'template' => 'SMS_001',
    'data' => [
        6379,
        'from' => 'custom' // 对应 config 中的 from 数组中 custom
    ],
]);

网易云信

短信内容使用 template + data

    'yunxin' => [
        'app_key' => '',
        'app_secret' => '',
        'code_length' => 4, // 随机验证码长度,范围 4~10,默认为 4
        'need_up' => false, // 是否需要支持短信上行
    ],
$easySms->send(18888888888, [
    'template' => 'SMS_001',    // 不填则使用默认模板
    'data' => [
        'code' => 8946, // 如果设置了该参数,则 code_length 参数无效
        'action' => 'sendCode', // 默认为 `sendCode`,校验短信验证码使用 `verifyCode`
    ],
]);

云之讯

短信内容使用 template + data

    'yunzhixun' => [
        'sid' => '',
        'token' => '',
        'app_id' => '',
    ],
$easySms->send(18888888888, [
    'template' => 'SMS_001',
    'data' => [
        'params' => '8946,3',   // 模板参数,多个参数使用 `,` 分割,模板无参数时可为空
        'uid' => 'hexianghui',  // 用户 ID,随状态报告返回,可为空
        'mobiles' => '18888888888,188888888889',    // 批量发送短信,手机号使用 `,` 分割,不使用批量发送请不要设置该参数
    ],
]);

凯信通

短信内容使用 content

    'kingtto'  => [
        'userid'   => '',
        'account'  => '',
        'password' => '',
    ],
$easySms->send(18888888888, [
    'content'  => '您的验证码为: 6379',
]);

七牛云

短信内容使用 template + data

    'qiniu' => [
        'secret_key' => '',
        'access_key' => '',
    ],
$easySms->send(18888888888, [
    'template' => '1231234123412341234',
    'data' => [
        'code' => 1234,
    ],
]);

Ucloud

短信使用 template + data

  'ucloud' => [
        'private_key'  => '',    //私钥
        'public_key'   => '',    //公钥
        'sig_content'  => '',    // 短信签名,
        'project_id'   => '',    //项目ID,子账号才需要该参数
    ],
$easySms->send(18888888888, [
    'template' => 'UTAXXXXX',       //短信模板
    'data' => [
        'code' => 1234,     //模板参数,模板没有参数不用则填写,有多个参数请用数组,[1111,1111]
        'mobiles' =>'',     //同时发送多个手机短信,请用数组[xxx,xxx]
    ],
]);

短信宝

短信使用 content

  'smsbao' => [
        'user'  => '',    //账号
        'password'   => ''   //密码
    ],
$easySms->send(18888888888, [
    'content' => '您的验证码为: 6379',       //短信模板
]);

摩杜云

短信使用 template + data

  'moduyun' => [
        'accesskey' => '',  //必填 ACCESS KEY
        'secretkey' => '',  //必填 SECRET KEY
        'signId'    => '',  //选填 短信签名,如果使用默认签名,该字段可缺省
        'type'      => 0,   //选填 0:普通短信;1:营销短信
    ],
$easySms->send(18888888888, [
    'template' => '5a95****b953',   //短信模板
    'data' => [
        1234,   //模板参数,对应模板的{1}
        30      //模板参数,对应模板的{2}
        //...
    ],
]);

融合云(助通)

短信使用 template + data

  'rongheyun' => [
        'username' => '',  //必填 用户名
        'password' => '',  //必填 密码
        'signature'=> '',  //必填 已报备的签名
    ],
$easySms->send(18888888888, [
    'template' => '31874',   //短信模板
    'data' => [
        'valid_code' => '888888',   //模板参数,对应模板的{valid_code}
        //...
    ],
]);

蜘蛛云

短信使用 template + data

  'zzyun' => [
        'user_id' => '',    //必填 会员ID
        'secret' => '',     //必填 接口密钥
        'sign_name'=> '',   //必填 短信签名
    ],
$easySms->send(18888888888, [
    'template' => 'SMS_210317****',   //短信模板
    'data' => [
        'code' => '888888',   //模板参数,对应模板的{code}
        //...
    ],
]);

❤️ 支持我

Sponsor me

如果你喜欢我的项目并想支持它,点击这里 ❤️

Project supported by JetBrains

Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects.

PHP 扩展包开发

想知道如何从零开始构建 PHP 扩展包?

请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》

License

MIT

GitHub

https://github.com/overtrue/easy-sms
Comments
  • 1. SendCloud 替换变量格式错误

    当 SendCloud 使用模板无变量替换时,发送参数 vars 为字符串 "vars" => "[]" 导致 SendCloud 报错:替换变量格式错误。

    可考虑过滤掉空值 或 为空情况下 formatTemplateVars 返回数组:

    if (empty($vars)) {
        return $formatted;
    }
    
    Reviewed by fxxxf at 2017-07-11 07:12
  • 2. new Config错误导致All the gateways have failed 错误

    https://github.com/overtrue/easy-sms/blob/49d99629b95144341789059e8ce577ea5f90f4ae/src/Messenger.php#L64

    这个地方,new Config($gateways[$gateway]),其中 $gateways[$gateway]是错误的。 可以改为:new Config($this->easySms->getConfig()->get("gateways.{$gateway}"))

    Reviewed by mumianzi at 2018-09-10 08:57
  • 3. [Question] Submail 的 Gateway 实现是否存在缺陷

    场景:需要发送 国内和国际短信,主力使用 Qcloud ,使用 Submail 作为备用。

    1. Submail 的国内和国际短信需要使用不同的 ApiUrl、 ApiId、ApiKey,但是在网关中只对 ApiUrl 做了判断,而 ApiId 和 ApiKey 依旧是读取的固定的配置。

    2. SubmailGateway 中 template 是读取的 $message->getData($this)['project'] 作为 template,而在 QcloudGateway 则读取 $message->getTemplate($this) 。难以使用类似于下面的方式使用 submail 作为备份的短信发送服务

     App::get('easysms')->send($telephone, [
        'template' => 11111,
        'data' => [
            'balabala' => '123123',
        ]),
    ], ['qcloud','submail']);
    

    望不惜赐教,感谢

    Reviewed by Kuri-su at 2019-01-03 08:46
  • 4. Add YunTongXun

    新增服务商 YunTongXun(云通讯)

    调用示例

    $config = [
        'gateways' => [
            'yun-tong-xun' => [
                'debug' => false,// 是否测试环境
                'is_sub_account' => false,// 如果是子账户,这里填 true
                'account_sid' => '8xxxxxxxxxxxxxxxx4',// ACCOUNT SID
                'account_token' => 'dxxxxxxxxxxxxxxxxxxx7',// AUTH TOKEN
                'app_id' => 'axxxxxxxxxxxxxxx3',// AppID
            ],
        ],
    ];
    $easySms = new EasySms($config);
    $response = $easySms->gateway('yun-tong-xun')->send(13699999991, '5519', ['wwp66650','余额','888,888,888.88']);// 第二个参数为模板ID,第三个参数为模板替换数据
    
    

    官方文档

    http://www.yuntongxun.com/doc/rest/sms/3_2_2_2.html

    人生第一个 PR ,好紧张。。。超哥,交作业了! 哈哈
    Reviewed by novalevel at 2017-03-16 15:36
  • 5. 如果抛出异常我要怎么捕获错误信息?

    我现在使用的阿里云,出现 All the gateways have failed. 我打印出错误信息是请求频繁了,有没有方便的方法获取这个错误信息? {"aliyun":{"status":"failure","exception":{"raw":{"Message":"触发小时级流控Permits:5","RequestId":"A324EFD4-3162-4354-9D39-24AE4EE6871F","Code":"isv.BUSINESS_LIMIT_CONTROL"}}}}

    我现在打印这个信息是 return $e->results;如果我只想获取Message 信息要怎么做 是不是所有的短信通道都可以这么获取?

    Reviewed by dullme at 2018-03-02 09:22
  • 6. 阿里大鱼的请求失败。错误信息:权限不够

    加载了控件,输入相关配置

    $config = [
                // HTTP 请求的超时时间(秒)
                'timeout' => 5.0,
    
                // 默认发送配置
                'default' => [
                    // 网关调用策略,默认:顺序调用
                    'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
    
                    // 默认可用的发送网关
                    'gateways' => [
                        'alidayu'
                    ],
                ],
                // 可用的网关配置
                'gateways' => [
    //                'errorlog' => [
    //                    'file' => '',
    //                ],
                    'alidayu' => [
                        'app_key' => '',//阿里云账号access key
                        'app_secret' => '', //阿里云账号access secret
                        'sign_name' => '',//通过审核的一个签名
                    ],
                ],
            ];
    
            $easySms = new EasySms($config);
    //dd($easySms);
            $message = [
                'template' => 'SMS_XXXXX', //通过审核的一个模板id
                'data' => [
                    'name' => $name, //一个参数
                ],
            ];
            $result = $easySms->send(13888888888, $message);
    

    得到的返回数据是:

    {"code":11,"msg":"Insufficient isv permissions","sub_code":"isv.permission-api-package-limit","sub_msg":"scope ids is 11022 11600 11863","request_id":"iv15fxmtv8z6"}
    

    调试了很久不太好使,我尝试了阿里大鱼自带的一个demo,也是用以上的配置,该复制的复制。发送短信没有问题。 同时,注意到人家给的demo里面,有这么几个参数:

    //短信API产品名
    $product = "Dysmsapi";
    //短信API产品域名
    $domain = "dysmsapi.aliyuncs.com";
    

    然后阿里大鱼的配置项里面的是:

    const ENDPOINT_URL = 'https://eco.taobao.com/router/rest';
    const ENDPOINT_METHOD = 'alibaba.aliqin.fc.sms.num.send';
    

    还是挺想用这个插件的~但是可能是我用的方法不太对?希望有人能指导一下

    Reviewed by MissMyCat at 2017-06-27 13:51
  • 7. 新增阿凡达数据网关

    阿凡达数据网关:avatardata

    阿凡达数据

    短信内容使用 template + data

        'avatardata' => [
            'app_key' => '', // APP KEY
        ],
    

    使用示例:

    try {
        $easySms->send(13800138000, [
            'content'  => '感谢注册,您的验证码是520。',
            'template' => '',
            'data'     => [
                '520'  //多参数可用:'a,b'或'a','b'
            ],
        ]);
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }
    
    Reviewed by oiuv at 2018-01-31 13:49
  • 8. 创蓝api curl error 60

    运行页面报错 cURL error 60: SSL certificate problem: self signed certificate in certificate chain (seehttp://curl.haxx.se/libcurl/c/libcurl-errors.html)

    controller 
    
    $this->easySms->send('*****', [
                    'content' => '您请求的验证码为: ' . $this->phoneCodeService->phoneCode($request->input('phone_number'))
                ]);
    
    easy-sms.php
    
    return [
        // HTTP 请求的超时时间(秒)
        'timeout' => 5.0,
    
        // 默认发送配置
        'default' => [
            // 网关调用策略,默认:顺序调用
            'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
    
            // 默认可用的发送网关
            'gateways' => [
                'chuanglan'
            ],
        ],
        // 可用的网关配置
        'gateways' => [
            'errorlog' => [
                'file' => '/tmp/easy-sms.log',
            ],
            'chuanglan' => [
                'username'  => env('CHUANGLAN_USERNAME'),
                'password' => env('CHUANGLAN_PASSWORD'),
            ],
        ],
    ];
    
    Reviewed by znmin at 2017-10-19 06:29
  • 9. 阿里大于ssl错误

    如题,修改了HasHttpRequest getBaseOptions 自己解决了,请问有什么更好的方法。 protected function getBaseOptions() { $options = [ 'base_uri' => method_exists($this, 'getBaseUri') ? $this->getBaseUri() : '', 'timeout' => property_exists($this, 'timeout') ? $this->timeout : 5.0, 'verify' => false, ];

        return $options;
    }
    
    Reviewed by dwdcth at 2017-06-25 03:51
  • 10. 使用国际号码发送短信时,使用 PhoneNumber 处理手机号码会丢失手机号

    https://github.com/overtrue/easy-sms/blob/58e405f030574547d00710fc9538d8e0867620e2/src/PhoneNumber.php#L37-L51

    https://github.com/overtrue/easy-sms/blob/58e405f030574547d00710fc9538d8e0867620e2/src/Gateways/QcloudGateway.php#L60

    如果传手机区号了,那么 getIDDCode 只会获取区号,就没有手机号码了,发送短信会提示参数有误

    使用版本 V2.0.1

    Reviewed by jesse7866 at 2021-11-08 12:23
  • 11. 配置文件的default 参数问题

    在 easy-sms/src/EasySms.php 文件 第 70行

    $this->setDefaultGateway($config['default']); $config['default'] 应该期望是一个 string , 可是配置文件里 default 对应的是

    ` 'default' => [

        // 网关调用策略,默认:顺序调用
        'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
    
        // 默认可用的发送网关
        'gateways' => [
            'yunpian', 'aliyun',
        ],
    ],`
    

    这样如何设置defaultGateway? 求帮助

    Reviewed by strayjoke at 2020-03-31 12:53
  • 12. 修改yunxin无通知模板问题

    近日使用网易云信通知短信,报错,经检查无云信通知模板短信格式 做一下修改 `switch ($action) { case 'sendCode': $params = $this->buildSendCodeParams($to, $message, $config);

                break;
            case 'sendTemplate':
                $params = $this->buildSendMsgParams($to, $message, $config);
                break;
            case 'verifyCode':
                $params = $this->buildVerifyCodeParams($to, $message);
    
                break;
            default:`
    

    新增sendTemplate 以及参数格式函数buildSendMsgParams `public function buildSendMsgParams(PhoneNumberInterface $to, MessageInterface $message, Config $config) {

        $data = $message->getData($this);
        $template = $message->getTemplate($this);
        
        if (!array_key_exists('params', $data)) {
            throw new GatewayErrorException('"params" cannot be empty', 0);
        }
        return [
            'mobiles' => json_encode([$to->getUniversalNumber()]),
            'templateid' => is_string($template) ? $template : '',
            'params'=>array_key_exists('params', $data) ? $data['params'] : '',
            'needUp' => $config->get('need_up', false),
        ];
    }`
    

    使用方法 $massage=[ 'template' => 'xxxx', 'data' => [ 'params' =>json_encode([$params]), 'action' => 'sendTemplate', ], ];

    Reviewed by xugames at 2022-05-12 09:01
  • 13. 云片网提示无可用网关的解决方案

    使用云片网网关时,会提示无可用网关,因为缺少headers信息。解决方案如下 YunpianGateway.php的$option插入(第49行)插入

                'headers' => [
                  'Accept' => 'application/json; charset=utf-8;',
                  'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8;'
                ],
    
    Reviewed by airxyy at 2022-01-26 15:17
  • 14. 聚合短信返回 模板变量不符合规范

    聚合短信返回 模板变量不符合规范,经测试 怀疑是 image 这里的http_build_query 把 # 号编码了 才错的 例如 $formatted["#code#"]=1122; 编译成 “%23code%23=1122” 后报错, 我直接 拼接成 “#code#=1122” 可以发送

    Reviewed by Shmily1995 at 2021-10-26 02:28
  • 15. 我这边试过线上,调用云片短信接口,调用国内的域名地址(sms.yunpian.com)发送国外的号码短信,报了很多条curl超时错误

    image

    production.ERROR: yun_pian_sms {"code":0,"message":"cURL error 28: Connection timed out after 10001 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)","area_code":"0061","phone":"416893813"}

    Reviewed by gdmec07150942 at 2021-09-13 11:58