dever 6 年之前
当前提交
1dc63c64f8
共有 13 个文件被更改,包括 776 次插入0 次删除
  1. 14 0
      LICENSE
  2. 2 0
      README.md
  3. 24 0
      api/main.php
  4. 42 0
      config/base.php
  5. 84 0
      database/code.php
  6. 84 0
      database/info.php
  7. 8 0
      index.php
  8. 104 0
      lib/Base.php
  9. 86 0
      sdk/aliyun/SignatureHelper.php
  10. 72 0
      sdk/aliyun/demo/querySendDetails.php
  11. 97 0
      sdk/aliyun/demo/sendBatchSms.php
  12. 83 0
      sdk/aliyun/demo/sendSms.php
  13. 76 0
      src/Api.php

+ 14 - 0
LICENSE

@@ -0,0 +1,14 @@
+Apache License
+Copyright 2016-2017 Dever(dever.cc)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 2 - 0
README.md

@@ -0,0 +1,2 @@
+# sms
+

+ 24 - 0
api/main.php

@@ -0,0 +1,24 @@
+<?php
+# 注册api,这里是为了安全考虑,否则可以不用在此注册,注册之后
+# api仅有三种类型:get、update、delete
+
+return array
+(
+	'api.send' => array
+	(
+		'name' => '发送短信',
+		'request' => array
+		(
+			'sid' => '临时id',
+			'skin' => '模板',
+		),
+		'response' => array
+		(
+			'info' => '响应信息',
+		),
+		'order' => 100,
+		'type' => 2,
+		# 安全加密
+		'secure' => true,
+	),
+);

+ 42 - 0
config/base.php

@@ -0,0 +1,42 @@
+<?php
+
+# 一些基本配置
+$config['base'] = array
+(
+	'sms' => array
+	(
+		# 验证码的cookie标识
+		'code' => 'dever_code',
+		# debug模式
+		'debug' => true,
+		# 短信是否调取sdk,如果只是接口则直接填写url
+		'sdk' => 'aliyu',
+		# 发送短信的接口
+		'url' => '',
+		# 发送方法 get、post
+		'method' => 'get',
+		# 是否json编码
+		'json' => false,
+		# header信息
+		'header' => '',
+		# body信息
+		'body' => 'param={code}&phone={mobile}&sign={sign}&skin={skin}',
+		# 短信模板 发送短信时,请加上参数skin=1
+		'skin' => array
+		(
+			1 => '{sign}您好,您的验证码为{code},十分钟之内有效。',
+		),
+		# 短信签名
+		'sign' => '【DEVER】',
+		# 验证码有效期 默认10分钟
+		'timeout' => 600,
+		# 一天之内的最大发送次数,默认为10次
+		'total' => 10,
+		# 不允许多久之内重复发送,默认为60秒
+		'time' => 60,
+		# 验证码长度
+		'length' => 4,
+	),
+);
+
+return $config;

+ 84 - 0
database/code.php

