又一个轮子:一款满足你的多种发送需求的短信发送组件: overtrue/easy-sms

其实这个轮子已经做好 3 个月了,陆续做了一些修改,另外一些朋友也在试用与测试,所以经过这 3 个月来的打磨,应该是时候放出来坑更多的小朋友了,哈哈,开个玩笑。

先讲讲缘由咯:

  1. 我们通常会在一个应用使用多家的短信发送服务以保证服务可用性。
  2. 接入多家服务的时候需要写多份代码,维护成本高。
  3. 针对各家服务商的调用方式不同,发送消息写法不统一。
  4. 增减服务商成本较大,代码改动量大。

当然了,对于编码质量高的同学来讲,上面的这些问题都不算大事,但是重复的折腾就会比较厌烦了,所以呢,我就开了这个坑。

https://github.com/overtrue/easy-sms

特点:

  1. 支持目前市面多家服务商:云片、Submail、螺丝帽、阿里大于、容联云通讯、互亿无线、聚合数据、SendCloud
  2. 一套写法兼容所有平台
  3. 简单配置即可灵活增减服务商
  4. 支持多种服务商选择策略
  5. 统一的返回值格式,便于日志与监控
  6. 自动轮询选择可用的服务商
  7. 更多等你去发现与改进...

你需要做的就是先打开上面的链接,点击右上角区域的 star, 然后看文档,喜欢就装上玩。有问题随时找我咯。:kiss:

本帖已被设为精华帖!
本帖由 Summer 于 8年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 99

已试用一段时间了,好评 :thumbsup:

8年前 评论
franktrue

好像不支持阿里云啊

8年前 评论

@fnf1993 阿里大于 不是?

8年前 评论
franktrue

@overtrue 我以前也以为是一样的,后来发现阿里云的消息服务,和阿里大于是两个东西 = =

8年前 评论

@fnf1993 OK, 我改天集成进来,当然也欢迎 PR.

8年前 评论
franktrue

@overtrue 感谢~

8年前 评论
幽弥狂

感谢超哥

8年前 评论
Destiny

用了超哥的轮子,腰不酸腿不疼,一口气能上 20 楼了。

8年前 评论

超哥的轮子好啊,超哥的轮子棒,超哥的轮子呱呱叫。

8年前 评论

@maxincai 哈哈哈哈

8年前 评论

@Rekkles 哈哈,不要这样,小心论坛被关掉哦

8年前 评论

如果能配合 laravel notification 就更佳了 :thumbsup:

8年前 评论
Summer

@Rekkles 已删,别这样,我会坐牢的

8年前 评论

手动点赞

8年前 评论

大爱啊?

8年前 评论

用了超哥的 easywechat,确实很好用,有机会试试这个,感谢超哥!!!

8年前 评论

:thumbsup: 好用

8年前 评论

超哥威武,超哥霸气~~

8年前 评论

百度云短信已经提交 PR 了

8年前 评论

厉害了我的轮子哥! 点赞

8年前 评论

高产奶牛,超哥出品,直接上线。

8年前 评论

@springjk 哈哈哈,Summer 是母猪,安哥是奶牛!

8年前 评论
QQ76762

厉害了我的哥

8年前 评论

这种源码读起来是一种很开心的体验!

8年前 评论
imxfly

评论得拉到最后才精彩 = =,奶牛超哥,用你的 easywechat 确实少踩不少坑。是成为造轮子的人还是开轮子的人好呢:poop:

8年前 评论

@Stephen 开轮子是什么意思?

8年前 评论

@Stephen 是说我坑了你?

8年前 评论
imxfly

@overtrue 没有啊,少踩很多坑这句话不够清楚么 = =

8年前 评论

@Stephen 好吧,看错了,我看成是 “踩了不少坑” 哈哈,sorry.

8年前 评论
imxfly

@overtrue 眼泪水掉下来

8年前 评论
imxfly

