HEX
Server: Apache
System: Linux top 5.8.11-1.el7.elrepo.x86_64 #1 SMP Tue Sep 22 18:18:35 EDT 2020 x86_64
User: www (1000)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.018111.cn/wp-content/themes/jian/inc/class/core.class.7.4.php
<?php
//勿改动
add_action("csf__caozhuti_options_save_after", "ripro_options_save_after");
add_action("wp_ajax_ripro_ajax_check", "ripro_ajax_check");
add_action("wp_ajax_nopriv_ripro_ajax_check", "ripro_ajax_check");
class setupDb
{
    public function setupCoupon()
    {
        global $wpdb;
        global $coupon_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $coupon_table_name . "'") != $coupon_table_name) {
            $sql = " CREATE TABLE `" . $coupon_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `code` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '优惠码',\r\n                  `code_type` tinyint(3) NOT NULL DEFAULT '0' COMMENT '0 无 1 直减 2折扣',\r\n                  `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',\r\n                  `end_time` int(11) DEFAULT '0' COMMENT '到期时间',\r\n                  `apply_time` int(11) DEFAULT '0' COMMENT '使用时间',\r\n                  `status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '状态:0未使用 1已使用',\r\n                  `sale_money` double(10,2) DEFAULT '0.00' COMMENT '优惠金额',\r\n                  `sale_float` float(2,1) DEFAULT '0.0' COMMENT '折扣',\r\n                  PRIMARY KEY (`id`),\r\n                  KEY `code_index` (`code`) COMMENT '优惠码索引'\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='优惠券';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
    public function setupRefLog()
    {
        global $wpdb;
        global $ref_log_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $ref_log_table_name . "'") != $ref_log_table_name) {
            $sql = " CREATE TABLE `" . $ref_log_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `user_id` int(11) DEFAULT NULL COMMENT '用户id',\r\n                  `money` double(10,2) DEFAULT NULL COMMENT '提现金额',\r\n                  `create_time` int(11) DEFAULT '0' COMMENT '申请时间',\r\n                  `up_time` int(11) DEFAULT '0' COMMENT '审核时间',\r\n                  `status` tinyint(3) DEFAULT '0' COMMENT '状态;0 审核中;1已打款;-1失效',\r\n                  `note` varchar(255) DEFAULT NULL COMMENT '说明备注',\r\n                  PRIMARY KEY (`id`)\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='提现记录表';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
    
    public function setupBalanceLog()
    {
        global $wpdb;
        global $balance_log_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $balance_log_table_name . "'") != $balance_log_table_name) {
            $sql = " CREATE TABLE `" . $balance_log_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `user_id` int(11) DEFAULT NULL COMMENT '用户id',\r\n                  `old` double(10,2) DEFAULT NULL COMMENT '原始余额',\r\n                  `apply` double(10,2) DEFAULT NULL COMMENT '操作金额',\r\n                  `new` double(10,2) DEFAULT NULL COMMENT '新余额',\r\n                  `type` enum('charge','post','cdk','other') NOT NULL DEFAULT 'charge' COMMENT '类型:充值 资源 卡密 其他',\r\n                  `time` int(11) DEFAULT '0' COMMENT '操作时间',\r\n                  `note` varchar(255) DEFAULT NULL COMMENT '说明备注',\r\n                  PRIMARY KEY (`id`)\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='消费记录表';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
    public function setupPaylog()
    {
        global $wpdb;
        global $paylog_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $paylog_table_name . "'") != $paylog_table_name) {
            $sql = " CREATE TABLE `" . $paylog_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `user_id` int(11) DEFAULT NULL COMMENT '用户id',\r\n                  `post_id` int(11) DEFAULT NULL COMMENT '关联文章ID',\r\n                  `order_trade_no` varchar(50) DEFAULT NULL COMMENT '本地订单号',\r\n                  `order_price` double(10,2) DEFAULT NULL COMMENT '文章价格',\r\n                  `order_amount` double(10,2) DEFAULT NULL COMMENT '实际扣除金额',\r\n                  `order_type` enum('post','other') NOT NULL DEFAULT 'post' COMMENT '文章资源 其他',\r\n                  `order_sale` float(2,1) DEFAULT '0.0' COMMENT 'VIP折扣',\r\n                  `create_time` int(11) DEFAULT '0' COMMENT '创建时间',\r\n                  `pay_type` tinyint(3) DEFAULT '0' COMMENT '支付类型;0无;1余额;2其他',\r\n                  `pay_time` int(11) DEFAULT '0' COMMENT '支付时间',\r\n                  `status` tinyint(3) DEFAULT '0' COMMENT '状态;0 无;1已购买;-1失效',\r\n                  PRIMARY KEY (`id`),\r\n                  KEY `post_id_index` (`post_id`),\r\n                  KEY `user_id_index` (`user_id`)\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='文章资源购买表';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
    public function setupDownlog()
    {
        global $wpdb;
        global $down_log_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $down_log_table_name . "'") != $down_log_table_name) {
            $sql = " CREATE TABLE `" . $down_log_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `user_id` int(11) DEFAULT NULL COMMENT '用户id',\r\n                  `down_id` int(11) DEFAULT NULL COMMENT '下载文章ID',\r\n                  `ip` varchar(255) DEFAULT NULL COMMENT 'IP地址',\r\n                  `note` varchar(255) DEFAULT NULL COMMENT '说明备注',\r\n               `create_time` int(11) DEFAULT '0' COMMENT '下载时间',\r\n                  PRIMARY KEY (`id`),\r\n                  KEY `user_id_index` (`user_id`)\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='下载记录日志';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
    
    public function install()
    {
        $this->setupOrder();
        $this->setupCoupon();
        $this->setupPaylog();
        $this->setupBalanceLog();
        $this->setupRefLog();
        $this->setupDownlog();
    }
    public function setupOrder()
    {
        global $wpdb;
        global $order_table_name;
        if ($wpdb->get_var("SHOW TABLES LIKE '" . $order_table_name . "'") != $order_table_name) {
            $sql = " CREATE TABLE `" . $order_table_name . ("` (\r\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n                  `user_id` int(11) DEFAULT NULL COMMENT '用户id',\r\n                  `order_trade_no` varchar(50) DEFAULT NULL COMMENT '本地订单号',\r\n                  `order_price` double(10,2) DEFAULT NULL COMMENT '订单价格',\r\n                  `order_type` enum('charge','other') NOT NULL DEFAULT 'charge' COMMENT '充值 其他',\r\n                  `create_time` int(11) DEFAULT '0' COMMENT '创建时间',\r\n                  `pay_type` tinyint(3) DEFAULT '0' COMMENT '支付类型;0无;1支付宝;2微信',\r\n                  `pay_time` int(11) DEFAULT '0' COMMENT '支付时间',\r\n                  `pay_trade_no` varchar(50) DEFAULT NULL COMMENT '商户订单号',\r\n                  `status` tinyint(3) DEFAULT '0' COMMENT '状态;0 未支付;1已支付;-1失效',\r\n                  PRIMARY KEY (`id`),\r\n                  KEY `order_trade_no_index` (`order_trade_no`)\r\n                ) ENGINE=MyISAM DEFAULT CHARSET=") . DB_CHARSET . (" COMMENT='在线充值订单表';");
            require_once(ABSPATH . ("wp-admin/includes/upgrade.php"));
            dbDelta($sql);
        }
    }
}
class ShopOrder
{
    public function __construct()
    {
    }
    public function get($out_trade_no)
    {
        global $wpdb;
        global $order_table_name;
        $data = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $order_table_name . " WHERE order_trade_no = %s AND status = 0", $out_trade_no));
        return $data;
    }
    public function add($user_id, $trade_no, $type, $price, $payMethod)
    {
        global $wpdb;
        global $order_table_name;
        $params = array("user_id" => $user_id, "order_trade_no" => $trade_no, "order_type" => $type, "order_price" => $price, "create_time" => time(), "pay_type" => $payMethod);
        $insert = $wpdb->insert($order_table_name, $params, array("%d", "%s", "%s", "%s", "%s", "%d"));
        return $insert ? true : false;
    }
    public function check($orderNum)
    {
        global $wpdb;
        global $order_table_name;
        $isPay = 0;
        if (isset($orderNum)) {
            $isPay = $wpdb->get_var($wpdb->prepare("SELECT id FROM " . $order_table_name . " WHERE order_trade_no = %s AND status = 1 ", $orderNum));
            return $isPay && (0 < $isPay);
        }
        return $isPay && (0 < $isPay);
    }
    public function update($orderNum, $payNum)
    {
        global $wpdb;
        global $order_table_name;
        $time = time();
        $update = $wpdb->update($order_table_name, array("pay_trade_no" => $payNum, "pay_time" => $time, "status" => 1), array("order_trade_no" => $orderNum), array("%s", "%s", "%d"), array("%s"));
        return $update ? true : false;
    }
}