@@ -0,0 +1,84 @@
+<?php
+
+$mobile = Dever::rule('mobile');
+
+return array
+(
+	# 表名
+	'name' => 'code',
+	# 显示给用户看的名称
+	'lang' => '验证码',
+	'menu' => false,
+	# 数据结构
+	'struct' => array
+	(
+	
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+
+		'mobile'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '手机号',
+			'default' 	=> '',
+			'desc' 		=> '请输入用户手机号',
+			'match' 	=> $mobile,
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'code'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '验证码',
+			'default' 	=> '',
+			'desc' 		=> '验证码',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'day'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '申请时间',
+			'default' 	=> '',
+			'desc' 		=> '申请时间',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '申请时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'search'	=> 'date',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+);

+ 84 - 0
database/info.php

@@ -0,0 +1,84 @@
+<?php
+
+$mobile = Dever::rule('mobile');
+
+return array
+(
+	# 表名
+	'name' => 'info',
+	# 显示给用户看的名称
+	'lang' => '短信消息',
+	'menu' => false,
+	# 数据结构
+	'struct' => array
+	(
+	
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+
+		'mobile'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '手机号',
+			'default' 	=> '',
+			'desc' 		=> '请输入用户手机号',
+			'match' 	=> $mobile,
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'msg'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '短信内容',
+			'default' 	=> '',
+			'desc' 		=> '短信内容',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'day'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '申请时间',
+			'default' 	=> '',
+			'desc' 		=> '申请时间',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '申请时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'search'	=> 'date',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+);

+ 8 - 0
index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'sms');
+define('DEVER_APP_LANG', '短信管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', -10);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-list-alt');
+include(DEVER_APP_PATH . '../boot.php');

+ 104 - 0
lib/Base.php

@@ -0,0 +1,104 @@
+<?php
+namespace Sms\Lib;
+
+use Dever;
+
+class Base
+{
+    const NAME = 'dever_passport';
+
+    const CODE = 'dever_code';
+
+    const MCODE = 'dever_mcode';
+
+    protected $config;
+
+    public function __construct()
+    {
+        $this->config = Dever::config('base', 'project')->sms;
+    }
+
+    protected function code($mobile, $code = false)
+    {
+        if ($code) {
+            $save = $this->save->get($this->config['code']);
+            return $mobile . '_' . $code == $save;
+        }
+
+        $day = date('Ymd', time());
+
+        # 检测当前手机号最新一次发送时间,不允许一分钟之内发送
+        $param['option_day'] = $day;
+        $param['option_mobile'] = $mobile;
+
+        # 检测当前手机号今天已经发送多少验证码了
+        $info = Dever::load('sms/code-total', $param);
+
+        if ($info >= 1) {
+            $check = Dever::load('sms/code-one', $param);
+
+            if ($check) {
+                if (time() - $check['cdate'] < $this->config['time']) {
+                    Dever::alert('请不要在一分钟之内申请多次验证码,请您稍后再试');
+                }
+            }
+        }
+
+        $total = $this->config['total'];
+        if ($info >= $total) {
+            Dever::alert('很抱歉,您已经申请获取验证码超过' . $total . '次,今天您已经无法获取验证码了,请您明天再来');
+        }
+
+        $code = new Code();
+        $code->createM();
+
+        # 记录当前的验证码
+        $insert['add_mobile'] = $mobile;
+        $insert['add_day'] = $day;
+        $insert['add_code'] = $code->mcode;
+        $id = Dever::load('passport/code-insert', $insert);
+
+        # 启动发送
+        $this->send($mobile, $insert['add_code'], $id);
+
+        $this->save->add($this->config['code'], $mobile . '_' . $code->mcode, $this->config['timeout']);
+
+        return $code->mcode;
+    }
+
+    protected function send($mobile, $code, $id = false)
+    {
+        $url = $this->config['url'];
+
+        if (!$url) {
+            return;
+        }
+
+        $content = $this->config['body'];
+
+        $content = $this->replace($content, $mobile, $code);
+
+        parse_str($content, $param);
+
+        $type = $this->config['method'];
+        $json = $this->config['json'];
+        $header = $this->config['header'];
+
+        return Dever::curl($url, $param, $type, $json, $header);
+    }
+
+    private function replace($content, $mobile = '', $code = '')
+    {
+        $skin = $this->config['skin'];
+        $skin_key = Dever::input('skin', 1);
+        if (isset($skin[$skin_key])) {
+            $skin = $skin[$skin_key];
+        } else {
+            $skin = array_shift($skin);
+        }
+
+        $config = array('{code}', '{mobile}', '{sign}', '{skin}', '{param}');
+        $replace = array($code, $mobile, $this->config['sign'], $skin);
+        return str_replace($config, $replace, $content);
+    }
+}

+ 86 - 0
sdk/aliyun/SignatureHelper.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace Aliyun\DySDKLite;
+
+/**
+ * 签名助手 2017/11/19
+ *
+ * Class SignatureHelper
+ */
+class SignatureHelper {
+
+    /**
+     * 生成签名并发起请求
+     *
+     * @param $accessKeyId string AccessKeyId (https://ak-console.aliyun.com/)
+     * @param $accessKeySecret string AccessKeySecret
+     * @param $domain string API接口所在域名
+     * @param $params array API具体参数
+     * @param $security boolean 使用https
+     * @return bool|\stdClass 返回API接口调用结果,当发生错误时返回false
+     */
+    public function request($accessKeyId, $accessKeySecret, $domain, $params, $security=false) {
+        $apiParams = array_merge(array (
+            "SignatureMethod" => "HMAC-SHA1",
+            "SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
+            "SignatureVersion" => "1.0",
+            "AccessKeyId" => $accessKeyId,
+            "Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
+            "Format" => "JSON",
+        ), $params);
+        ksort($apiParams);
+
+        $sortedQueryStringTmp = "";
+        foreach ($apiParams as $key => $value) {
+            $sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
+        }
+
+        $stringToSign = "GET&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1));
+
+        $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true));
+
+        $signature = $this->encode($sign);
+
+        $url = ($security ? 'https' : 'http')."://{$domain}/?Signature={$signature}{$sortedQueryStringTmp}";
+
+        try {
+            $content = $this->fetchContent($url);
+            return json_decode($content);
+        } catch( \Exception $e) {
+            return false;
+        }
+    }
+
+    private function encode($str)
+    {
+        $res = urlencode($str);
+        $res = preg_replace("/\+/", "%20", $res);
+        $res = preg_replace("/\*/", "%2A", $res);
+        $res = preg_replace("/%7E/", "~", $res);
+        return $res;
+    }
+
+    private function fetchContent($url) {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+            "x-sdk-client" => "php/2.0.0"
+        ));
+
+        if(substr($url, 0,5) == 'https') {
+            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+        }
+
+        $rtn = curl_exec($ch);
+
+        if($rtn === false) {
+            trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
+        }
+        curl_close($ch);
+
+        return $rtn;
+    }
+}

