# 应用开发

# 开发须知

# 1、必须认证小储开发者

# 2、拥有小储程序授权,用于调试你的应用!

# 3、必须加入小储开发者交流群:1142527578

# 4、拥有PHP开发经验或前端开发经验!

# 5、知道如何看文档,理解力强,会问问题,咨询大佬时永远不要问无用的问题,如在吗?,在?,直接说有什么事,说清楚就行,这样子可以节省双方的时间

Ps:若您已经满足以上条件,即可开始阅读文档,了解本系统的开发思路,开发模式,有什么不懂的地方可以前往开发者交流群咨询!

# 目录结构

.
├── admin (站长后台)
├── assets (站点资源目录)
├── includes (方法目录,所有的类,方法全部存放在此)
├───├─── extend(扩展类)
├───├────├─── log(网站缓存,日志)
├───├────├───├─── Astrict(重复订单限制)
├───├────├───├─── Backup(网站数据备份)
├───├────├───├─── Cache(货源目录缓存)
├───├────├───├─── Cookie(货源登陆Cookie)
├───├────├───├─── Home(首页缓存文件,包含请求缓存)
├───├────├───├─── Image(商品海报缓存图片)
├───├────├───├─── ShopImage(商品海报合成部件缓存)
├───├────├───├─── Order(订单缓存)
├───├────├───├─── safety(安全中心日志缓存)
├───├────├───├─── Supply(货源对接日志缓存)
├───├─── lib(静态类)
├───├────├─── AppStore(应用操作)
├───├────├─── framework(文件自动引入)
├───├────├─── Hook(钩子触发器操作)
├───├────├─── medoo(Medoo数据库操作)
├───├────├─── Pay(站点支付操作)
├───├────├─── rule(下单输入规则操作)
├───├────├─── soft(站点应用均存放在此)
├───├────├───├─── conf(应用配置)
├───├────├───├─── controller(应用控制器)
├───├────├───├─── view(应用视图文件)
├───├────├─── supply(货源对接,订单操作)
├── install (程序安装)
├── template (站点模板视图文件)
├───├─── default(默认模板文件存放处)
├── user (用户后台)
├───├─── image(用户推广图片存放处)
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

此目录结构适用于V1.9+版本,开发应用时需了解

# 插件开发

# 1、插件开发须知

# 1、应用安装成功后会生成一个json配置文件,如:d41cxxxxx2faef38d87fxxxxx3ce9c0_conf.json,由当前站点的安装token+_conf.json 组成,文件存放地址:conf/应用标识/

# 2、插件应用视图文件目录下必须创建一个index.TP文件,打开应用设置面板时默认载入此文件,文件存放地址:view/应用标识/index.TP

# 3、每一个应用都有一个独一无二的应用标识,英文或数字组合,和应用目录名称保持一致,如应用标识为:epay,则应用控制器文件存储位置为:controller/epay/index.php,如下所示 插件目录

# 4、每一个插件应用必须拥有一个帮助文件,文件名称:help.html ,存放位置:conf/应用标识/help.html

Ps:插件的所有配置应当全部存放在conf/应用标识/ 目录下,所有视图文件,应当存放在 view/应用标识/ 目录下,所有控制器,应当存放在 controller/应用标识/ 目录下!

# 2、插件目录结构

应用存放目录:/includes/lib/soft/
/soft/
├── conf/应用标识/ 应用配置文件
├── controller/应用标识/ 应用控制器文件
├── view/应用标识/ 应用视图文件
.
1
2
3
4
5

# 网站防CC插件实例文件结构(图示):

网站防CC插件实列1 网站防CC插件实列2 压缩包为插件安装包。结构如上!
实列安装包可在下方SDK下载里面下载查看!

# 3、控制器开发规范:

创建新文件:/includes/lib/soft/controller/应用标识/index.php

调用示例(接口调用方法):?AppApies&identification=应用标识&name=我是内容  
<?php

namespace lib;

class 你设置的应用标识
{
    /**
     * @param array $Data
     * 控制器入口
     */
    public static function origin(array $Data)
    {
        //在里面进行功能开发,必须严格遵循此规范!
        //调用此应用时,传递的参数均在此处 $Data 函数内
        return self::Test($Data['name']); //打印:我是内容
    }
    