class CaoCdk
{
    public function checkCdk($code)
    {
        global $wpdb;
        global $coupon_table_name;
        $sale_money = 0;
        if (isset($code)) {
            $coupon = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $coupon_table_name . " WHERE code = %s ", $code));
            if ($coupon && ($coupon->status == 0) && (time() < ($coupon->end_time)) && ($coupon->apply_time == 0)) {
                return $coupon->sale_money;
            }
        }
        return $sale_money;
    }
    public function str_code_rand($length = 12, $char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    {
        if (!is_int($length) || ($length < 0)) {
            return false;
        }
        $string = "";
        $i = $length;
        while (0 < $i) {
            $string .= ($char[mt_rand(0, strlen($char) - 1)]);
            $i--;
        }
        return $string;
    }
    public function updataCdk($code)
    {
        global $wpdb;
        global $coupon_table_name;
        $update = $wpdb->update($coupon_table_name, array("apply_time" => time(), "status" => 1), array("code" => $code), array("%s", "%d"), array("%s"));
        return $update ? true : false;
    }
    public function addCdk($sale_money, $day, $num)
    {
        global $wpdb;
        global $coupon_table_name;
        $i = 0;
        while ($i < $num) {
            $create_time = time();
            $end_time = $create_time + ($day * 24 * 60 * 60);
            $params = array("code" => $this->str_code_rand($length = 12), "code_type" => 1, "create_time" => $create_time, "end_time" => $end_time, "apply_time" => 0, "status" => 0, "sale_money" => sprintf("%0.2f", $sale_money), "sale_float" => 1);
            $insCoupon = $wpdb->insert($coupon_table_name, $params, array("%s", "%d", "%s", "%s", "%s", "%s", "%s", "%s"));
            $i++;
        }
        return $i ? true : false;
    }
}
class CaoUser
{
    private $uid;
    public function __construct($uid)
    {
        $this->uid = $uid;
    }
    public function cao_vip_downum($users_id = '', $users_type = false)
    {
        global $current_user;
        if (!is_user_logged_in()) {
            return 0;
        }
        $uid = (!$users_id) ? $current_user->ID : $users_id;

        $total_count=0;
        
        
        // 会员当前下载次数
        $this_vip_downum = (get_user_meta($uid, 'cao_vip_downum', true) > 0) ? get_user_meta($uid, 'cao_vip_downum', true) : 0;
        
        $getTime  = getTime();

        if ($users_type) {
            if (is_boosvip_status($uid)) {
                $total_count=intval(_cao('boosvip_down_num', '100'));
                $over_down_num = (_cao('is_boosvip_down_num')) ? $total_count - intval($this_vip_downum) : 999 ;
            } else {
                $total_count=intval(_cao('vip_down_num', '10'));
                $over_down_num = (_cao('is_vip_down_num')) ? $total_count - intval($this_vip_downum) : 999 ;
            }
        } else {
            $total_count=intval(_cao('novip_down_num', '5'));
            $over_down_num = (_cao('is_novip_down_num')) ? $total_count - intval($this_vip_downum) : 999 ;
        }
        if ($over_down_num <= 0) {
            $over_down_num = 0;
        }
        $is_down = ($over_down_num <= 0) ? false : true;
        $data = array(
            'is_down'           => $is_down, //是否可以下载
            'today_count_num'	=> $total_count,
            'today_down_num'    => $this_vip_downum, //当前已下载次数
            'over_down_num'     => $over_down_num, //剩余下载次数
            'over_down_endtime' => $getTime['end'], // 下次下载次数更新时间
        );

        return $data;
    }
    