:revolving_hearts:

8年前 评论

会封装 Laravel 的 ServiceProvider 吗

7年前 评论

@墨风 嗯,也不是不行哈,过两天,最近忙成狗

7年前 评论

@overtrue 期待支持阿里云的短信,,,公司用的阿里云的,,正准备问阿里云和阿里大于是不是一个东西呢~~

7年前 评论

@largezhou 阿里云消息那个好复杂啊。。。所以现在抽不出时间来搞它,如果你们已经用上了,可以考虑贡献 PR

7年前 评论

https://github.com/overtrue/easy-sms/blob/...
如果 Gateway 是用注册式的就好了。比如自建的平台如果想写一个 Gateway 的话,还得 class_alias 到 Overtrue\EasySms\Gateways 命名空间下,有点 hack 了。

7年前 评论

@reatang guys, 请认真阅读 readme. 不然我要用小拳拳锤你胸口哦!

7年前 评论

@overtrue 看到了 extend ()// 吓了我个蹦

7年前 评论

好轮子?

7年前 评论
[ErrorException]                                             
  The use statement with non-compound name 'DB' has no effect  
Script php artisan optimize handling the post-update-cmd event returned with error code 1
Installation failed, reverting ./composer.json to its original content.

超哥我 composer 安装一直报这个错误 , 我的 php 是 7.0 系统 centos

7年前 评论

@DanceSmile 这明明是你 PHP 基础语法的问题吧,在根命名空间 use DB; 的原因:

The use statement with non-compound name 'DB' has no effect

7年前 评论

@overtrue 多谢指点,一句话点破了 好了,谢谢超哥

7年前 评论

@overtrue 刚才 google 的好久, 一直因为是不能用 use DB, 我就把文件里的的 use DB 删掉了好多,
看到你说的 根命名空间 才恍然大悟

7年前 评论

@overtrue

![Uploading file...]()
code 应该是字符串,数字会报错

7年前 评论

file
code 应该是字符串,数字会报错

7年前 评论

@就好比 不同商家要求不一样,根据自己情况调整内容

7年前 评论

@overtrue 原来是这个样子 我用的阿里大鱼 受教了 = =

7年前 评论

正想看看这一方面的东西

7年前 评论

原来是这个样子 我用的阿里大鱼 受教了 =

7年前 评论

大神诞生很多好作品啊

7年前 评论

错误信息的返回格式问题

 // 可用的网关配置
    'gateways' => [
        'errorlog' => [
            'file' => '/tmp/easy-sms.log',
        ],],

在这里的 errorLog 记录是所有的请求以及响应的日志么?如果服务商报错了,那么排查错误的话是不是通过这个文件实现?
比如使用的服务商欠费了(我使用的是 laradock 开发环境,查询了 workspace、nginx、php-fpm 容器无法查到生成的这个日志
文件,所以来问问大神)。
因为我看到只要是错误,返回的错误全这样的,这个无法排查问题啊。

{
    "message": "All the gateways have failed.",
    "status_code": 500
}
7年前 评论

@努力做个技术男 麻烦读完 README,谢谢:

https://github.com/overtrue/easy-sms# 返回值

'juhe' => [
        'status' => 'erred',
        'exception' => \Overtrue\EasySms\Exceptions\GatewayErrorException 对象
    ],

https://github.com/overtrue/easy-sms/blob/...

7年前 评论

@overtrue 是的,在使用的时我看到了。返回值在成功的情况下是没有问题。返回值如下:

array:1 [
  "alidayu" => array:2 [
    "status" => "success"
    "result" => array:1 [
      "alibaba_aliqin_fc_sms_num_send_response" => array:2 [
        "result" => array:4 [
          "err_code" => "0"
          "model" => "787524908215381104^0"
          "msg" => "*"
          "success" => true
        ]
        "request_id" => "z27e2084k8zr"
      ]
    ]
  ]
]