+ 72 - 0
sdk/aliyun/demo/querySendDetails.php

@@ -0,0 +1,72 @@
+<?php
+/*
+ * 此文件用于验证短信服务API接口,供开发时参考
+ * 执行验证前请确保文件为utf-8编码,并替换相应参数为您自己的信息,并取消相关调用的注释
+ * 建议验证前先执行Test.php验证PHP环境
+ *
+ * 2017/11/30
+ */
+
+namespace Aliyun\DySDKLite\Sms;
+
+require_once "../SignatureHelper.php";
+
+use Aliyun\DySDKLite\SignatureHelper;
+
+/**
+ * 短信发送记录查询
+ */
+function querySendDetails() {
+
+    $params = array ();
+
+    // *** 需用户填写部分 ***
+
+    // fixme 必填: 请参阅 https://ak-console.aliyun.com/ 取得您的AK信息
+    $accessKeyId = "your access key id";
+    $accessKeySecret = "your access key secret";
+
+    // fixme 必填: 短信接收号码
+    $params["PhoneNumber"] = "17000000000";
+
+    // fixme 必填: 短信发送日期,格式Ymd,支持近30天记录查询
+    $params["SendDate"] = "20170710";
+
+    // fixme 必填: 分页大小
+    $params["PageSize"] = 10;
+
+    // fixme 必填: 当前页码
+    $params["CurrentPage"] = 1;
+
+    // fixme 可选: 设置发送短信流水号
+    $params["BizId"] = "yourBizId";
+
+    // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
+
+    // 初始化SignatureHelper实例用于设置参数,签名以及发送请求
+    $helper = new SignatureHelper();
+
+    // 此处可能会抛出异常,注意catch
+    $content = $helper->request(
+        $accessKeyId,
+        $accessKeySecret,
+        "dysmsapi.aliyuncs.com",
+        array_merge($params, array(
+            "RegionId" => "cn-hangzhou",
+            "Action" => "QuerySendDetails",
+            "Version" => "2017-05-25",
+        ))
+        // fixme 选填: 启用https
+        // ,true
+    );
+
+    return $content;
+}
+
+ini_set("display_errors", "on"); // 显示错误提示,仅用于测试时排查问题
+// error_reporting(E_ALL); // 显示所有错误提示,仅用于测试时排查问题
+set_time_limit(0); // 防止脚本超时,仅用于测试使用,生产环境请按实际情况设置
+header("Content-Type: text/plain; charset=utf-8"); // 输出为utf-8的文本格式,仅用于测试
+
+// 验证查询短信发送情况(QuerySendDetails)接口
+print_r(querySendDetails());

