# 服务研发
* * * * *
### 需求分析
服务架构中已经讲过服务与驱动的概念了,现在来研发一个服务与驱动,本来还在考虑弄个神马服务,得有代表性并且易用才行,看到群里小伙伴发言于是决定就弄个短信服务好咯。
![](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)
- 序言
- 基础
- 安装环境
- 安装演示
- 规范
- 目录
- 介绍
- 后台介绍
- 后台首页
- 会员管理
- 系统管理
- 系统设置与配置管理
- 菜单管理
- 系统回收站
- 服务管理
- 插件管理
- 文章管理
- 接口管理
- 优化维护
- SEO管理
- 数据库
- 文件清理
- 行为日志
- 执行记录
- 统计分析
- 接口介绍
- 接口文档
- 错误码设计
- Token介绍
- 前台介绍
- 架构
- 架构总览
- 生命周期
- 入口文件
- 模块设计
- 依赖注入
- 控制器架构
- 逻辑架构
- 验证架构
- 服务架构
- 模型架构
- 行为架构
- 插件架构
- 配置
- 配置介绍
- 配置加载
- 配置扩展
- 请求
- 请求信息
- 日志
- 后台行为日志
- 系统执行日志
- 框架日志
- 数据
- 数据库设计
- 数据字典
- 数据库操作
- 事务控制
- 混合操作
- 实战
- 控制器
- 逻辑与验证
- 视图与模型
- 插件研发
- 服务研发
- 接口研发
- 杂项
- 数据导入导出
- 二维码条形码
- 邮件发送
- 云存储服务
- 支付服务
- 短信服务
- 微信分享
- 生成海报
- 聊天室
- PJAX
- Demo
- Widget
- 附录
- 常量参考
- 配置参考
- 函数参考
- 进阶
- Redis
- 自动缓存
- 全自动缓存
- 索引
- 数据签名
- 全自动事务
- 队列