找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10497|回复: 0

[插件开发] Discuz 插件开发【X3.4】 二次开发 - 在线手册

[复制链接]
发表于 2022-4-12 15:46:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
验证插件二次开发

本功能由PHP+MYSQL语言开发,无缝对接新秀网络验证系统,采用独立入口文件、类文件、第三方类文件库进行调用开发。所有功能实现及控制均采用api接口操作,数据输出形式为JSON、XML两种常见形式,达到毫秒级数据快速交换功能。

1、插件开发是结合新秀网络验证系统进行的二次开发,不能独立使用;

2、插件开发遵循Discuz、新秀网络验证、PHP语言规范开发;

3、插件开发适用于新秀网络验证系统ver6.5版本以后;

4、本功能与新秀网络验证系统、扩展框架系统,代码相互独立,但功能同时执行;

5、插件开发可使用Discuz内置函数、新秀网络验证内置函数、PHP函数。

适用环境:php版本>5.6、Mysql版本>5.5以上、Discuz版本>3.0。

= Discuz资料库  = Discuz插件开发文档  = 开发交流  =  BUG反馈  =  QQ客服:3188639  QQ交流群:281079920


接口开发常用函数

1、DB数据库操作函数    /*常用MYSQL数据库操作命令,增、减、改、查功能函数。*/

2、新秀网络验证数据库对照表    /*新秀网络验证系统内部,所有数据库表及说明*/

3、Discuz官方数据库对照表  /*Discuz官方数据库表,包括discuz、UCente数据库字典。*/

4、Discuz基础框架、类、函数    /*包含Discuz官方基础框架、类、函数、方法使用说明。*/

5、新秀网络基础框架类、函数    /*包含新秀网络验证基础框架、类、函数、方法使用说明。*/


验证插件二次开发示例

1、ip地址查询   /*用于查询ip地址接口!*/


使 用 简 介

1、插件开发演示文件下载(IP地址查询)

QQ截图20220412163848.png
ip_utf8.zip (5.5 KB, 下载次数: 1480) ip_gbk.zip (5.14 KB, 下载次数: 1491)

2、插件开发演示文件目录说明

xinxiu_network_plugin \\新秀网络验证应用中心插件主目录

—extend \\自定义类存放目录 (用于开发者存放第三方类、自定义类)

—function \\自定义方法存放目录 (用于开发者存放自定义开发接口类和方法)

——function_dev.php \\自定义方法类开发文件 (自定义开发接口方法类)

—plugins \\插件数据库代码存放目录 (用于开发者存放插件数据库执行代码)

dev \\插件名目录

——extend_network.php \\设置插件数据库执行代码文件(数据新增、更新、删除,接口增加、删除功能,插件安装和卸载代码)