    public function vip_end_time()
    {
        $end_date = get_user_meta($this->uid, "cao_vip_end_time", true);
        if ($end_date) {
            switch ($end_date) {
                case "9999-09-09": return "终身";
                break;
                default: $time = strtotime($end_date);
                return date("Y-m-d", $time);
                break;
            }
        }
        return "未开通";
    }
    public function user_status()
    {
        $ban = get_user_meta($this->uid, "cao_banned", true);
        if ($ban) {
            $reason = get_user_meta($this->uid, "cao_banned_reason", true);
            return array("banned" => true, "banned_reason" => strval($reason));
        }
        return array("banned" => false);
    }
    public function update_vip_pay($days)
    {
        if (empty($days) && ($days < 0)) {
            return false;
        }
        $days = (int) $days;
        $vip_end_date = get_user_meta($this->uid, "cao_vip_end_time", true);
        $the_time = time();
        $end_time = strtotime($vip_end_date);
        if ($the_time < $end_time) {
            $new_end_time = $end_time + ($days * 24 * 3600);
        } else {
            $new_end_time = $the_time + ($days * 24 * 3600);
        }
        $new_user_type = "vip";
        if ($days == 9999) {
            $nwe_end_data = "9999-09-09";
        } else {
            $nwe_end_data = date("Y-m-d", $new_end_time);
        }
        update_user_meta($this->uid, "cao_vip_end_time", $nwe_end_data);
        update_user_meta($this->uid, "cao_user_type", $new_user_type);
        return true;
    }
    //PHP COOKIE设置函数立即生效,支持数组
    public function cookie($var, $value='', $time=0, $path='', $domain='')
    {
        $_COOKIE[$var] = $value;
        if (is_array($value)) {
            foreach ($value as $k=>$v) {
                setcookie($var.'['.$k.']', $v, $time, $path, $domain, 0);
            }
        } else {
            setcookie($var, $value, $time, $path, $domain, 0);
        }
    }
    public function vip_status()
    {
        $vip_type = get_user_meta($this->uid, "cao_user_type", true);
        $vip_end_date = get_user_meta($this->uid, "cao_vip_end_time", true);
        $this_time = time();
        $end_time = strtotime($vip_end_date);
        if (($vip_type == "vip") && ($vip_end_date == ("9999-09-09"))) {
            return true;
        }
        if (($vip_type == "vip") && ($this_time < $end_time)) {
            return true;
        }
        return false;
    }
    
