# 服務研發
* * * * *
### 需求分析
服務架構中已經講過服務與驅動的概念了,現在來研發一個服務與驅動,本來還在考慮弄個神馬服務,得有代表性并且易用才行,看到群里小伙伴發言于是決定就弄個短信服務好咯。

那就來個短信服務,并且集成阿里大魚驅動,希望此篇看完后童鞋們可以自己動手研發各種服務。
阿里大魚。。。說實話作者只是聽說過并沒有使用過。。但是覺得這些根本不是啥問題。
百度了一下阿里大魚,找到了阿里大魚的PHP版本SDK,解壓后里面有 4個 文件:Demo.php EnvTest.php SignatureHelper.php SmsApi.php 然后就直接來看看Demo 畢竟之前也沒有使用過。。

看到這個Demo 就分析出了一些問題:
第19行,需要準備兩個參數 雖然沒有看阿里大魚的技術文檔,但是通過項目經驗猜測也應該類似七牛的SK 與 AK,應該是在阿里云后臺設置的。
第21行-30行,里面這些參數可能也是阿里云后臺設置的,奇怪的是短信簽名也要設置嗎?于是打開阿里大魚后臺看了下,的確是有短信簽名申請,這樣就大概明白了,除了接收者 也就是 手機號碼 還有 code 也就是驗證碼 其他的應該都是短信后臺能找到的參數。
好了,分析出了需要準備哪些參數,那么就去阿里大魚的后臺把這些信息找出來,進去后發現申請簽名和申請模板功能,再看看 21 - 30 行的參數里面有短信簽名和模板編號,那就知道了 需要申請這些,申請后發現還需要漫長的等待。


好了,等待過后申請的短信簽名【OneBase架構】和短信驗證碼模板都審核通過了。
那接下來咱們來看看 sk 和 ak 到哪里弄,于是接下來各種搜索各種找終于發現了在哪里弄。

在阿里云的 訪問控制 RAM 里面,加一個用戶然后就有 sk 和 ak 了,一切就緒,那么來開始接入。
* * * * *
### 服務研發
不管三七二十一,先按之前已經研發好的服務,先將目錄及文件結構弄出來再說。

可以看到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 就是發送成功。
下面來看看短信服務如何使用。
* * * * *
### 服務使用
打開系統的服務管理

可以看到剛才研發的短信服務了,咱們再點開驅動。

可以看到阿里大魚驅動了,那么再點一下安裝呢。

想必大家有個疑問,系統怎么知道阿里大魚需要 ak 和 sk 呢? 萬一以后我們整合其他短信平臺需要 username 和 password 咋辦?

看明白了吧,不管驅動依賴啥,在驅動參數這里根據驅動所需依賴的數據進行配置就好了,這樣在安裝驅動的時候 就會自動生成表單錄入這些信息,這里就把上面作者找了好久的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();
~~~
執行一下,于是聽到叮咚~。 嘿嘿,大功告成。


- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列