template \\插件前端htm开发存放目录(根据discuz官方插件前台开发代码进行开发

admin_dev_set.inc.php \\插件后台设置文件(根据discuz官方插件后台开发代码进行开发,并在插件设计页面自行增加插件设置文件入口)

—dev.inc.php \\自定义接口入口开发文件

3、如何安装、开发、调试?

#1、下载演示文件后,上传至新秀网络验证应用中心插件根目录。discuz论坛插件根目录 \source\plugin\xinxiu_network_plugin\

#2、使用PHP代码编辑软件,对入口文件 dev.inc.php 和 自定义方法类文件 function_dev.php 等进行开发,注意:UTF8及GBK编码问题。

#3、如需新增接口文件,请根据演示文件,修改 “dev” 为您想要的文件名,但不能与新秀框架插件内文件名冲突,且开发的接口方法,不能与新秀框架冲突

#4、如何发布自己开发的插件并获取一定收益,请联系客服QQ:

#5、功能代码开发完成,组装调试接口:


//根据演示文件中组装url接口地址

http://demo.xinxiuvip.com/plugin.php?id=xinxiu_network_plugin:ip&action=ip_cha&key=123456&ip=14.21.97.153


[PHP] 纯文本查看 复制代码
{
    "code": 200,
    "result": "ok",
    "count": 2,
    "data": {
        "ip": "14.21.97.153",
        "dizhi": "- 中国广东"
    },
    "sqltime": "0.01041s"
}

ip.inc.php入口文件代码实例
[PHP] 纯文本查看 复制代码
<?php
/*
 技术支持 QQ:3188639 QQ交流群:281079920
 官方网站 [url=http://www.xinxiuvip.com/]http://www.xinxiuvip.com/[/url]
 获取授权 [url=http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit]http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit[/url]
 接口开发手册 [url=http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394]http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394[/url]
 严禁反编译、逆向等任何形式的侵权行为,违者将追究法律责任!
*/

#========================================
#以下两行代码,用于开发环境下代码错误提示,可根据提示信息进行代码检查,无误后即可注释掉!
//ini_set("display_errors", "on");
//error_reporting(E_ALL);
#========================================

#========================================
#防止游客直接输入网址进行访问,权限检测,勿动!!!
if (! defined('IN_DISCUZ')) {
    exit('Access Denied');
}
#========================================

#========================================
#引入自定义开发类文件,此文件保存位置 'function/dev' 代表 function/function_dev.php 如需修改请按格式进行!
C::import('function/ip', 'plugin/xinxiu_network_plugin', false);//注意这里插件开发和接口二次开发不同!
$api = new function_ip();//实例化function_dev.php类操作,实例化后可用$api->调用function_dev.php中的类方法!
#========================================


#此处为入口文件,根据接口方法,调用对应类方法。
switch ($api->action) { //$api->action 获取入口方法,勿动!!!

    #========================================
    case 'ip_cha': // 判断是否是此方法,如果是则进入下一步!
       
        $ip =  xx_client::safe_check('ip', true); //判断参数传输,params为参数名称,iscore为是否是必填项(true为必填,false为可空)
        $api->ip_cha($ip);//调用function_dev.php实例化后类方法,根据类方法设置传入参数。
        break;
    #此处代码根据接口开发需求,可以无限添加循环。
    #========================================

    #========================================
    case 'ip_demo': // 判断是否是此方法,如果是则进入下一步!
        $ip =  xx_client::safe_check('ip', true); //判断参数传输,params为参数名称,iscore为是否是必填项(true为必填,false为可空)
        $api->ip_demo($ip);//调用function_dev.php实例化后类方法,根据类方法设置传入参数。
        break;
    #此处代码根据接口开发需求,可以无限添加循环。
    #========================================

    #========================================
    #此处代码是判断接口输入是否正确。勿删!!!
    default:
        xx_client::json_output(400,'error010');
        break;
    #========================================
}

function_ip.php自定义方法类代码实例
[PHP] 纯文本查看 复制代码
<?php
/*
 技术支持 QQ:3188639 QQ交流群:281079920
 官方网站 [url=http://www.xinxiuvip.com/]http://www.xinxiuvip.com/[/url]
 获取授权 [url=http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit]http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit[/url]
 接口开发手册 [url=http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394]http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394[/url]
 严禁反编译、逆向等任何形式的侵权行为,违者将追究法律责任!
*/

#========================================
#以下两行代码,用于开发环境下代码错误提示,可根据提示信息进行代码检查,无误后即可注释掉!
//ini_set("display_errors", "on");
//error_reporting(E_ALL);
#========================================

#========================================
#防止游客直接输入网址进行访问,权限检测,勿动!!!
if (! defined('IN_DISCUZ')) {
    exit('Access Denied');
}
#========================================

#========================================
#引入核心系统类,勿删!!!
C::import('class/plugin','plugin/xinxiu_network_plugin',false);
require_once DISCUZ_ROOT.'./config/config_ucenter.php';
require_once DISCUZ_ROOT.'./uc_client/client.php';
#========================================


#========================================
#如何引入自定义系统类?
#1、将自定义核心类、第三方核心类上传至extend文件夹下;
#2、通过 C::import 、 require_once 两种引入形式引入第三方核心类;
#3、在下方 public function dev_demo1($demo1,$demo2) 方法中实例化后使用 $new-> 进行调用。
#========================================


class function_ip extends class_plugin
{
    public $action_all = array('ip_cha','ip_demo');//所有接口必填,用逗号隔开!!!除以下key、adminkey所包含以外,未包含的接口都是通过token令牌进行访问。
    public $function_action_key = array('ip_cha','ip_demo');//使用key密钥访问的接口
    public $function_action_adminkey = array();//使用管理密钥adminkey访问的接口

    /**
     * 构造方法 __construct() 是在实例化对象时被自动调用
     * 用途:可以用于初始化程序(可以给成员属性赋值,也可以调用成员方法)
     */
    public function __construct(){
        $this->plugin_status();//判断插件后台开启状态,勿删!
        parent::__construct();//注意这里和接口二次开发不同
    }

    #========================================
    #此处为标准类方法,可根据DISCUZ、新秀网络验证内置函数进行调用,也可使用PHP官方函数进行操作。
    public function ip_cha($ip){

        #-具体DISCUZ内置函数、新秀网络验证内置函数、PHP函数,论坛相应帖子有专门介绍。
        $tinyipfile = DISCUZ_ROOT.'./data/ipdata/tinyipdata.dat';
        $data = $this->convertip_tiny($ip,$tinyipfile);
        $data_array = array(
            'ip'=>$ip,
            'dizhi'=>$data,
        );
        $data ? xx_client::json_output(200,'ok',$data_array): $this->json_output(400,'请检查IP地址是否正确!');
        #-具体DISCUZ内置函数、新秀网络验证内置函数、PHP函数,论坛相应帖子有专门介绍。
    }
    #========================================

    #========================================
    #演示方法设置钩子
    public function ip_demo($ip){
        #========================================
        #嵌入插件开发钩子,注意:此扩展方法在应用中心扩展文件中使用‘extend_plugin.php’;
        xx_client::class_hook('hook_ip_ip_cha',array('ip'=>$ip));

        /*
         * 下面是插件拓展对应的方法
         * 注意class_hook中的'hook_ip_ip_cha' 就是扩展文件中的方法名!
         *
        public function hook_ip_ip_cha($data){
            var_dump($data,'plugin');
        }
        */
        #========================================
    }
    #========================================


    function convertip_tiny($ip, $ipdatafile) {//获取ip地址的方法类

        static $fp = NULL, $offset = array(), $index = NULL;

        $ipdot = explode('.', $ip);
        $ip    = pack('N', ip2long($ip));

        $ipdot[0] = (int)$ipdot[0];
        $ipdot[1] = (int)$ipdot[1];

        if($fp === NULL && $fp = @fopen($ipdatafile, 'rb')) {
            $offset = @unpack('Nlen', @fread($fp, 4));
            $index  = @fread($fp, $offset['len'] - 4);
        } elseif($fp == FALSE) {
            return  '- Invalid IP data file';
        }

        $length = $offset['len'] - 1028;
        $start  = @unpack('Vlen', $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]);

        for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8) {

            if ($index[$start] . $index[$start + 1] . $index[$start + 2] . $index[$start + 3] >= $ip) {
                $index_offset = @unpack('Vlen', $index[$start + 4] . $index[$start + 5] . $index[$start + 6] . "\x0");
                $index_length = @unpack('Clen', $index[$start + 7]);
                break;
            }
        }

        @fseek($fp, $offset['len'] + $index_offset['len'] - 1024);
        if($index_length['len']) {
            return '- '.@fread($fp, $index_length['len']);
        } else {
            return '- Unknown';
        }

    }

    /**
     * 析构方法 __destruct() 是在对象被销毁时自动调用
     * 用途:可以进行资源的释放操作或文件的关闭操作或信息保存操作
     */
    public function __destruct()
    {
        return parent::__destruct(); // TODO: Change the autogenerated stub
    }

}