    public function vip_name()
    {
        $site_no_vip_name = _cao("site_no_vip_name");
        $site_vip_name = _cao("site_vip_name");
        $vip_type = get_user_meta($this->uid, "cao_user_type", true);
        if ($vip_type && ($vip_type == "vip")) {
            return $site_vip_name;
        }
        return $site_no_vip_name;
    }
    public function get_balance()
    {
        return sprintf("%0.2f", get_user_meta($this->uid, "cao_balance", true));
    }
    public function get_consumed_balance()
    {
        return sprintf("%0.2f", get_user_meta($this->uid, "cao_consumed_balance", true));
    }
    public function update_balance($amount = 0)
    {
        $before_balances = $this->get_balance();
        if (0 < $amount) {
            update_user_meta($this->uid, "cao_balance", sprintf("%0.2f", $before_balances + $amount));
        } else {
            if ($amount < 0) {
                if (($before_balances + $amount) < 0) {
                    return false;
                }
                $before_consumed = get_user_meta($this->uid, "cao_consumed_balance", true);
                update_user_meta($this->uid, "cao_consumed_balance", sprintf("%0.2f", $before_consumed - $amount));
                update_user_meta($this->uid, "cao_balance", sprintf("%0.2f", $before_balances + $amount));
            }
        }
        return true;
    }
}
class Caolog
{
    public function addlog($user_id, $old, $apply, $new, $type, $note)
    {
        global $wpdb;
        global $balance_log_table_name;
        $create_time = time();
        $params = array("user_id" => $user_id, "old" => $old, "apply" => $apply, "new" => $new, "type" => $type, "time" => $create_time, "note" => $note);
        $ins = $wpdb->insert($balance_log_table_name, $params, array("%d", "%s", "%s", "%s", "%s", "%s", "%s"));
        return $ins ? true : false;
    }
}
class Reflog
{
    private $uid;
    public function __construct($uid)
    {
        $this->uid = $uid;
    }
    public function updatelog($id, $status = 0)
    {
        global $wpdb;
        global $ref_log_table_name;
        $this_log = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $ref_log_table_name . " WHERE id = %d ", $id));
        if (!$this_log) {
            return false;
        }
        $update = $wpdb->update($ref_log_table_name, array("up_time" => time(), "status" => $status), array("id" => $id), array("%s", "%d"), array("%d"));
        return $update ? true : false;
    }
    public function get_total_bonus()
    {
        return sprintf("%0.2f", get_user_meta($this->uid, "cao_total_bonus", true));
    }
    public function addlog($money, $note)
    {
        global $wpdb;
        global $ref_log_table_name;
        $money = (int) $money;
        $create_time = time();
        $params = array("user_id" => $this->uid, "money" => $money, "create_time" => $create_time, "note" => $note);
        $ins = $wpdb->insert($ref_log_table_name, $params, array("%d", "%s", "%s", "%s"));
        return $ins ? true : false;
    }
    
    public function get_ref_num()
    {
        global $wpdb;
        global $ref_log_table_name;
        $ref_num = $wpdb->get_var($wpdb->prepare("SELECT COUNT(user_id) FROM " . $wpdb->usermeta . " WHERE meta_key=%s AND meta_value=%s", "cao_ref_from", $this->uid));
        return $_num = ($ref_num ? (int) $ref_num : 0);
    }
    
    public function get_ke_bonus()
    {
        global $wpdb;
        global $ref_log_table_name;
        $get_total_bonus = $this->get_total_bonus();
        $get_ing_bonus = $this->get_ing_bonus();
        $get_yi_bonus = $this->get_yi_bonus();
        return sprintf("%0.2f", $get_total_bonus - $get_ing_bonus - $get_yi_bonus);
    }
    public function get_yi_bonus()
    {
        global $wpdb;
        global $ref_log_table_name;
        $sqls = $wpdb->get_var($wpdb->prepare("SELECT SUM(money) FROM " . $ref_log_table_name . " WHERE user_id=%d AND status=1", $this->uid));
        return sprintf("%0.2f", $sqls);
    }
    public function get_ing_bonus()
    {
        global $wpdb;
        global $ref_log_table_name;
        $sqls = $wpdb->get_var($wpdb->prepare("SELECT SUM(money) FROM " . $ref_log_table_name . " WHERE user_id=%d AND status=0", $this->uid));
        return sprintf("%0.2f", $sqls);
    }
    
    public function add_total_bonus($amount)
    {
        $amount = sprintf("%0.2f", $amount);
        $get_total_bonus = $this->get_total_bonus();
        if (0 < $amount) {
            update_user_meta($this->uid, "cao_total_bonus", sprintf("%0.2f", $get_total_bonus + $amount));
        } else {
            return false;
        }
        return true;
    }
    public function get_down_log($params)
    {
        global $wpdb;
        global $down_log_table_name;
        
        $offset=($params['paged']-1)*$params['perpage'];
        
        $v8wp = "SELECT * FROM " . $down_log_table_name . " WHERE 1=1 ";
        if ($params['user_id'] != '0' && $params['user_id'] !='') {
            $v8wp .= "AND user_id='" . $params['user_id'] . "' ";
        }
        $v8wp .= "ORDER BY id DESC ";
        $v8wp .= "limit " . $offset . "," . $params['perpage'];
        
        $results = $wpdb->get_results($v8wp, "OBJECT");
        if (!$results) {
            return null;
        }
        
        return $results;
    }
}
class PostPay
{
    public $user_id;
    public $post_id;
    public function __construct($user_id, $post_id)
    {
        $this->user_id = $user_id;
        $this->post_id = $post_id;
    }
    public function add($price, $sale, $order_trade_no, $pay_type)
    {
        global $wpdb;
        global $paylog_table_name;
        //$out_trade_no = date("ymdhis") . mt_rand(100, 999) . mt_rand(100, 999) . mt_rand(100, 999);
        if ($sale == 0) {
            $amount = 0;
        } elseif ($sale == 1) {
            $amount = $price;
        } else {
            if ((0 < $sale) && ($sale < 1)) {
                $amount = sprintf("%0.2f", $price * $sale);
            } else {
                $amount = $price;
            }
        }
        $params = array("user_id" => $this->user_id, "post_id" => $this->post_id, "order_trade_no" => $order_trade_no, "order_price" => $price, "order_amount" => $amount, "order_type" => "post", "order_sale" => $sale, "create_time" => time(), "pay_type" => $pay_type);
        $insert = $wpdb->insert($paylog_table_name, $params, array("%d", "%d", "%s", "%s", "%s", "%s", "%s", "%s", "%d"));
        if ($insert) {
            return $params;
        } else {
            return false;
        }
    }
    public function v8wp()
    {
        if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            $ip = getenv('REMOTE_ADDR');
        } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches [0] : '';
    }
    public function add_down_log()
    {
        date_default_timezone_set('Asia/Shanghai');
        global $wpdb;
        global $down_log_table_name;
        try {
            $wpdb->insert($down_log_table_name, array("user_id"=>$this->user_id,"down_id"=>$this->post_id,"ip"=>$this->v8wp(),"create_time"=>time()));
            return true;
        } catch (Exception $e) {
            return false;
        }
    }
    public function update($orderNum)
    {
        global $wpdb;
        global $paylog_table_name;
        $time = time();
        $update = $wpdb->update($paylog_table_name, array("pay_time" => $time, "status" => 1), array("order_trade_no" => $orderNum), array("%s", "%d"), array("%s"));
        return $update ? true : false;
    }

    public function isPayPost()
    {
        global $wpdb;
        global $paylog_table_name;
        
        $isPay = false;
        
        if ($this->user_id == 0) {
            /*免登录支付  0*/
            if (isset($_COOKIE['RiProPay_'.$this->post_id])) {
                $this_key_id = $this->get_key($_COOKIE['RiProPay_' . $this->post_id]);
                $isPay = $wpdb->get_var($wpdb->prepare("SELECT id FROM " . $paylog_table_name . " WHERE post_id = %d AND status = 1 AND order_trade_no = %s", $this->post_id, $this_key_id));
                $isPay = intval($isPay);
            }
        } else {
            $user = new CaoUser($this->user_id);
            if ($user->vip_status()) {
                //vip会员
                $isPay = $wpdb->get_var($wpdb->prepare("SELECT id FROM " . $paylog_table_name . " WHERE user_id = %d AND post_id = %d AND status = 1 ", $this->user_id, $this->post_id));
            } else {
                $paytime = time()-3000*24*60*60;//3000 day后重新购买
                $isPay = $wpdb->get_var($wpdb->prepare("SELECT id FROM " . $paylog_table_name . " WHERE pay_time > %d AND user_id = %d AND post_id = %d AND status = 1 ", $paytime, $this->user_id, $this->post_id));
            }
            $isPay = $isPay ? true:false;
        }
        return $isPay>0;
    }
    public function get_pay_info($order_trade_no)
    {
        global $wpdb;
        global $paylog_table_name;
        
        $info = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $paylog_table_name . " WHERE order_trade_no = %s", $order_trade_no));
        return $info;
    }
    public function get_pay_ids($user_id)
    {
        global $wpdb;
        global $paylog_table_name;
        $sql = "SELECT post_id FROM " . $paylog_table_name . " WHERE 1=1 ";
        $sql .= ("AND user_id='" . $user_id . "' AND status =1 ");
        $sql .= "ORDER BY id DESC";
        $results = $wpdb->get_results($sql, "ARRAY_A");
        $_post_id = array();
        foreach ($results as $item) {
            array_push($_post_id, $item["post_id"]);
        }
        return $_post_id;
    }
    /**
     * [set_key 生成key]
     * @Author   Dadong2g
     * @DateTime 2019-05-28T13:26:54+0800
     * @param    [type]                   $setkey [description]
     */
    public function set_key($setkey)
    {
        return base64_encode($setkey . md5(_cao('ripro_nologin_payKey')));
    }
    /**
     * [get_key 获取后台设置的关键词key识别码]
     * @Author   Dadong2g
     * @DateTime 2019-05-28T13:26:44+0800
     * @param    [type]                   $getkey [description]
     * @return   [type]                           [description]
     */
    public function get_key($getkey)
    {
        return str_replace(md5(_cao('ripro_nologin_payKey')), '', base64_decode($getkey));
    }
}
class RiProPayAuth
{
    public $uid;
    public $pid;
    
