{"id":13792751,"url":"https://github.com/toplan/phpsms","last_synced_at":"2025-05-15T18:11:17.231Z","repository":{"id":57071775,"uuid":"44543599","full_name":"toplan/phpsms","owner":"toplan","description":":iphone::rocket:Probably the most intelligent, elegant sms send library in php","archived":false,"fork":false,"pushed_at":"2018-06-02T08:30:59.000Z","size":359,"stargazers_count":639,"open_issues_count":14,"forks_count":129,"subscribers_count":31,"default_branch":"master","last_synced_at":"2024-05-17T07:42:11.016Z","etag":null,"topics":["phpsms","sms"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/toplan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-10-19T15:17:02.000Z","updated_at":"2024-05-06T18:08:18.000Z","dependencies_parsed_at":"2022-08-24T10:52:16.372Z","dependency_job_id":null,"html_url":"https://github.com/toplan/phpsms","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toplan%2Fphpsms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toplan%2Fphpsms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toplan%2Fphpsms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toplan%2Fphpsms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/toplan","download_url":"https://codeload.github.com/toplan/phpsms/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245261130,"owners_count":20586532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["phpsms","sms"],"created_at":"2024-08-03T22:01:15.604Z","updated_at":"2025-04-07T23:11:02.957Z","avatar_url":"https://github.com/toplan.png","language":"PHP","funding_links":[],"categories":["类库"],"sub_categories":["聊天/短信"],"readme":"# PhpSms\n[![StyleCI](https://styleci.io/repos/44543599/shield)](https://styleci.io/repos/44543599)\n[![Build Status](https://travis-ci.org/toplan/phpsms.svg?branch=master)](https://travis-ci.org/toplan/phpsms)\n[![Code Coverage](https://scrutinizer-ci.com/g/toplan/phpsms/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/toplan/phpsms/?branch=master)\n[![Latest Stable Version](https://img.shields.io/packagist/v/toplan/phpsms.svg)](https://packagist.org/packages/toplan/phpsms)\n[![Total Downloads](https://img.shields.io/packagist/dt/toplan/phpsms.svg)](https://packagist.org/packages/toplan/phpsms)\n\n可能是目前最聪明、优雅的 php 短信发送库了。\n\n\u003e phpsms的任务均衡调度功能由[toplan/task-balancer](https://github.com/toplan/task-balancer)提供。\n\n特别感谢以下赞助者:\n\n[![短信宝](http://toplan.github.io/img/smsbao-logo.png)](http://www.smsbao.com/)\n\n# 特点\n- 支持内容短信，模版短信，语音验证码，内容语音，模版语音，语音文件。\n- 支持发送均衡调度，可按代理器权重值均衡选择服务商发送。\n- 支持一个或多个备用代理器(服务商)。\n- 支持代理器调度方案热更新，可随时更新/删除/新加代理器。\n- 允许推入队列，并自定义队列实现逻辑(与队列系统松散耦合)。\n- 灵活的发送前后钩子。\n- 内置国内主流服务商的代理器。\n- [自定义代理器](#自定义代理器)和[寄生代理器](#寄生代理器)。\n\n# 服务商\n\n| 服务商 | 模板短信 | 内容短信 | 语音验证码 | 最低消费  |  最低消费单价 | 资费标准\n| ----- | :-----: | :-----: | :------: | :-------: | :-----: | :-----:\n| [Luosimao](http://luosimao.com)        | × | √ | √ | ￥850(1万条) | ￥0.085/条 | [资费标准](https://luosimao.com/service/sms#sms-price)\n| [云片网络](http://www.yunpian.com)      | × | √ | √ | ￥55(1千条) | ￥0.055/条 | [资费标准](http://www.yunpian.com/price.html)\n| [容联·云通讯](http://www.yuntongxun.com) | √ | × | √ | 充值￥500   | ￥0.055/条 | [资费标准](http://www.yuntongxun.com/price/price_sms.html)\n| [SUBMAIL](http://submail.cn)           | √ | × | √ | ￥100(1千条) | ￥0.100/条 | [资费标准](https://www.mysubmail.com/chs/store#/message)\n| [云之讯](http://www.ucpaas.com/)        | √ | × | √ | -- | ￥0.050/条 | [资费标准](http://www.ucpaas.com/service/sms.html)\n| [聚合数据](https://www.juhe.cn/)        | √ | × | √ | -- | ￥0.035/条 | [资费标准](https://www.juhe.cn/docs/api/id/54)\n| [阿里大鱼](https://www.alidayu.com/)    | √ | × | √ | -- | ￥0.045/条 | [资费标准](https://www.alidayu.com/service/price)\n| [SendCloud](https://sendcloud.sohu.com/) | √ | × | √ | -- | ￥0.048/条 | [资费标准](https://sendcloud.sohu.com/price.html)\n| [短信宝](http://www.smsbao.com/)          | × | √ | √ | ￥5(50条) | ￥0.040/条(100万条) | [资费标准](http://www.smsbao.com/fee/)\n| [腾讯云](https://www.qcloud.com/product/sms) | √ | √ | √ | -- | ￥0.045/条 | [资费标准](https://www.qcloud.com/product/sms#price)\n| [阿里云](https://www.aliyun.com/product/sms) | √ | × | × | -- | ￥0.045/条 | [资费标准](https://cn.aliyun.com/price/product#/mns/detail)\n\n# 安装\n\n```php\ncomposer require toplan/phpsms:~1.8\n```\n\n开发中版本\n```php\ncomposer require toplan/phpsms:dev-master\n```\n\n# 快速上手\n\n### 1. 配置\n\n- 配置代理器所需参数\n\n为你需要用到的短信服务商(即代理器)配置必要的参数。可以在`config\\phpsms.php`中键为`agents`的数组中配置，也可以手动在程序中设置，示例如下：\n\n```php\n//example:\nSms::config([\n    'Luosimao' =\u003e [\n        'apikey' =\u003e 'your api key',\n        'voiceApikey' =\u003e 'your voice api key',\n    ],\n    'YunPian'  =\u003e [\n        'apikey' =\u003e 'your api key',\n    ],\n    'SmsBao' =\u003e [\n        'username' =\u003e 'your username',\n        'password'  =\u003e 'your password'\n    ]\n]);\n```\n\n- 配置代理器调度方案\n\n可在`config\\phpsms.php`中键为`scheme`的数组中配置。也可以手动在程序中设置，示例如下：\n\n```php\n//example:\nSms::scheme([\n    //被使用概率为2/3\n    'Luosimao' =\u003e '20',\n\n    //被使用概率为1/3，且为备用代理器\n    'YunPian' =\u003e '10 backup',\n\n    //仅为备用代理器\n    'SmsBao' =\u003e '0 backup',\n]);\n```\n\u003e **调度方案解析：**\n\u003e 如果按照以上配置，那么系统首次会尝试使用`Luosimao`或`YunPian`发送短信，且它们被使用的概率分别为`2/3`和`1/3`。\n\u003e 如果使用其中一个代理器发送失败，那么会启用备用代理器，按照配置可知备用代理器有`YunPian`和`SmsBao`，那么会依次调用直到发送成功或无备用代理器可用。\n\u003e 值得注意的是，如果首次尝试的是`YunPian`，那么备用代理器将会只使用`SmsBao`，也就是会排除使用过的代理器。\n\n### 2. Enjoy it!\n\n```php\nrequire('path/to/vendor/autoload.php');\nuse Toplan\\PhpSms\\Sms;\n\n// 接收人手机号\n$to = '1828****349';\n// 短信模版\n$templates = [\n    'YunTongXun' =\u003e 'your_temp_id',\n    'SubMail'    =\u003e 'your_temp_id'\n];\n// 模版数据\n$tempData = [\n    'code' =\u003e '87392',\n    'minutes' =\u003e '5'\n];\n// 短信内容\n$content = '【签名】这是短信内容...';\n\n// 只希望使用模板方式发送短信，可以不设置content(如:云通讯、Submail、Ucpaas)\nSms::make()-\u003eto($to)-\u003etemplate($templates)-\u003edata($tempData)-\u003esend();\n\n// 只希望使用内容方式发送，可以不设置模板id和模板data(如:短信宝、云片、luosimao)\nSms::make()-\u003eto($to)-\u003econtent($content)-\u003esend();\n\n// 同时确保能通过模板和内容方式发送，这样做的好处是可以兼顾到各种类型服务商\nSms::make()-\u003eto($to)\n    -\u003etemplate($templates)\n    -\u003edata($tempData)\n    -\u003econtent($content)\n    -\u003esend();\n\n// 语音验证码\nSms::voice('02343')-\u003eto($to)-\u003esend();\n\n// 语音验证码兼容模版语音(如阿里大鱼的文本转语音)\nSms::voice('02343')\n    -\u003etemplate('Alidayu', 'your_tts_code')\n    -\u003edata(['code' =\u003e '02343'])\n    -\u003eto($to)\n    -\u003esend();\n```\n\n### 3. 在laravel和lumen中使用\n\n* 服务提供器\n\n```php\n//服务提供器\n'providers' =\u003e [\n    ...\n    Toplan\\PhpSms\\PhpSmsServiceProvider::class,\n]\n\n//别名\n'aliases' =\u003e [\n    ...\n    'PhpSms' =\u003e Toplan\\PhpSms\\Facades\\Sms::class,\n]\n```\n\n* 生成配置文件\n\n```php\nphp artisan vendor:publish\n```\n生成的配置文件为config/phpsms.php，然后在该文件中按提示配置。\n\n* 使用\n\n详见API，示例：\n```php\nPhpSms::make()-\u003eto($to)-\u003econtent($content)-\u003esend();\n```\n\n# API\n\n## API - 全局配置\n\n### Sms::scheme([$name[, $scheme]])\n\n设置/获取代理器的调度方案。\n\n\u003e 调度配置支持热更新，即在应用系统的整个运行过程中都能随时修改。\n\n- 设置\n\n手动设置代理器调度方案(优先级高于配置文件)，如：\n```php\nSms::scheme([\n    'SmsBao' =\u003e '80 backup'\n    'YunPian' =\u003e '100 backup'\n]);\n//或\nSms::scheme('SmsBao', '80 backup');\nSms::scheme('YunPian', '100 backup');\n```\n- 获取\n\n通过该方法还能获取所有或指定代理器的调度方案，如：\n```php\n//获取所有的调度方案:\n$scheme = Sms::scheme();\n\n//获取指定代理器的调度方案:\n$scheme['SmsBao'] = Sms::scheme('SmsBao');\n```\n\n\u003e `scheme`静态方法的更多使用方法见[高级调度配置](#高级调度配置)\n\n### Sms::config([$name[, $config][, $override]]);\n\n设置/获取代理器的配置数据。\n\n\u003e 参数配置支持热更新，即在应用系统的整个运行过程中都能随时修改。\n\n- 设置\n\n手动设置代理器的配置数据(优先级高于配置文件)，如：\n```php\nSms::config([\n   'SmsBao' =\u003e [\n       'username' =\u003e ...,\n       'password' =\u003e ...,\n   ]\n]);\n//或\nSms::config('SmsBao', [\n   'username' =\u003e ...,\n   'password' =\u003e ...,\n]);\n```\n- 获取\n\n通过该方法还能获取所有或指定代理器的配置参数，如：\n```php\n//获取所有的配置:\n$config = Sms::config();\n\n//获取指定代理器的配置:\n$config['SmsBao'] = Sms::config('SmsBao');\n```\n\n### Sms::beforeSend($handler[, $override]);\n\n发送前钩子，示例：\n```php\nSms::beforeSend(function($task, $index, $handlers, $prevReturn){\n    //获取短信数据\n    $smsData = $task-\u003edata;\n    ...\n    //如果返回false会终止发送任务\n    return true;\n});\n```\n\u003e 更多细节请查看 [task-balancer](https://github.com/toplan/task-balancer#2-task-lifecycle) 的 `beforeRun` 钩子\n\n### Sms::beforeAgentSend($handler[, $override]);\n\n代理器发送前钩子，示例：\n```php\nSms::beforeAgentSend(function($task, $driver, $index, $handlers, $prevReturn){\n    //短信数据:\n    $smsData = $task-\u003edata;\n    //当前使用的代理器名称:\n    $agentName = $driver-\u003ename;\n    //如果返回false会停止使用当前代理器\n    return true;\n});\n```\n\u003e 更多细节请查看 [task-balancer](https://github.com/toplan/task-balancer#2-task-lifecycle) 的 `beforeDriverRun` 钩子\n\n### Sms::afterAgentSend($handler[, $override]);\n\n代理器发送后钩子，示例：\n```php\nSms::afterAgentSend(function($task, $agentResult, $index, $handlers, $prevReturn){\n     //$result为代理器的发送结果数据\n     $agentName = $agentResult['driver'];\n     ...\n});\n```\n\u003e 更多细节请查看 [task-balancer](https://github.com/toplan/task-balancer#2-task-lifecycle) 的 `afterDriverRun` 钩子\n\n### Sms::afterSend($handler[, $override]);\n\n发送后钩子，示例：\n```php\nSms::afterSend(function($task, $taskResult, $index, $handlers, $prevReturn){\n    //$result为发送后获得的结果数组\n    $success = $taskResult['success'];\n    ...\n});\n```\n\u003e 更多细节请查看 [task-balancer](https://github.com/toplan/task-balancer#2-task-lifecycle) 的 `afterRun` 钩子\n\n### Sms::queue([$enable[, $handler]])\n\n该方法可以设置是否启用队列以及定义如何推送到队列。\n\n`$handler`匿名函数可使用的参数:\n+ `$sms` : Sms实例\n+ `$data` : Sms实例中的短信数据，等同于`$sms-\u003eall()`\n\n定义如何推送到队列：\n```php\n//自动启用队列\nSms::queue(function($sms, $data){\n    //define how to push to queue.\n    ...\n});\n\n//第一个参数为true,启用队列\nSms::queue(true, function($sms, $data){\n    //define how to push to queue.\n    ...\n});\n\n//第一个参数为false,暂时关闭队列\nSms::queue(false, function($sms, $data){\n    //define how to push to queue.\n    ...\n});\n```\n\n如果已经定义过如何推送到队列，还可以继续设置关闭/开启队列：\n```php\nSms::queue(true);//开启队列\nSms::queue(false);//关闭队列\n```\n\n获取队列启用情况：\n```php\n$enable = Sms::queue();\n//为true,表示当前启用了队列。\n//为false,表示当前关闭了队列。\n```\n\n## API - 发送相关\n\n### Sms::make()\n\n生成发送短信的sms实例，并返回实例。\n```php\n$sms = Sms::make();\n\n//创建实例的同时设置短信内容：\n$sms = Sms::make('【签名】这是短信内容...');\n\n//创建实例的同时设置短信模版：\n$sms = Sms::make('YunTongXun', 'your_temp_id');\n//或\n$sms = Sms::make([\n    'YunTongXun' =\u003e 'your_temp_id',\n    'SubMail' =\u003e 'your_temp_id',\n    ...\n]);\n```\n\n### Sms::voice()\n\n生成发送语音验证码的sms实例，并返回实例。\n```php\n$sms = Sms::voice();\n\n//创建实例的同时设置验证码\n$sms = Sms::voice($code);\n```\n\n\u003e - 如果你使用`Luosimao`语音验证码，还需用在配置文件中`Luosimao`选项中设置`voiceApikey`。\n\u003e - **语音文件ID**即是在服务商配置的语音文件的唯一编号，比如阿里大鱼[语音通知](http://open.taobao.com/doc2/apiDetail.htm?spm=a219a.7395905.0.0.oORhh9\u0026apiId=25445)的`voice_code`。\n\u003e - **模版语音**是另一种语音请求方式，它是通过模版ID和模版数据进行的语音请求，比如阿里大鱼的[文本转语音通知](http://open.taobao.com/doc2/apiDetail.htm?spm=a219a.7395905.0.0.f04PJ3\u0026apiId=25444)。\n\n### type($type)\n\n设置实例类型，可选值有`Sms::TYPE_SMS`和`Sms::TYPE_VOICE`，返回实例对象。\n\n### to($mobile)\n\n设置发送给谁，并返回实例。\n```php\n$sms-\u003eto('1828*******');\n\n//兼容腾讯云\n$sms-\u003eto([86, '1828*******'])\n```\n\n### template($agentName, $id)\n\n指定代理器设置模版或批量设置，并返回实例。\n```php\n//设置指定服务商的模板id\n$sms-\u003etemplate('YunTongXun', 'your_temp_id')\n    -\u003etemplate('SubMail', 'your_temp_id');\n\n//一次性设置多个服务商的模板id\n$sms-\u003etemplate([\n    'YunTongXun' =\u003e 'your_temp_id',\n    'SubMail' =\u003e 'your_temp_id',\n    ...\n]);\n```\n\n### data($key, $value)\n\n设置模板短信的模板数据，并返回实例对象。\n```php\n//单个数据\n$sms-\u003edata('code', $code);\n\n//同时设置多个数据\n$sms-\u003edata([\n    'code' =\u003e $code,\n    'minutes' =\u003e $minutes\n]);\n```\n\n\u003e 通过`template`和`data`方法的组合除了可以实现模版短信的数据填充，还可以实现模版语音的数据填充。\n\n### content($text)\n\n设置内容短信的内容，并返回实例对象。\n\n\u003e 一些内置的代理器(如SmsBao、YunPian、Luosimao)使用的是内容短信(即直接发送短信内容)，那么就需要为它们设置短信内容。\n\n```php\n$sms-\u003econtent('【签名】这是短信内容...');\n```\n\n### code($code)\n\n设置语音验证码，并返回实例对象。\n\n### file($agentName, $id)\n\n设置语音文件，并返回实例对象。\n```php\n$sms-\u003efile('Agent1', 'agent1_file_id')\n    -\u003efile('Agent2', 'agent2_file_id');\n\n//或\n$sms-\u003efile([\n    'Agent1' =\u003e 'agent1_file_id',\n    'Agent2' =\u003e 'agent2_fiile_id',\n]);\n```\n\n### params($agentName, $params)\n\n直接设置参数到服务商提供的原生接口上，并返回实例对象。\n```php\n$sms-\u003eparams('Agent1', [\n    'callbackUrl' =\u003e ...,\n    'userData'    =\u003e ...,\n]);\n\n//或\n$sms-\u003eparams([\n    'Agent1' =\u003e [\n        'callbackUrl' =\u003e ...,\n        'userData'    =\u003e ...,\n    ],\n    'Agent2' =\u003e [\n        ...\n    ],\n]);\n```\n\n### all([$key])\n\n获取Sms实例中的短信数据，不带参数时返回所有数据，其结构如下：\n```php\n[\n    'type'      =\u003e ...,\n    'to'        =\u003e ...,\n    'templates' =\u003e [...],\n    'data'      =\u003e [...], // template data\n    'content'   =\u003e ...,\n    'code'      =\u003e ...,   // voice code\n    'files'     =\u003e [...], // voice files\n    'params'    =\u003e [...],\n]\n```\n\n### agent($name)\n\n临时设置发送时使用的代理器(不会影响备用代理器的正常使用)，并返回实例，`$name`为代理器名称。\n```php\n$sms-\u003eagent('SmsBao');\n```\n\u003e 通过该方法设置的代理器将获得绝对优先权，但只对当前短信实例有效。\n\n### send()\n\n请求发送短信/语音验证码。\n```php\n//会遵循是否使用队列\n$result = $sms-\u003esend();\n\n//忽略是否使用队列\n$result = $sms-\u003esend(true);\n```\n\n\u003e `$result`数据结构请参看[task-balancer](https://github.com/toplan/task-balancer)\n\n# 自定义代理器\n\n- step 1\n\n可将配置项(如果有用到)加入到`config/phpsms.php`中键为`agents`的数组里。\n\n```php\n//example:\n'Foo' =\u003e [\n    'key' =\u003e 'your api key',\n    ...\n]\n```\n\n- step 2\n\n新建一个继承`Toplan\\PhpSms\\Agent`抽象类的代理器类，建议代理器类名为`FooAgent`，建议命名空间为`Toplan\\PhpSms`。\n\n\u003e 如果类名不为`FooAgent`或者命名空间不为`Toplan\\PhpSms`，在使用该代理器时则需要指定代理器类，详见[高级调度配置](#高级调度配置)。\n\n- step 3\n\n实现相应的接口，可选的接口有:\n\n| 接口           | 说明         |\n| ------------- | :----------: |\n| ContentSms    | 发送内容短信   |\n| TemplateSms   | 发送模版短信   |\n| VoiceCode     | 发送语音验证码 |\n| ContentVoice  | 发送内容语音   |\n| TemplateVoice | 发送模版语音   |\n| FileVoice     | 发送文件语音   |\n\n# 高级调度配置\n\n代理器的高级调度配置可以通过配置文件(`config/phpsms.php`)中的`scheme`项目配置，也可以通过`scheme`静态方法设置。\n值得注意的是，高级调度配置的值的数据结构是数组。\n\n### 指定代理器类\n\n如果你自定义了一个代理器，类名不为`FooAgent`或者命名空间不为`Toplan\\PhpSms`，\n那么你还可以在调度配置时指定你的代理器使用的类。\n\n* 配置方式：\n\n通过配置值中`agentClass`键来指定类名。\n\n* 示例：\n```php\nSms::scheme('agentName', [\n    '10 backup',\n    'agentClass' =\u003e 'My\\Namespace\\MyAgentClass'\n]);\n```\n\n### 寄生代理器\n\n如果你既不想使用内置的代理器，也不想创建文件写自定义代理器，那么寄生代理器或许是个好的选择，\n无需定义代理器类，只需在调度配置时定义好发送短信和语音验证码的方式即可。\n\n* 配置方式：\n\n可以配置的发送过程有:\n\n| 发送过程           | 参数列表                        | 说明         |\n| ----------------- | :---------------------------: | :----------: |\n| sendContentSms    | $agent, $to, $content         | 发送内容短信   |\n| sendTemplateSms   | $agent, $to, $tmpId, $tmpData | 发送模版短信   |\n| sendVoiceCode     | $agent, $to, $code            | 发送语音验证码  |\n| sendContentVoice  | $agent, $to, $content         | 发送内容语音   |\n| sendTemplateVoice | $agent, $to, $tmpId, $tmpData | 发送模版语音   |\n| sendFileVoice     | $agent, $to, $fileId          | 发送文件语音   |\n\n* 示例：\n```php\nSms::scheme([\n    'agentName' =\u003e [\n        '20 backup',\n        'sendContentSms' =\u003e function($agent, $to, $content){\n            // 获取配置(如果设置了的话):\n            $key = $agent-\u003ekey;\n            ...\n            // 可使用的内置方法:\n            $agent-\u003ecurlGet($url, $params); //get\n            $agent-\u003ecurlPost($url, $params); //post\n            ...\n            // 更新发送结果:\n            $agent-\u003eresult(Agent::SUCCESS, true);\n            $agent-\u003eresult(Agent::INFO, 'some info');\n            $agent-\u003eresult(Agent::CODE, 'your code');\n        },\n        'sendVoiceCode' =\u003e function($agent, $to, $code){\n            // 发送语音验证码，同上\n        }\n    ]\n]);\n```\n\n# Todo\n\n- [ ] 重新实现云通讯代理器，去掉`lib/CCPRestSmsSDK.php`\n- [ ] 重新实现云之讯代理器，去掉`lib/Ucpaas.php`\n- [ ] 升级云片接口到v2版本\n\n# License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoplan%2Fphpsms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoplan%2Fphpsms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoplan%2Fphpsms/lists"}