+ 97 - 0
sdk/aliyun/demo/sendBatchSms.php

@@ -0,0 +1,97 @@
+<?php
+/*
+ * 此文件用于验证短信服务API接口,供开发时参考
+ * 执行验证前请确保文件为utf-8编码,并替换相应参数为您自己的信息,并取消相关调用的注释
+ * 建议验证前先执行Test.php验证PHP环境
+ *
+ * 2017/11/30
+ */
+
+namespace Aliyun\DySDKLite\Sms;
+
+require_once "../SignatureHelper.php";
+
+use Aliyun\DySDKLite\SignatureHelper;
+
+
+/**
+ * 批量发送短信
+ */
+function sendBatchSms() {
+
+    $params = array ();
+
+    // *** 需用户填写部分 ***
+
+    // fixme 必填: 请参阅 https://ak-console.aliyun.com/ 取得您的AK信息
+    $accessKeyId = "your access key id";
+    $accessKeySecret = "your access key secret";
+
+    // fixme 必填: 待发送手机号。支持JSON格式的批量调用,批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
+    $params["PhoneNumberJson"] = array(
+        "1500000000",
+        "1500000001",
+    );
+
+    // fixme 必填: 短信签名,支持不同的号码发送不同的短信签名,每个签名都应严格按"签名名称"填写,请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
+    $params["SignNameJson"] = array(
+        "云通信",
+        "云通信2",
+    );
+
+    // fixme 必填: 短信模板Code,应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
+    $params["TemplateCode"] = "SMS_1000000";
+
+    // fixme 必填: 模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+    // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
+    $params["TemplateParamJson"] = array(
+        array(
+            "name" => "Tom",
+            "code" => "123",
+        ),
+        array(
+            "name" => "Jack",
+            "code" => "456",
+        ),
+    );
+
+    // todo 可选: 上行短信扩展码, 扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段
+    // $params["SmsUpExtendCodeJson"] = json_encode(array("90997","90998"));
+
+
+    // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
+    $params["TemplateParamJson"]  = json_encode($params["TemplateParamJson"], JSON_UNESCAPED_UNICODE);
+    $params["SignNameJson"] = json_encode($params["SignNameJson"], JSON_UNESCAPED_UNICODE);
+    $params["PhoneNumberJson"] = json_encode($params["PhoneNumberJson"], JSON_UNESCAPED_UNICODE);
+
+    if(!empty($params["SmsUpExtendCodeJson"] && is_array($params["SmsUpExtendCodeJson"]))) {
+        $params["SmsUpExtendCodeJson"] = json_encode($params["SmsUpExtendCodeJson"], JSON_UNESCAPED_UNICODE);
+    }
+
+    // 初始化SignatureHelper实例用于设置参数,签名以及发送请求
+    $helper = new SignatureHelper();
+
+    // 此处可能会抛出异常,注意catch
+    $content = $helper->request(
+        $accessKeyId,
+        $accessKeySecret,
+        "dysmsapi.aliyuncs.com",
+        array_merge($params, array(
+            "RegionId" => "cn-hangzhou",
+            "Action" => "SendBatchSms",
+            "Version" => "2017-05-25",
+        ))
+        // fixme 选填: 启用https
+        // ,true
+    );
+
+    return $content;
+}
+
+ini_set("display_errors", "on"); // 显示错误提示,仅用于测试时排查问题
+// error_reporting(E_ALL); // 显示所有错误提示,仅用于测试时排查问题
+set_time_limit(0); // 防止脚本超时,仅用于测试使用,生产环境请按实际情况设置
+header("Content-Type: text/plain; charset=utf-8"); // 输出为utf-8的文本格式,仅用于测试
+
+// 验证发送短信(SendSms)接口
+print_r(sendBatchSms());

+ 83 - 0
sdk/aliyun/demo/sendSms.php