    public function __construct($user_id, $post_id)
    {
        $this->uid=$user_id;
        $this->pid=$post_id;
    }

    public function cao_is_post_free()
    {
        $CaoUser = new CaoUser($this->uid);
        $cao_price = get_post_meta($this->pid, 'cao_price', true);
        $cao_vip_rate = get_post_meta($this->pid, 'cao_vip_rate', true);
        $cao_is_boosvip = get_post_meta($this->pid, 'cao_is_boosvip', true);

        //是免费资源
        if ($cao_price == '0') {
            return true;
        }

        // 是常规会员
        if ($CaoUser->vip_status() && ($cao_price*$cao_vip_rate==0)) {
            return true;
        }
        
        //是永久会员
        
        if ($cao_is_boosvip && is_boosvip_status($this->uid)) {
            return true;
        }

        return false;
    }
    
    public function ThePayAuthStatus()
    {
        $status=0;
        
        $cao_is_post_free=$this->cao_is_post_free();
        $PostPay = new PostPay($this->uid, $this->pid);
        
        if (_cao('is_ripro_nologin_pay', '1') && !is_user_logged_in()) {
            if ($cao_is_post_free) {
                $status=12;
            } elseif ($PostPay->isPayPost()) {
                $status=11;
            } else {
                $status=13;
            }
        } elseif (is_user_logged_in()) {
            if ($PostPay->isPayPost()|| $cao_is_post_free) {
                $status=21;
            } else {
                $status=22;
            }
        } else {
            $status=31;
        }
        
        return $status;
    }
}