admin_qq_set.inc.php插件后台设置文件(以QQ登录插件为例)
[PHP] 纯文本查看 复制代码
<?php
    
    if (! defined('IN_DISCUZ') || ! defined('IN_ADMINCP')) {
        exit('Access Denied');
    }
    global $_G;
    C::import('class/xinxiu','plugin/xinxiu_network',false);
//判断接收go参数
    $go = $_GET['go'];
    $formhash= $_G['formhash'];
    $identifier = 'xinxiu_network_plugin';
//判断接收go参数
    
    if (submitcheck('qqsubmit')){
        $data = array(
            //'open' => $_GET['open'],
            'appid' => $_GET['appid'],
            'appkey' => $_GET['appkey'],
            'callback' => $_GET['callback'],
            'scope' =>$_GET['like'],
        );
        xx_cache::set_cache('plugin/set/qq_set',$data,true);
        cpmsg('更新数据成功!', 'action=plugins&operation=config&do='.$_GET['do'].'&identifier=xinxiu_network_plugin&pmod=admin_qq_set', 'succeed');
    }else{
        //QQ登录配置信息获取
        $data = xx_cache::get_cache('plugin/set/qq_set','',true);
        $appid = $data['appid'];
        $appkey = $data['appkey'];
        $callback = $data['callback'];
        //$open = $data['open'];
        $get_user_info = $data['scope']['get_user_info'] == 'on' ? 'checked' : '';
//QQ登录配置信息获取
    }
    showtableheader('QQ登录设置');
    showformheader('plugins&operation=config&do='.$pluginid.'&identifier='. $identifier .'&pmod=admin_qq_set');
    //showsetting('QQ登录开关', 'open',$open, 'radio','','','是否开启QQ登录!');
    showsetting('appid:', 'appid',$appid, 'text','','','请输入appid');
    showsetting('appkey:', 'appkey',$appkey, 'password','','','请输入appkey');
    showsetting('callback:', 'callback',$callback, 'text','','','请输入callback回调地址');
    showtips('', 'tips', true, '<h2 style="color: red">提示:首先要进行QQ账号绑定接口成功后,才能使用其他功能。</h2>');
    showsubmit('qqsubmit','提交配置');
    showformfooter();
    showtablefooter();