But 当我尝试把手机号调整为 12 位,它是在 $easySms->send() 执行之中就抛出了这个异常,也就是说没等到我判断 $result 时,它就已经抛出了一个异常响应。

 "debug": {
        "line": 88,
        "file": "/var/www/employment-service/vendor/overtrue/easy-sms/src/Messenger.php",
        "class": "Overtrue\\EasySms\\Exceptions\\NoGatewayAvailableException",

本人使用 dingoAPI、laravel5.4,短信服务商是阿里大于(仅此一个)。

7年前 评论

@overtrue 抱歉,没看仔细,异常中包装了 $results,我需要再看看如何从异常中获取 $results,因为在我的 laravel log 日志中没有出现 $results 的信息。

7年前 评论

@努力做个技术男

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

7年前 评论

@overtrue
非常感谢,本人目前只使用的一个短信服务商阿里大鱼,所以解决方式也只针对于阿里大鱼。

通过对 $easySms->send 封装一层 try catch,通过对异常的捕获避免直接响应给请求,然后通过对异常 $results 的读取、处理,然后根据逻辑处理即可。如图所示:

file

7年前 评论

使用创蓝 (253) 短信时,报 NoGatewayAvailableException 错误

7年前 评论

抱歉了,因为公司用的是创蓝短信的老接口,跟这个轮子里的接口参数不一样,所以才报上面的错误。

7年前 评论

@overtrue 不支持阿里云语音?

7年前 评论

@overtrue 大神你好,请问这是因为什么刚下的扩展

file

7年前 评论

@xihanshui 请正确配置您的 SSL 根证书

7年前 评论

@overtrue 谢谢大神,我把 Guzzel 的 ssl 证书认证选项给关了,另外还有一个如果不是在 laravel 框架中使用,选择腾讯云 SMS 服务的,可能会遇到这个错误

 Fatal error: Uncaught Error: Call to undefined function Overtrue\EasySms\Gateways\str_random() in C:\Users\Administrator\Desktop\easy-sms\vendor\overtrue\easy-sms\src\Gateways\QcloudGateway.php on line 69

因为 str_random() 不是 php 的内置函数 我给改成了 rand(100000, 999999) 就可以了。

7年前 评论

@xihanshui 好的,确实是 Bug, 稍后修复,多谢!

7年前 评论

不知道怎么兼容手机号是否带地区码

7年前 评论

@overtrue 大神,我的是 TP5,在获取异常的时候一直提示错误

file

6年前 评论

大神好,阿里云短信是发送成功了,但是每天发送第一次不对,再试一次后就可以了。每天都是这样

6年前 评论

而且有时候发送不成功 返回值也是空的

6年前 评论

我找到问题了,有些时候发不成功 提示 All the gateways have failed. You can get error details by $exception->getExceptions(), 但有时却成功了

6年前 评论

不知道华为云能不能兼容

6年前 评论

现在不支持阿里大于了?

6年前 评论

@pikalu 官方都放弃了

6年前 评论
pikalu 5年前

大汉三通 需要自己集成进去吗?

5年前 评论

老师,你好,我是您的扩展包课程的读者,我在参考 github easy-sms 项目的源码,试着自己造轮子。我有一个疑问:阿里云短信服务提供了开发 sdk , 如 alibabacloud/client": "^1.5 , 为什么在 easy-sms 项目中不使用, 而是自己封装代码? 基于什么样的考虑?我在造轮子的时候,该如何选择?

5年前 评论

@matteao 因为发短信就只是一个简单的 API 调用,如果用它的 SDK,要写的代码并没有减少,所以用不用其实差别不大。

5年前 评论
matteao 5年前

非常棒!打算改用你这个,希望作者可以吸取一下隔壁的一些功能 github.com/toplan/laravel-sms#4-%E...

手机号验证、动态验证、debug 不会发送短信可以通过接口获取短信验证码

5年前 评论
phpervip 5年前