class CaoCache
{
    public function __construct()
    {
    }
    
    public static function is()
    {
        return false;
    }
    
    public static function get($_the_cache_key)
    {
        return false;
    }
    public static function set($_the_cache_key, $value)
    {
        return true;
    }
}

class RiProPay
{
    public function __construct()
    {
    }
    public function _cao_get_xunhupay_js_url($pay_url)
    {
        return $pay_url;
    }
    public function _cao_get_xunhupay_qrcode($pay_js_url)
    {
        return getQrcode($pay_js_url);
    }
    public function get_order_info($out_trade_no)
    {
        //返回post_id,user_id,order_trade_no
        $postPay = new PostPay('0', '0');
        $order   = $postPay->get_pay_info($out_trade_no);
        if (!$order) {//找不到订单记录
            echo "no order found!out_trade_no=$out_trade_no";
            exit();
        }
        return array("user_id"=>$order->user_id,"post_id"=>$order->post_id,"order_trade_no"=>$out_trade_no);
    }
    public function send_order_trade_success($out_trade_no, $trade_no, $info)
    {
        // 验证通过 获取基本信息
        $ShopOrder = new ShopOrder();
        $order     = $ShopOrder->get($out_trade_no);
		
		//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
		$postPay = new PostPay($order->user_id, '0');
		$orders   = $postPay->get_pay_info($out_trade_no);
		//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
		
		
        // 是否有效订单 && 订单类型为充值
        if ($order && $order->order_type == 'charge') {
            // 实例化用户信息
            $CaoUser = new CaoUser($order->user_id);
            // 计算充值数量
            $charge_rate  = (int) _cao('site_change_rate'); //充值比例
            $old_money    = $CaoUser->get_balance(); //用户原来余额
            $charge_money = sprintf('%0.2f', $order->order_price * $charge_rate); // 实际充值数量

            //更新用户余额信息
            if ($CaoUser->update_balance($charge_money)) {
                // 写入记录
                $Caolog    = new Caolog();
                $new_money = $old_money + $charge_money; //充值后金额
                $note      = '支付宝-在线充值 [¥' . $order->order_price . '] +' . $charge_money;
                $Caolog->addlog($order->user_id, $old_money, $charge_money, $new_money, 'charge', $note);
                //更新订单状态
                $ShopOrder->update($out_trade_no, $trade_no);
                //发放佣金 查找推荐人
                add_to_user_bonus($order->user_id, $charge_money);
                //发送邮件
                $obj_user = get_user_by('ID', $order->user_id);
                _sendMail($obj_user->user_email, '支付成功', $note);
            }
        }
        if ($order && $order->order_type == 'other') {
            //更新订单状态
            $ShopOrder->update($out_trade_no, $trade_no);
			
			//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            //更新在线支付购买会员
            if ($orders->post_id==cao_get_page_by_slug('user')) {
                $CaoUser = new CaoUser($order->user_id);
                // 获取后台价格设置
				$charge_rate  = (int) _cao('site_change_rate'); //充值比例
				$vip_pay_setting = _cao('vip-pay-setting');
                foreach ($vip_pay_setting as $key => $item) {
                    if ($item['price'] == $order->order_price*$charge_rate) {
                        $pay_daynum = $item['daynum'];
                        break; // 取到值时,终止循环
                    }
                }
                if (empty($pay_daynum)) {
                    echo json_encode(array('status' => '0', 'msg' => '购买信息错误,请联系网站管理员'));
                    exit;
                }
    
                // 添加纪录
                if ($order->user_id) {
                    $Caolog    = new Caolog();
                    $web_money    = $CaoUser->get_balance();
                    $note      = '在线开通'._cao('site_vip_name') .' '. $pay_daynum .'天[¥'.$order->order_price.']换算站内货币='.$order->order_price*$charge_rate;
                    $Caolog->addlog($order->user_id, $web_money, $order->order_price*$charge_rate, $web_money, 'other', $note);
                }

                // 更新会员数据
                if (!$CaoUser->update_vip_pay($pay_daynum)) {
                    echo json_encode(array('status' => '0', 'msg' => '更新失败,请联系网站管理员'));
                    exit;
                }
                $PostPay = new PostPay($order->user_id, $orders->post_id);
                if ($PostPay->update($out_trade_no)) {
                    $this->AddPayPostCookie($uid, $orders->post_id, $out_trade_no);
                }
                if ($pay_daynum == 9999) {
                    $success_msg = '成功开通:终身特权!花费[¥'.$order->order_price.']';
                } else {
                    $success_msg = '成功开通:'.$pay_daynum.'天特权!花费[¥'.$order->order_price.']';
                }
                echo json_encode(array('status' => '1', 'msg' => $success_msg));
                if (_cao('is_mail_nitfy_vip')) {
                    $obj_user = get_user_by('ID', $order->user_id);
                    _sendMail($obj_user->user_email, '特权开通成功', $success_msg);
                }
                exit;
            }			
			//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
			
            //更新文章购买记录
            $PostPay = new PostPay($uid, $order->post_id);
            if ($PostPay->update($out_trade_no)) {
                $this->AddPayPostCookie($uid, $order->post_id, $out_trade_no);
            }
            $before_paynum = get_post_meta($order->post_id, 'cao_paynum', true);
            update_post_meta($order->post_id, 'cao_paynum', (int) $before_paynum + 1);
            
            // 发放作者佣金
            $author_id = (int)get_post($post_id)->post_author;
            if ($author_id != $order->user_id) {
                //自己购买自己不发放
                add_post_author_bonus($author_id, $order->price);
            }
        }
    }
    public function AddPayPostCookie($uid, $post_id, $orderNum)
    {
        if (!is_user_logged_in() && _cao('is_ripro_nologin_pay')) {
            $PostPay = new PostPay($uid, $post_id);
            $days = intval(_cao('ripro_nologin_days'));
            $expire = time() + $days*24*60*60;
            setcookie('RiProPay_'.$post_id, $PostPay->set_key($orderNum), $expire, '/', $_SERVER['HTTP_HOST'], false);
        }
    }
}

function ripro_options_save_after()
{
    $token = _the_theme_name() . _cao("ripro_vip_id", "");
    update_option($token, $token);
}