# 服务研发 * * * * * ### 需求分析 服务架构中已经讲过服务与驱动的概念了,现在来研发一个服务与驱动,本来还在考虑弄个神马服务,得有代表性并且易用才行,看到群里小伙伴发言于是决定就弄个短信服务好咯。 ![](https://box.kancloud.cn/f6947dcec2a176abaab575745506b608_400x282.png) 那就来个短信服务,并且集成阿里大鱼驱动,希望此篇看完后童鞋们可以自己动手研发各种服务。 阿里大鱼。。。说实话作者只是听说过并没有使用过。。但是觉得这些根本不是啥问题。 百度了一下阿里大鱼,找到了阿里大鱼的PHP版本SDK,解压后里面有 4个 文件:Demo.php EnvTest.php SignatureHelper.php SmsApi.php 然后就直接来看看Demo 毕竟之前也没有使用过。。 ![](https://box.kancloud.cn/0769cd96fbb6e0098ed61f2979a9a3ff_1311x901.png) 看到这个Demo 就分析出了一些问题: 第19行,需要准备两个参数 虽然没有看阿里大鱼的技术文档,但是通过项目经验猜测也应该类似七牛的SK 与 AK,应该是在阿里云后台设置的。 第21行-30行,里面这些参数可能也是阿里云后台设置的,奇怪的是短信签名也要设置吗?于是打开阿里大鱼后台看了下,的确是有短信签名申请,这样就大概明白了,除了接收者 也就是 手机号码 还有 code 也就是验证码 其他的应该都是短信后台能找到的参数。 好了,分析出了需要准备哪些参数,那么就去阿里大鱼的后台把这些信息找出来,进去后发现申请签名和申请模板功能,再看看 21 - 30 行的参数里面有短信签名和模板编号,那就知道了 需要申请这些,申请后发现还需要漫长的等待。 ![](https://box.kancloud.cn/963e85dfc72c4d5efd6e0eb5a55154cf_1868x350.png) ![](https://box.kancloud.cn/5028c0fac56c5383c3ebc552c3216aec_1865x393.png) 好了,等待过后申请的短信签名【OneBase架构】和短信验证码模板都审核通过了。 那接下来咱们来看看 sk 和 ak 到哪里弄,于是接下来各种搜索各种找终于发现了在哪里弄。 ![](https://box.kancloud.cn/a232e54cbeaabd3f724688cead2a4ab9_1918x613.png) 在阿里云的 访问控制 RAM 里面,加一个用户然后就有 sk 和 ak 了,一切就绪,那么来开始接入。 * * * * * ### 服务研发 不管三七二十一,先按之前已经研发好的服务,先将目录及文件结构弄出来再说。 ![](https://box.kancloud.cn/d0cef147f824c8e454073dcb61fc06df_396x902.png) 可以看到sms短信服务是参考支付服务把目录和文件都建好了,driver/alidy 下的两个文件是从大鱼的SDK里面复制过来的类,当然文件里面的命名空间需要修改为咱们当前目录对应的命名空间。 下面来从外面Sms.php 挨着往里面实现,打开服务基础接口BaseInterface一看就知道 serviceInfo 方法是所有服务都要实现的,于是先将 serviceInfo 信息改改。 Sms.php 写完后的代码如下: ~~~ <?php // +---------------------------------------------------------------------+ // | OneBase | [ WE CAN DO IT JUST THINK ] | // +---------------------------------------------------------------------+ // | Licensed | http://www.apache.org/licenses/LICENSE-2.0 ) | // +---------------------------------------------------------------------+ // | Author | Bigotry <3162875@qq.com> | // +---------------------------------------------------------------------+ // | Repository | https://gitee.com/Bigotry/OneBase | // +---------------------------------------------------------------------+ namespace app\common\service; /** * 短信服务 */ class Sms extends ServiceBase implements BaseInterface { /** * 服务基本信息 */ public function serviceInfo() { return ['service_name' => '短信服务', 'service_class' => 'Sms', 'service_describe' => '系统短信服务,用于整合多个短信平台', 'author' => 'Bigotry', 'version' => '1.0']; } } ~~~ 再打开支付服务的驱动接口文件Driver.php文件,可以发现,前面三个方法是服务通用方法,那我们copy前面三个方法过来,再加一个 发送短信的方法,实现 sms 的 Driver.php 代码如下: ~~~ <?php // +---------------------------------------------------------------------+ // | OneBase | [ WE CAN DO IT JUST THINK ] | // +---------------------------------------------------------------------+ // | Licensed | http://www.apache.org/licenses/LICENSE-2.0 ) | // +---------------------------------------------------------------------+ // | Author | Bigotry <3162875@qq.com> | // +---------------------------------------------------------------------+ // | Repository | https://gitee.com/Bigotry/OneBase | // +---------------------------------------------------------------------+ namespace app\common\service\sms; use app\common\service\BaseInterface; /** * 短信服务驱动 */ interface Driver extends BaseInterface { /** * 获取驱动参数 */ public function getDriverParam(); /** * 获取基本信息 */ public function driverInfo(); /** * 配置信息 */ public function config(); /** * 发送短信 */ public function sendSms($parameter); } ~~~ OK 了,接口方法都定义完成了,下面来实现具体驱动方法,sms/driver/Alidy.php 实现后的代码如下: ~~~ <?php // +---------------------------------------------------------------------+ // | OneBase | [ WE CAN DO IT JUST THINK ] | // +---------------------------------------------------------------------+ // | Licensed | http://www.apache.org/licenses/LICENSE-2.0 ) | // +---------------------------------------------------------------------+ // | Author | Bigotry <3162875@qq.com> | // +---------------------------------------------------------------------+ // | Repository | https://gitee.com/Bigotry/OneBase | // +---------------------------------------------------------------------+ namespace app\common\service\sms\driver; use app\common\service\sms\Driver; use app\common\service\Sms; /** * 阿里大鱼短信服务驱动 */ class Alidy extends Sms implements Driver { /** * 驱动基本信息 */ public function driverInfo() { return ['driver_name' => '阿里大鱼驱动', 'driver_class' => 'Alidy', 'driver_describe' => '阿里大鱼短信驱动', 'author' => 'Bigotry', 'version' => '1.0']; } /** * 获取驱动参数 */ public function getDriverParam() { return ['access_key' => '阿里大鱼密钥AK', 'secret_key' => '阿里大鱼密钥SK']; } /** * 获取配置信息 */ public function config() { return $this->driverConfig('Alidy'); } /** * 发送短信 */ public function sendSms($parameter = []) { $alidy_config = $this->config(); $sms = new alidy\SmsApi($alidy_config['access_key'], $alidy_config['secret_key']); $response = $sms->sendSms( $parameter['sign_name'], $parameter['template_code'], $parameter['phone_number'], $parameter['template_param'] ); return $response->Code == 'OK' ? true : false; } } ~~~ 为什么知道阿里大鱼 $response->Code 等于 OK 就是 成功呢? 知道的渠道有两种,一种是查看阿里大鱼提供的手册或Demo,还有一种是通过返回的结果进行分析,作者是将 $response 输出后看到 Code 是 OK,就明白了 返回 OK 就是发送成功。 下面来看看短信服务如何使用。 * * * * * ### 服务使用 打开系统的服务管理 ![](https://box.kancloud.cn/61d04f98dc907a7fddce39027557221b_1918x591.png) 可以看到刚才研发的短信服务了,咱们再点开驱动。 ![](https://box.kancloud.cn/a5e7c8b4ffc7ba830298a649a2ad729d_1911x587.png) 可以看到阿里大鱼驱动了,那么再点一下安装呢。 ![](https://box.kancloud.cn/9ae91d0a7e1fe9510cdfa1cb495fe84b_1915x584.png) 想必大家有个疑问,系统怎么知道阿里大鱼需要 ak 和 sk 呢? 万一以后我们整合其他短信平台需要 username 和 password 咋办? ![](https://box.kancloud.cn/b56ad2a7e76e703435a4982f742c0166_1219x642.png) 看明白了吧,不管驱动依赖啥,在驱动参数这里根据驱动所需依赖的数据进行配置就好了,这样在安装驱动的时候 就会自动生成表单录入这些信息,这里就把上面作者找了好久的ak和sk输入进去安装一下,提示安装成功咯。 关键时刻到了,来测试一下短信发送功能。 测试短信服务业务逻辑层代码如下: ~~~ /** * 测试短信服务 */ public function sendSms() { $parameter['sign_name'] = 'OneBase架构'; $parameter['template_code'] = 'SMS_113455309'; $parameter['phone_number'] = '18555550710'; $parameter['template_param'] = ['code' => '123456']; return $this->serviceSms->driverAlidy->sendSms($parameter); } ~~~ 测试短信服务控制器层代码如下: ~~~ $test = new LogicTest(); $test->sendSms(); ~~~ 执行一下,于是听到叮咚~。 嘿嘿,大功告成。 ![](https://box.kancloud.cn/193f9679a0feaace485511e5bf0b1bac_639x1136.png) ![](https://box.kancloud.cn/0e5467d5c3c7a722b1d4fd070acbc713_639x1136.png)