extend_network.php插件安装卸载配置实例
[PHP] 纯文本查看 复制代码
<?php

if(!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

C::import('class/plugin','plugin/xinxiu_network_plugin',false);//引入系统核心类

class extend_network extends class_plugin {

    public function __construct()//构造方法
    {
        parent::__construct(false);
    }

    public function hook_plugin_install(){//插件安装代码
        $sql = <<<EOF
        CREATE TABLE IF NOT EXISTS `pre_xinxiu_plugin_ip` (
          `id` BIGINT(16) unsigned NOT NULL AUTO_INCREMENT,
          `text1` longtext NOT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
EOF;
        return $sql;
    }

    public function hook_plugin_upgrade(){//插件更新代码
        $sql = <<<EOF
        CREATE TABLE IF NOT EXISTS `pre_xinxiu_plugin_ip` (
          `id` BIGINT(16) unsigned NOT NULL AUTO_INCREMENT,
          `text1` longtext NOT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
EOF;
        return $sql;

    }
    public function hook_plugin_uninstall(){//插件卸载代码
        $sql = <<<EOF
DROP TABLE IF EXISTS `pre_xinxiu_plugin_ip`;
EOF;
         return $sql;

    }
    public function hook_plugin_actions_install(){//插件安装接口代码

        $actions_array = array(
            array(
                'type'=>'ip模块',
                'name'=>'查询ip地址',
                'actions'=>'ip_cha',
                'url'=>'http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=424',
            ),
        );
       return $actions_array;

    }
    public function hook_plugin_actions_upgrade(){//插件接口更新代码
    
    }
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|新秀网络验证系统API[软著登字第13061951号] ( 豫ICP备2021033257号-1 )

GMT+8, 2026-1-5 12:05 , Processed in 0.252761 second(s), 64 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表
slot777
slot qris
KAPAK123
MENARA123
BARONG123
VIRGO123
HORAS123
KAKEK123
ION123
PATEN123
SALAM123
TUYUL123
KUNGLO123
PINTU123
JOKI123
INTI123
JADI123
MENANGBET
JADIJP
ACEH123
TINGGIBET
SUMBER4D
PULANG4D
POLAMAXWIN
INTAN123
dingin4d