    /**
     * 简单调用
     */
    public static function Test($name)
    {
        return $name;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

这只是一个简单的例子,若需要完整实例可在此处下载:SDK及DEOM下载

# 4、调用控制器方法

调用方法有三种!
1、全局调用:需达到2级开发者才可使用,访问站点任何地方均可调用控制器,传递当前所有的请求数据到控制器内,如防CC插件就是一个很好的全局调用例子,可在此处下载:SDK及DEOM下载
2、接口调用:任意等级开发者均可使用,通过请求指定的url链接调用控制器,调用例子:

?AppApies&identification=应用标识&name=我是内容


以上请求可以将name=我是内容传递到了控制器的 $Data 内,如上所示 查看
3、钩子调用:用于开发特殊功能的应用,本系统内置了大量的钩子,可以通过给应用注册对应的钩子触发器来调用您开发的应用控制器,可以实现如打开首页时调用,创建新订单时调用,用户登陆时调用,用户提交工单时调用等!具体调用方法和注册方法可前往 应用钩子 查看

# 5、插件提审图示

# 1、打开APP或小程序,H5内的开放平台

打开开放平台

# 2、认证通过后,点击发布新品,如下图填写,填写完成后发布即可!

认证图示 发布时填写规则请参考下方 发布说明

# 模板开发

# 1、模板开发须知

# 1、模板开发难度较低,只需要开发者会一点前端知识即可开始着手开发,开发时需阅读:开放接口,根据本系统提供的开放接口实现对应的功能!

# 2、你如果需要模板实现独立的功能,可以自写应用控制器,然后你的模板对接,可以实现很多功能,如拼团,砍价等,均可直接仿照插件开发模式进行开发,模板对接合并即可

# 3、首页模板缓存问题,系统安装完成后站点编辑内的 { 首页数据缓存周期 } 默认是60秒,也就是说,每隔60秒才会加载一次新数据,如果是调试开发,建议直接设置1秒,如图所示!

网站首页缓存

# 2、模板目录结构

模板文件存放目录:/template/,所有的首页模板文件均存放于此

模板默认文件目录:/template/default/,若你选择的模板文件不存在,则会直接导向此目录

# 模板安装包目录结构如下:

/template/应用标识/index.php 模板入口文件,选择此模板后用户打开首页默认载入此文件
/template/应用标识/route.php 此为模板路由导航文件,用于适配各种模板的路由,必须存在此文件

如果你的模板需要控制面板,扩展功能的话,可以写一个控制器,实现扩展功能 ↓
/includes/lib/soft/controller/应用标识/help.html  创建帮助文档
/includes/lib/soft/conf/应用标识/index.php  创建控制器
/includes/lib/soft/view/应用标识/index.TP   创建操作面板
1
2
3
4
5
6
7

# 3、模板提审规范

# 和插件规范差不多,只需要将类型切换为模板!

# 提审时的安装路径直接填写:/

可在下方sdk及demo下载 内下载简单的模板开发例子

# 4、模板扩展方法

本系统创建模板扩展有两种方法:
1、插件式扩展:参考插件开发,实现开发模板时所需的接口,功能等,然后在你开发的模板内调用即可!
2、内置式扩展:你只需要在模板安装包文件内,创建php文件,就可以通过下列方法调用这个文件,如果扩展文件不存在,则会在 /template/default/ 目录下查找此文件,如果也没有,会返回文件不存在的提示!

/template/应用标识/扩展文件.php 创建扩展文件

访问:/?mod=扩展文件名称  返回模板扩展文件内的内容,调用此文件的前提是已经在后台切换到这个模板哦!
1
2
3

# 支付开发

# 1、支付开发须知

# 1、支付接口应用本质上和插件开发差不多,只不过是加入了某些文件,必须按照某种规范来进行开发而已,阅读前可先阅读一遍 插件开发

# 2、您只需要按照SDK里面的例子进行开发即可,其他的统统不用操心

# 2、支付开发规范

# 1、控制器规范:

<?php

namespace lib;

use lib\AppStore\AppList;
use lib\Pay\Pay;
use Medoo\DB\SQL;

class 应用标识
{
    /**
     * @param array $Data
     * 控制器入口
     */
    public static function origin(array $Data)
    {
        switch ($Data['typeS']) {
            case 1: //获取付款地址
                self::payment($Data['pid']);
                break;
            case 2: //唤起支付
                self::arouse($Data['pid']);
                break;
            case 3: //异步通知
                self::asynchronization($Data);
                break;
            case 4: //同步通知
                self::synchronization($Data);
                break;
        }
    }

    /**
     * @param $Pid 商品订单ID
     * 获取付款链接
     */
    public static function payment($Pid)
    {
        //返回支付链接,返回参数必须和下方保持一致!
        dier([
            'code' => 2,
            'msg' => '付款链接创建成功!',
            'url' => is_https(false) . href() . '/?AppApies&identification=应用标识&pid=' . $Pid . '&typeS=2',
            'pid' => $Pid
        ]);
    }

    /**
     * 唤起支付
     */
    public static function arouse($Pid)
    {
        global $conf;
        $DB = SQL::DB();

        $Order = $DB->get('pay', '*', [
            'id' => (int)$Pid,
        ]);
        @header('Content-Type: text/html; charset=UTF-8');

        if (!$Order) show_msg('警告', '支付Pid[' . $Pid . ']无对应支付订单,请直接关闭当前界面!', 2, false, false);

        if ($Order['state'] == 1) show_msg('恭喜', '此订单已完成,若有漏单情况,可联系客服处理!', 2, false, false);

        switch ($Order['type']) {
            case 'qqpay':
                if ($conf['PayConQQ'] == -1) show_msg('警告', '当前QQ支付通道未开启!', 2, false, false);
                $PayData = AppList::AppConf($conf['PayConQQ'])['Data'][0];
                break;
            case 'wxpay':
                if ($conf['PayConWX'] == -1) show_msg('警告', '当前微信支付通道未开启!', 2, false, false);
                $PayData = AppList::AppConf($conf['PayConWX'])['Data'][1];
                break;
            case 'alipay':
                if ($conf['PayConZFB'] == -1) show_msg('警告', '当前支付宝支付通道未开启!', 2, false, false);
                $PayData = AppList::AppConf($conf['PayConZFB'])['Data'][2];
                break;
            default:
                show_msg('警告', '当前选择的付款方式不存在!', 2, false, false);
                break;
        }

        foreach ($PayData as $v) {
            if ($v == '') show_msg('警告', '此支付通道未配置完善,无法使用!', 2, false, false);
        }

        /**
         * 写入异步回调日志
         */
        if ($conf['userdomaintype'] == 2 && isset($_COOKIE['league'])) {
            file_put_contents(ROOT . 'includes/extend/log/Order/' . $Order['order'] . '.log', xiaochu_de($_COOKIE['league']));
        }

        //执行支付跳转!
        //$PayData = 当前用户所选支付接口信息
    }

    /**
     * @param $Order 订单号
     * 防止异步同步同时进行!
     */
    public static function obstruct($Order, $Type = 1)
    {
        $Flie = ROOT . '/includes/extend/log/Astrict/OrderEpay_' . $Order . '.log';
        if (file_exists($Flie)) {
            if ($Type == 1) {
                @header('Content-Type: text/html; charset=UTF-8');
                show_msg('温馨提示', '当前订单已经完成,若有漏单情况可联系客服处理,点击下方查看订单!', 2, '/?mod=route&p=Order');
            } else die('success');
        } else @file_put_contents($Flie, time());
    }

    /**
     * 异步通知
     */
    public static function asynchronization($Data)
    {
        self::obstruct($Data['out_trade_no'], 2);
        global $conf;
        //此处编写异步回调规则
        //需在此处理订单付款后的操作
        /**
         *  $Order = 当前支付订单的信息
         *  $Data = [
         *      "out_trade_no"=>"本地支付订单号",
         *      "trade_no"=>"接口方支付订单号",
         *  ];
         *  $Data必须携带者out_trade_no和trade_no参数!
         */
        //调用方法:Pay::PaySuccess($Order, $Data); 即可执行付款后操作
        //仅可返回:success 或 fail ,成功或失败!
    }

    /**
     * 同步通知
     */
    public static function synchronization($Data)
    {
        /**
         * 同步暂停0.3秒防止和异步冲突!
         */
        usleep(1000 * 1000 * 0.3);
        self::obstruct($Data['out_trade_no'], 1);
        global $conf;

        //此处编写同步回调规则
        //需在此处理订单付款后的操作
        /**
         *  $Order = 当前支付订单的信息
         *  $Data = [
         *      "out_trade_no"=>"本地支付订单号",
         *      "trade_no"=>"接口方支付订单号",
         *  ];
         *  $Data必须携带者out_trade_no和trade_no参数!
         */
        //调用方法:Pay::PaySuccess($Order, $Data); 即可执行付款后操作
        //可返回:处理结果,如:show_msg('温馨提示', '订单已完成,请点击下方按钮继续!', 1, '/?mod=route&p=Order');
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

# 2、为你的支付应用在系统内注册!

系统是无法自动识别这个应用是不是支付应用的,您需要按照下方操作步骤为您的支付插件在系统内注册:

# 第一步:创建配置文件

在你的应用 /conf/应用标识/ 目录下创建 payconf.json 文件!
和为插件注册钩子步骤差不多,只不过文件名称变成了 payconf.json ,如果没有这个文件,就判定为普通插件,无法在支付通道列表内选择!

# 第二步:编写配置文件(注释记得删除)
//格式如下
{
  "state": "1,1,1", //顺序:QQ,微信,支付宝 | 参数: =1可用 ,=0不可用
  "input": "输入框1名称,输入框2名称,输入框3名称" 
  //输入框可以无限加,用户填写信息后,可在唤起支付方法内的 $PayData 里面读取信息
}

//支付宝当面付例子:
{
  "state": "0,0,1", //只有支付宝可以使用
  "input": "商品自定义名称,支付宝公钥,商户私钥,应用ID"
}

//易支付例子:
{
  "state": "1,1,1", //全部支付通道可用
  "input": "接口地址,商户ID,商户KEY"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 编辑完成后保存即可!

# 3、支付相关文件

/includes/CallBack.php //支付回调接收地址
/includes/lib/Pay/Pay.php //支付总控类文件,所有支付有关的操作均在此处处理
1
2

# 4、支付回调地址

# 异步回调地址填写:

is_https(false) . href() . '/includes/CallBack.php?uis=3HsD应用标识';  //3HsD 代表异步

# 同步回调地址填写:

is_https(false) . href() . '/includes/CallBack.php?uis=4HsD应用标识';  //4HsD 代表同步

# 需要用到的参数:

is_https(false) . href() = http(s): //站点域名,加在回调地址前面即可

# 5、支付提审规范

和插件提交审核的方法没什么不一样,其中内置验证选择:Home,调用方法选择接口调用即可!

# 内置方法

# 相关说明

TIP

系统内置方法较多,目前无法给出完整方法列表,暂时只列出几个常用/实用的方法!

# 数据库操作:

本系统目前有两种数据库操作类:

# 1、$DB类调用(半废弃状态),执行原生SQL语句,示例:

<?php

class Test{
    public static function SQL(){
       global $DB;
       $DB->get_row("SQL语句"); //用于单条数据查询!
       $DB->query("SQL语句"); //可以执行增删改查SQL语句!
       $DB->count("SQL语句"); //应用数据行数查询,数量查询等,count(*) sum(*)
    }
}
1
2
3
4
5
6
7
8
9
10

# 2、Medoo数据库框架操作(PDO)(中文文档),调用示例:

<?php

use Medoo\DB\SQL; //引入Medoo框架

class Test{
    public static function SQL(){
       $DB = \Medoo\DB\SQL::DB(); //习惯命名为$DB,可以自定义函数名
       //简单操作演示
       $Goods = $DB->get('goods','*',['gid'=>1]); //将商品ID=1的商品数据写入到 $Goods函数内
       $GoodsArr = $DB->select('goods','*',['state'=>1]); //取出state=1的商品列表。写入到 $GoodsArr 里面
       //表名不需要填写前缀,sky_ 直接填写名称goods即可
       //其他使用方法可以参考Medoo文档 https://medoo.lvtao.net/1.2/doc.php
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 字符串加密/解密

# 1、加密:xiaochu_en("待加密的字符串","解密KEY");

$a = xiaochu_en("123456",666); //获得加密后的字符串
return "加密后的字符串:".$a;
1
2

# 2、解码:xiaochu_de("待解码的字符串","解密KEY");

$b = xiaochu_de("已经加密过的字符串",666); //获得解码后的字符串
return "解密后的字符串:".$b;
1
2

# Curl请求 POST/GET

$DATA = get_curl("URL","POST数据"); //基本上只会用到这两个参数
return $DATA; //打印出远程数据
1
2

# 常用全局函数


class Test{
    public static function SQL(){
       global $_QET,$conf,$date,$ip,$mid_arr;
       $_QET; //可以打印出$_GET,$_POST,$_FILES 内的数据,可以过滤掉用户的恶意请求
       $conf; //可以打印出站点全局配置数据,详细可查看 includes/fun.test.php 文件内config_verify方法
       $date; //打印出当前时间如:2020-07-05 20:28:42
       $ip; //打印出当前访问用户的IP地址
       $mid_arr; //打印出当前站点配置的用户等级列表数据!
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 返回提示信息

//此方法是全局方法,和die,exit 函数差不多
show_msg("提示框标题","提示内容","1=成功,2=注意,3=普通,4=警告","跳转链接,留空返回上一步","=false不显示按钮");
//演示
show_msg('温馨提示','没什么好说的!');
1
2
3
4

# 返回JSON格式提示信息


dies(1,666); //= die(json_encode(['code' => 1, 'msg' => 666]));

dier(['code'=>1, 'msg'=>'恭喜,ID获取成功']); //= die(json_encode(['code'=>1, 'msg'=>'恭喜,ID获取成功']));
1
2
3
4

# 获取用户的登陆状态

$User = login_data::user_data(); //这是全局方法,随时随地都可以调用
if($User==false){
    return '未登录';
}else return '已登陆,$User已经写入当前登陆用户的信息';
1
2
3
4

# 发布说明

TIP

应用开发完成后,可根据下方填写帮助来进行填写!
注意:提审的应用必须为未加密状态,如果需要给应用里面的文件加密(仅限插件),可联系开发者交流群内的管理员,告诉他有哪些文件是需要加密的,应用审核完成后,会帮您应用的指定文件进行加密处理!

# 1、发布模式

发布模式分为两种
1、审核模式,选择审核模式时发布会将应用设置为审核状态,审核员在后台可以看到你提审的应用,审核通过后,应用会在应用商店内显示!
2、沙盒模式,选择沙盒模式时,应用会进入沙盒状态,发布者可在自己的网站后台,应用商店/我的/沙盒测试 里面找到自己的应用,用于应用调试开发

# 2、应用类型

应用类型也分为两种,用于应用商店内的分类,一种是插件类,一种是模板类

# 3、内置验证类型

应用内置验证类型分为三种:
1、Admin,此应用只可可以在主站登陆状态下打开,调用
2、User,此应用只可在用户登陆状态下打开,调用
3、Home,此应用可在任何情况下打开,无任何限制!
具体选择哪一个,需要你根据实际情况自行选择,或可以自写验证,进行开发

# 4、应用内置调用方式

内置应用调用模式有两种:
1、全局调用,此调用方法只可使用Home内置验证模式,选择此模式的应用会在每次打开网站时执行控制器里面的方法,可用做请求拦截等,网站防CC插件是一个很好的全局调用例子
2、接口调用,此调用方法一般用于应用设置等,调用方法:?AppApies&identification=应用标识&xxx=xxx(xxx为自定义参数!) 自定义参数可以传递到对应应用的控制器内,可以通过传递的参数来执行对应的方法!

# 5、应用唯一标识

应用标识是唯一的,你可以自由创建,创建之后无法修改,由英文数字组成,您的应用文件目录组成必须和应用标识对应,如插件可以参考插件目录结构,如果是模板的话,则模板目录名称必须为应用标识!否则无法通过审核,直接驳回!

# 6 、应用名称

顾名思义,应用的名称,记得起好听点,虽然可以换,但是发布后换有点麻烦哦

# 7、应用图标路径

应用图标外链必须使用 官方云存储空间,否则无法提审哦,空间地址:进入 http://cdn.vue8.cn

# 8、购买等级限制

顾名思义,用户达到指定等级才可购买你发布的应用!

# 9、安装路径

安装路径可以根据你安装包内的文件内容来决定,如直接填写:/ 安装应用后会直接将安装包解压到根目录!,填写:includes/lib/soft/ 会解压到 soft 目录内!

# 10、购买应用30天的价格

应用售价,每次购买可用30天,到期后无法使用,发布者购买应用不扣款,发布者可在后台设置折扣率!,0=免费

# 11、应用文件下载链接

应用文件外链必须使用 官方云存储空间,否则无法提审哦,空间地址:进入 http://cdn.vue8.cn
安装包格式必须为ZIP,否则直接审核失败!

# 12、可用客户端版本

目前V1.9+版本有三种填写模式
1、all,全版本客户端可用!
2、填写最低可用客户端版本号,如V1.92,则低于此版本的客户端均无法安装发布的应用!
3、填写最低可用版本和最高可用版本,如V1.7,V1.9,则此应用只可以在1.7版本到1.9版本之间的客户端安装,用英文逗号分割,提交应用时会自动验证!

# 13、应用简介

3、用于介绍你发布应用!,用户点击应用详情时可看到!

# 输入验证

# 规则介绍

问:匹配字段如何填写,有什么作用?
答:匹配字段可填写多个,中间用 | 符号分割,作用是匹配下单输入框的名称,如果匹配字段和输入框的名称对应,则会显示对应功能,按钮,提示等,可以根据需求开发对应的插件!
问:匹配规则文件存储在哪里?
答:存储路径:includes/lib/rule/rule.php 如有需要可手动进行编写!
问:传值内容怎么选择,有什么区别?
答:传值内容分为两种,一种是单输入框提交,只将当前匹配成功的输入框内容提交至指定接口!,另外一种是多输入框提交,会一次提交全部输入框内容,便于开发者调整!

# 自定义API注意事项

如果想要调用本站内置接口,自定义接口必须在前面加上[url],[url] = 当前站点链接,否则会访问失败哦!
另外你的自定义接口是处于暴露状态,需自行做中转,防止接口核心数据外泄!

# includes/lib/rule/rule.php文件内的规则参数注解:

'name' => '点我一下', //按钮名称
'type' => -1|1, //-1自定义远程数据接口,1收货地址
'url' => 'http://baidu.com', //自定义接口调用地址
'way' => 1|2, //1:提交单输入框的值,2:提交全部输入框的值
'placeholder' => '请将下单信息填写完整!', //匹配成功的输入框提示信息
1
2
3
4
5

# 提交参数说明

way参数=1时,点击按钮接口会收到如下参数:

value:当前按钮输入框的值
1

way参数=2时,点击按钮接口会收到如下参数:

value0:对应输入框1
value1:对应输入框2
value2:对应输入框3
value3:对应输入框4
...
1
2
3
4
5

#way=1时,你的自定义接口必须返回如下参数:

'code' => '1', //返回判断参数>=0为成功
'msg' => 'xxxx', //提示信息,用户可看到,支持html代码
'value' => 'xxxx',  //此参数内容会替换掉当前输入框的值
'js'=>'js代码'; //可有可无,用于补缺,提示后的确认按钮触发
1
2
3
4

#way=2时,你的自定义接口必须返回如下参数:

'code' => '1', //返回判断参数>=0为成功
'msg' => 'xxxx', //提示信息,用户可看到,支持html代码
'data' => ['输入框1','输入框2','输入框3'],  //此参数内容会替换掉全部输入框的值,按需修改即可!
'js'=>'js代码'; //可有可无,用于补缺,提示后的确认按钮触发
1
2
3
4

# 添加新规则的方法

# 1、登陆站长后台
# 2、打开 便捷模块/输入验证
# 3、点击新增规则按钮,按需填写!

图片演示

# 升级说明

# 应用钩子

# 钩子相关介绍

TIP

钩子的作用很简单,就是在用户执行某一操作时,触发已经在此操作相关钩子内注册的应用,传递对应的参数到指定控制器内,完成某种特定的操作,可以将本程序的钩子理解成 程序里面的触发器,用户执行某种操作就会触发对应的触发器!
简单的打个比方,用户评价了商品,就会触发钩子:AppraiseNew,凡是在AppraiseNew钩子内注册的应用均会执行一遍!,执行时会将当前评价相关详细信息传递到注册过此钩子的应用控制器内,应用可以通过对应数据执行对应的操作!

# 1、钩子大全(按需新增中,可在开发者交流群提需)

# OrderPriceSet 订单价格调整钩子 (传递用户购买信息+计算后的正常商品价格)

订单改价钩子使用须知

此钩子返回的数据会直接用做订单生成数据处理,不可做请求拦截,可以修改接收到的字段里面的数据,但是除钩子字段外的字段均要返回,否则此钩子无效,此钩子可以用来开发优惠券,满减,免单类插件!
此钩子并不会影响前台显示,之后在付款后才可以看到结果,可以利用 VisitHome + VisitMod 两个钩子来做购买时的提示!另外此钩子对免费商品无效哦
最低可用版本:V1.96
挂载点:用户普通下单购买,用户队列订单购买,用户购物车结算

# 数据详解,您可在下方数据上做变动,返回后直接可改变商品价格:
Type:1=在线支付,2=余额付款,3=积分兑换(无需返回)
Price:最终价格计算结果,包含运费,份数后的计算结果哦(需返回处理后的数据)
InputData:用户提交的商品下单信息(需返回处理后的数据)
Gid:商品ID(需返回一模一样的数据,只读)
Num:购买份数(需返回处理后的数据)
Uid:购买用户ID,如果是游客就等于-1(需返回一模一样的数据,只读)
HookName:钩子名称(无需返回)
1
2
3
4
5
6
7

# OrderAdd 创建新的待处理订单触发(传递订单完整信息,此处是未成功发货的订单信息+商品名称)商品名称参数最低可用版本:V1.97

# OrderFinish 订单完成后触发(传递订单完整信息,包含订单处理结果+商品名称)商品名称参数最低可用版本:V1.97

# GoodsAdd 创建商品触发(传递商品完整数据)

# GoodsSet 修改商品触发(传递商品完整数据)

# GoodsPriceSet 修改商品售价触发(传递当前商品ID+变动后每份的价格+原价+商品名称)最低可用版本:V1.97

# GoodsShow 商品显示时触发(传递当前商品id+商品名称)商品名称参数最低可用版本:V1.98

# GoodsHide 商品掩藏时触发(传递当前商品id+商品名称)商品名称参数最低可用版本:V1.98

# GoodsDel 商品删除时触发(传递删除的商品id+商品名称)最低可用版本:V1.96,V1.98新增商品名传递

# ClassAdd 创建分类触发 (传递分类完整数据)

# ClassShow 分类显示时触发 (传递当前分类的信息)

# ClassHide 分类掩藏时触发 (传递当前分类的信息)

# ClassDel 分类删除时触发(传递删除的分类id+分类名称,删除分类后,分类下的所有商品均会删除) 最低可用版本:V1.96,V1.98新增分类名传递

# ApiSubmit Api商品对接之前触发(传递订单信息+接口地址+向api接口的提交信息)

# ApiFinish Api商品对接之后触发(传递订单信息+接口地址+api接口返回的信息)

# FakaLater 发卡商品刚验证完库存后触发,此时尚未修改库存内的卡密状态,尚未执行OrderFinish钩子(传递订单信息+即将发卡的卡号,可做拦截器,发送邮件卡密等)

# JiuwuSubmit 玖伍商品对接之前触发(传递订单信息+接口地址+除了账号密码外的提交信息)

# JiuwuFinish 玖伍商品对接之后触发(传递订单信息+接口地址+对接玖伍货源的返回信息,已经对数据进行过一次处理)

# KayixSubmit 卡易信商品对接之前触发(传递订单信息+接口地址+除了账号密码外的提交信息)

# KayixFinish 卡易信商品对接之后触发(传递订单信息+接口地址+已经转换后的返回数据)

# XiaochuSubmit 小储商品对接之前触发(传递订单信息+接口地址+除了账号密码外的提交信息)

# XiaochuFinish 小储商品对接之后触发(传递订单信息+接口地址+已经转换后的返回数据)

# YileSubmit 亿乐商品对接之前触发(传递订单信息+接口地址+除了账号密码外的提交信息)

# YileFinish 亿乐商品对接之后触发(传递订单信息+接口地址+已经转换后的返回数据)

# GoodsList 读取商品列表时触发 (传递当前列表的分类ID+当前用户的ID,如果ID=-1,则是游客状态)

# VisitHome 用户访问商城首页时触发(仅访问首页时触发,无任何数据传递,若要获取IP可自行在控制器内获取)

Ps:使用此钩子时,页面编码会变为 application/json ,需将编码改成 text/html,如插入:
header('Content-Type: text/html; charset=UTF-8');

# VisitMod 用户访问前台扩展时触发(访问扩展路由时触发,可做请求拦截,载入自定义界面!)

Ps:使用此钩子时,页面编码会变为 application/json ,需将编码改成 text/html,如插入:
header('Content-Type: text/html; charset=UTF-8');

# VisitUser 用户访问用户后台时触发(访问用户后台时触发,这是用户后台全局参数,可做界面请求拦截,传递界面请求数据,仅在登陆成功时有效)

# VisitAdmin 用户访问站长后台时触发(访问站长后台时触发,这是站长后台全局参数,可做界面请求拦截,传递界面请求数据,仅在登陆成功时有效)

# WithdrawNew 用户发起提现时触发 (传递提现信息)

# WithdrawAudit 站长审核提现时触发 (传递处理结果,每次处理提现都是直接处理掉当前用户下所有的提现订单!)

# AppraiseNew 用户评价订单时触发 (传递当前评价相关详细信息)

# AppraiseAudit 用户评价审核时触发 (传递评价的ID+处理结果)

# UserLogin 用户登陆时触发(传递当前登陆用户的ID+用户名)

# UserLogout 用户注销时触发 (传递当前登陆用户的ID+用户名)

# UserRegister 用户注册时触发(传递当前注册用户的ID+用户名))

# CartAdd 购物车新增时触发(传递添加到购物车内的下单信息)

# CartDel 购物车删除时触发(传递购物车id+移除后的购物车商品列表信息)

# ConfirmReceipt 订单确认收货时触发(传递完整的收货订单信息)

# SharePoster 创建商品海报图之前触发(传递要创建海报图的商品ID,可做请求拦截,返回自定义海报图片)

# GuessYouLike 获取推荐商品时触发(传递页码信息,如果是在商品详情页内打开的,会传递商品ID,用作商品推荐排除!)

# PayMoney 余额付款成功时触发(传递付款原因,用户ID,金额)

# PayPoints 积分兑换成功时触发(传递兑换原因,用户ID,积分消耗数量)

# PaySuccess 在线付款成功时触发(传递支付订单信息)

# GoodsDetails 商品被打开时触发(如访问商品详情页)(传递商品ID+用户ID,如果ID=-1,则是游客状态)

# GoodsSeek 搜索商品时触发(传递搜索内容+用户ID,如果ID=-1,则是游客状态)

# ArticleList 查看文章列表时触发(传递用户ID,如果ID=-1,则是游客状态)

# UserSignIn 用户签到时触发(传递签到奖励数量+用户ID)

# UserInvite 用户邀请成功时触发 (传递用户ID+被邀请用户的ID+奖励数量)

# WorkOrderNew 用户创建工单时触发(传递工单完整信息)

# WorkOrderReply 回复工单[客服/用户] (传递工单ID+回复内容+身份)

# WorkOrderEnd 完结工单时触发(传递关闭的工单ID+操作者身份)

# UserLevelUp 用户等级提升时触发(传递用户ID,消耗金额,升级后的等级)

# ArticleSeek 搜索指定文章时触发(传递搜索内容+用户ID,如果ID=-1,则是游客状态)

# OrderDetails 打开订单详情时触发(传递商品ID+用户ID,如果ID=-1,则是游客状态)

# Globals 全局钩子,拦截所有访问请求,此钩子太过于危险,2级开发者可在提交应用时开启,需审核,无需配置钩子调用json文件

# 2、为你的应用注册指定的钩子

# 1、在你的应用 /conf/应用标识/ 目录下创建Hook.json 文件!

# 2、编写Hook.json文件,格式如下:

["钩子1","钩子2","钩子3"]
1

里面的钩子1,钩子2,钩子3替换为上方钩子大全内的钩子如 ["WorkOrderNew","UserSignIn"] ,需要什么就添加什么,无上限,安装应用后,用户触发钩子时会传递对应的数据到你应用的控制器内!

# 3、区分应用是通过哪个钩子触发的方法!

每次钩子执行应用时会传递一个额外的参数到控制器内:HookName,钩子名称,可以通过HookName参数在控制器内区分到底是哪个钩子传递过来的参数,从而执行对应的操作!

# 3、创建/删除自定义钩子的方法

<?php
//假设这是你的控制器index.php 文件
use lib\Hook\Hook;

class 你设置的应用标识
{
    /**
     * @param array $Data
     * 控制器入口
     */
    public static function origin(array $Data)
    {
        Hook::delete("钩子名称","待删除应用的标识"); //删除
        Hook::add("钩子名称","待注册应用的标识"); //注册
        Hook::execute("钩子名称","传值内容(Array)"); //执行钩子
        Hook::arr("钩子名称"); //查询钩子内注册的应用,钩子名称留空查询全部
        
        /**
         * 其中 execute 这个方法很有用,钩子大全内的钩子均是此方法创建的,如下:
         * ArticleSeek钩子就这样创建成功,其他应用就可以在此钩子内注册了
         * 每次触发这个钩子时,就会传递 ['uid' => -1] 的数组内容到注册过此钩子应用的控制器内
         */
         Hook::execute('ArticleSeek', ['uid' => -1]);
        
         /**
          * 你甚至可以将钩子触发器放在你自己的应用内,完成特定的操作,这里留一点想象空间,就不提示太多了
          */
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 4、钩子相关目录结构

钩子操作文件存放目录:/includes/lib/Hook/
/Hook/
.
├── Hook.json 钩子规则配置文件
├── Hook.php 钩子操作方法,有兴趣可以了解一下,很简单
.
1
2
3
4
5

# 沙盒测试

TIP

考虑到您开发应用时,是需要边调试边进行开发的,为此我们推出了沙盒测试模式,您只需要按照下列步骤即可搭建一个完美的沙盒开发环境!

# 1、在本地或服务器搭建一个小储云商城

登陆时您可以通过app或者小程序/H5登陆,如果是本地环境的话,您是无法直接在服务端点击确认登陆的,因为服务端无法对您本地端发送请求回调,您可以复制登陆token,直接填写token完成登陆

# 2、在开发者后台里面发布一个新的应用,模式选择为 沙盒模式

发布时您需要先按照相关发布规范来构建您的应用安装包,然后提交即可

# 3、在小储商城站长后台内的应用商店找到您的沙盒应用

提交沙盒应用后您可在 小储商城站长后台/应用商店/我的/沙盒测试 里面找到您发布的沙盒应用!

# 4、开始进行开发

找到您发布的沙盒应用后,点击安装,开始对照开发文档进行开发,开发完成后,可以直接将此沙盒应用提交审核,审核通过后即可上线!

# SDK及DEMO下载

# 1、简单插件demo:网站防CC插件(doem)

# 2、支付对接应用demo:易支付对接(doem)

# 3、网站模板应用demo:普通模板开发结构(doem)