@@ -0,0 +1,83 @@
+<?php
+/*
+ * 此文件用于验证短信服务API接口,供开发时参考
+ * 执行验证前请确保文件为utf-8编码,并替换相应参数为您自己的信息,并取消相关调用的注释
+ * 建议验证前先执行Test.php验证PHP环境
+ *
+ * 2017/11/30
+ */
+
+namespace Aliyun\DySDKLite\Sms;
+
+require_once "../SignatureHelper.php";
+
+use Aliyun\DySDKLite\SignatureHelper;
+
+
+/**
+ * 发送短信
+ */
+function sendSms() {
+
+    $params = array ();
+
+    // *** 需用户填写部分 ***
+
+    // fixme 必填: 请参阅 https://ak-console.aliyun.com/ 取得您的AK信息
+    $accessKeyId = "your access key id";
+    $accessKeySecret = "your access key secret";
+
+    // fixme 必填: 短信接收号码
+    $params["PhoneNumbers"] = "17000000000";
+
+    // fixme 必填: 短信签名,应严格按"签名名称"填写,请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
+    $params["SignName"] = "短信签名";
+
+    // fixme 必填: 短信模板Code,应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
+    $params["TemplateCode"] = "SMS_0000001";
+
+    // fixme 可选: 设置模板参数, 假如模板中存在变量需要替换则为必填项
+    $params['TemplateParam'] = Array (
+        "code" => "12345",
+        "product" => "阿里通信"
+    );
+
+    // fixme 可选: 设置发送短信流水号
+    $params['OutId'] = "12345";
+
+    // fixme 可选: 上行短信扩展码, 扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段
+    $params['SmsUpExtendCode'] = "1234567";
+
+
+    // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
+    if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
+        $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
+    }
+
+    // 初始化SignatureHelper实例用于设置参数,签名以及发送请求
+    $helper = new SignatureHelper();
+
+    // 此处可能会抛出异常,注意catch
+    $content = $helper->request(
+        $accessKeyId,
+        $accessKeySecret,
+        "dysmsapi.aliyuncs.com",
+        array_merge($params, array(
+            "RegionId" => "cn-hangzhou",
+            "Action" => "SendSms",
+            "Version" => "2017-05-25",
+        ))
+        // fixme 选填: 启用https
+        // ,true
+    );
+
+    return $content;
+}
+
+ini_set("display_errors", "on"); // 显示错误提示,仅用于测试时排查问题
+// error_reporting(E_ALL); // 显示所有错误提示,仅用于测试时排查问题
+set_time_limit(0); // 防止脚本超时,仅用于测试使用,生产环境请按实际情况设置
+header("Content-Type: text/plain; charset=utf-8"); // 输出为utf-8的文本格式,仅用于测试
+
+// 验证发送短信(SendSms)接口
+print_r(sendSms());

+ 76 - 0
src/Api.php

@@ -0,0 +1,76 @@
+<?php
+namespace Sms\Src;
+
+use Dever;
+use Passport\Lib\Base;
+
+class Api extends Base
+{
+    public function test()
+    {
+        return Dever::login(-1);
+    }
+
+    public function quit()
+    {
+        if ($this->info()) {
+            $this->save->un(self::NAME);
+        }
+
+        $refer = isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : Dever::url('home', 'main');
+
+        Dever::location($refer);
+    }
+
+    public function action()
+    {
+        $account = Dever::config('base', 'project')->account;
+
+        $param['option_' . $account] = Dever::input($account);
+
+        $password = sha1(Dever::input('password'));
+
+        $user = Dever::load('passport/user-login', $param);
+
+        if ($user && $password == $user['password']) {
+            $this->save($user);
+
+            $this->refer();
+        } else {
+            Dever::alert('您的账号或密码错误');
+        }
+    }
+
+    public function check()
+    {
+        if ($this->info()) {
+            $url = $this->refer(true);
+            return Dever::location($url);
+        }
+    }
+
+    public function get()
+    {
+        return $this->info();
+    }
+
+    public function url()
+    {
+        return Dever::url('login?' . $this->createRefer(), 'main');
+    }
+
+    public function location()
+    {
+        return Dever::location($this->url());
+    }
+
+    public function oauth($url = false)
+    {
+        if (!$url) {
+            $url = Dever::url();
+        }
+        $link = Dever::url('get.request?refer=' . urlencode($url), 'oauth');
+
+        return $link;
+    }
+}