HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
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/ww.snodshop.com/Home/Lib/Action/ApiAction.class.php
<?php

set_time_limit(300);
defined('THINK_PATH') OR exit();
class ApiAction extends Action {
    private $akmallConfig = array();
    public function _initialize() {
        $this->akmallConfig = $this->akmallConfig();
    }
    private function auth($data) {
        $sign = createSign($data, C('akmall_KEY'));
        if ($sign != $data['sign']) {
            return array(
                'status' => 0,
                'message' => lang('illegal_sign')
            );
        } else {
            return array(
                'status' => 1,
                'message' => lang('success')
            );
        }
    }
    public function akmallBooking(array $data) {
        session_commit();
        $sign = $this->auth($data);
        if ($sign['status'] == 0) return $sign;
        foreach ($data as $k => $v) {
            $data[$k] = is_string($v) ? strip_tags($v) : $v;
        }
        $data['item_id'] = (int)$data['item_id'];
        $data['quantity'] = $data['quantity'] < $data['min_num'] ? $data['min_num'] : $data['quantity'];
        $data['quantity'] = $data['quantity'] > $data['max_num'] ? $data['max_num'] : $data['quantity'];
        $data['quantity'] = empty($data['quantity']) ? 1 : intval($data['quantity']);
        $data['payment'] = empty($data['payment']) ? 'payOnDelivery' : trim($data['payment']);
        $itemMap = array(
            'sn' => trim($_POST['sn'])
        );
        $item = getCache('Item', $itemMap, true);
        $data['quantity'] = $data['payment'] == 'qrcode' && $item['qrcode_pay'] == 1 ? 1 : $data['quantity'];
        if (empty($item)) return array(
            'status' => 0,
            'message' => lang('empty_item')
        );
        $item_params = json_decode($item['params'], true);
        $selected_params = array();
        if ($item_params) {
            $paramsArray = array();
            foreach ($item_params as $params) {
                $paramsArray[] = $params['title'];
            }
            if (empty($data['item_params'])) return array(
                'status' => 0,
                'message' => lang('pleaseSelect') . $item['params_name']
            );
            foreach ($data['item_params'] as $param) {
                if (!in_array($param, array_values($paramsArray))) {
                    return array(
                        'status' => 0,
                        'message' => lang('pleaseSelect') . $item['params_name']
                    );
                }
            }
        }
        $data['item_params'] = empty($data['item_params']) ? '' : implode("#", $data['item_params']);
        if (!empty($this->akmallConfig['item_quantity']) && $data['quantity'] > $item['quantity']) {
            return array(
                'status' => 0,
                'message' => lang('quantityNotEnough')
            );
        }
        $check = $this->akmallCheck($data, json_decode($item['extends'], true));
        if ($check['status'] == 0) return $check;
        $safe = $this->akmallSafe($data['item_id'], $data['mobile']);
        if ($safe['status'] == 0) return $safe;
        $same = $this->akmallSameOrderCheck($data);
        if ($same['status'] == 0) return $same;
        $Order = M('Order');
        $price = $this->getakmallPrice($data);
        if ($akmall = $Order->create($data)) {
            if (!empty($item['buy_num']) && !empty($item['buy_num_decrease'])) {
                $buy_num = explode(',', $item['buy_num']);
                $buy_num_decrease = explode(',', $item['buy_num_decrease']);
                if (count($buy_num) > 0 && count($buy_num_decrease) > 0) {
                    $decrease = 0;
                    $len = count($buy_num);
                    if ($len > 0 && $data['quantity'] >= $buy_num[0]) {
                        $n = 0;
                        for ($i = 0; $i < $len; $i++) {
                            $j = $len - 1;
                            if (intval($buy_num[$j]) <= $data['quantity']) {
                                $n = $j;
                                break;
                            } else if (intval($buy_num[$i]) > $data['quantity']) {
                                $n = $i - 1;
                                break;
                            }
                        }
                        $decrease = $buy_num_decrease[$n];
                    }
                    $price['total_price']-= floatval($decrease);
                }
            }
            $code = date('ymd') . substr(microtime() , -5) . substr(microtime() , 2, 4);
            $total_price = floatval($price['total_price']);
            $orderData = array(
                'status' => 0,
                'item_sn' => $item['sn'],
                'item_name' => $item['name'],
                'item_aliasname' => $item['aliasname'],
                'item_aliasname2' => $item['aliasname2'],
                'item_params' => $data['item_params'],
                'item_extends' => json_encode($data['item_extends']) ,
                'item_price' => $item['price'],
                'order_price' => floatval($price['order_price']) ,
                'shipping_price' => floatval($price['shipping_price']) ,
                'total_price' => $total_price,
                'device' => isMobile() ? 2 : 1,
                'add_time' => $_SERVER['REQUEST_TIME'],
                'order_no' => $code,
                'add_ip' => get_client_ip() ,
                'delivery_name' => $data['payment'],
            );
            if (!empty($data['coupon_value'])) {
                $orderData['total_price']-= $data['coupon_value'];
                $orderData['total_price'] = $orderData['total_price'] >= 0 ? $orderData['total_price'] : 0;
                $orderData['coupon'] = $data['coupon'];
            }
            $orderData = array_merge($akmall, $orderData);
            $order_id = $Order->add($orderData);
            if ($order_id) {
                if (!empty($data['coupon_value'])) {
                    $couponData = array(
                        'is_used' => 1,
                        'used_time' => time() ,
                        'used_user' => $order_id
                    );
                    M('Coupon')->where(array(
                        'code' => $data['coupon']
                    ))->save($couponData);
                }
                if ($this->akmallConfig['item_quantity'] == '1') {
                    $this->decQuantity($data['item_id'], $data['quantity']);
                }
                if (intval($item['salenum']) > 0) M('Item')->where($itemMap)->setInc('salenum', $data['quantity']);
                if ($this->akmallConfig['record_order'] == 1) {
                    cookie('order', $orderData, array(
                        'expire' => 2592000
                    ));
                }
                unset($_SESSION['verify']);
                $this->akmallOrderLog($order_id, 0, $data['remark']);
                $orderData['order_id'] = $order_id;
                return array(
                    'status' => 1,
                    'message' => lang('success') ,
                    'data' => $orderData
                );
            } else {
                return array(
                    'status' => 0,
                    'message' => lang('error_colon_01')
                );
            }
        } else {
            return array(
                'status' => 0,
                'message' => lang('error')
            );
        }
    }
    public function akmallUpdateStatus(array $data) {
        $sign = $this->auth($data);
        if ($sign['status'] == 0) return $sign;
        $Model = M('Order');
        $order_id = (int)$data['order_id'];
        $status = (int)$data['status'];
        $user_id = isset($data['user_id']) ? (int)$data['user_id'] : 0;
        $remark = strip_tags($data['remark']);
        $order = $Model->where(array(
            'id' => $order_id
        ))->find();
        if ($order && $status != $order['status']) {
            $update = array(
                'id' => $order_id,
                'status' => $status,
                'update_time' => $_SERVER['REQUEST_TIME'],
            );
            if ($data['status'] == 3) {
                $update['delivery_name'] = $data['delivery_name'];
                $update['delivery_no'] = $data['delivery_no'];
            }
            $flag = $Model->save($update);
            if ($flag) {
                $this->akmallOrderLog($order_id, $status, $remark, $user_id);
                if (($this->akmallConfig['item_quantity'] - 1) == $status) {
                    $this->decQuantity($order['item_id'], $order['quantity']);
                }
                if ($data['status'] == 1 && $order['status'] == 0) {
                    $item = M('Item')->where('id=' . $order['item_id'])->field('id,is_auto_send,send_content')->find();
                    if (!empty($item['is_auto_send'])) {
                        $data['status'] = 3;
                        $data['remark'] = $item['send_content'];
                        $data['sign'] = createSign($data, C('akmall_KEY'));
                        $this->akmallUpdateStatus($data);
                    }
                }
                return array(
                    'status' => 1,
                    'message' => lang('success')
                );
            }
        } else {
            return array(
                'status' => 0,
                'message' => lang('error')
            );
        }
    }
  
  	/**
     * [getakmallPayment description]
     * @param  [type] $sn         [description]
     * @param  string $payment_id [description]
     * @param  array  $allow      [增加允许显示的支付方式,粒度到每一个商品 Jerry]
     * @return [type]             [description]
     */
    public function getakmallPayment($sn, $payment_id = '', $allow=[]) {
        $item = getCache('Item', array(
            'sn' => $sn
        ));
        $payment = C('PAYMENT');
        $akmallPayment = array();
        foreach ($payment as $key => $pay) {
            if ($key == 'qrcode' && in_array($item['qrcode_pay'], array(
                1,
                2
            ))) {
                $akmallPayment[$key] = $pay;
                $akmallPayment[$key]['info'] = preg_replace('/\r\n/', '', nl2br($item['qrcode_pay_info']));
            } else if ($this->akmallConfig['payment_global'] == '1' && $this->akmallConfig[$key . '_status'] != '1') {
                continue;
            } else {
                $akmallPayment[$key] = $pay;
                $akmallPayment[$key]['info'] = preg_replace('/\r\n/', '', nl2br($this->akmallConfig[$key . '_discount_info']));
                $math = substr($pay['math'], 0, 1);
                $akmallPayment[$key]['math'] = empty($this->akmallConfig[$key . '_discount']) && $math == '*' ? $pay['math'] : substr($pay['math'], 0, 1) . floatval($this->akmallConfig[$key . '_discount']);
                switch ($key) {
                    case 'codepay':
                        $codepay_type = json_decode($this->akmallConfig['codepay_type'], true);
                        if ($codepay_type) {
                            $class = array(
                                1 => 'payment-alipay',
                                2 => 'payment-tenpay',
                                3 => 'payment-wxpay'
                            );
                            foreach ($codepay_type as $type) {
                                $num = $key . '-' . $type;
                                $akmallPayment[$num] = array(
                                    'name' => $akmallPayment[$key]['type'][$type],
                                    'info' => $akmallPayment[$key]['info'],
                                    'math' => $akmallPayment[$key]['math'],
                                    'classname' => $class[$type],
                                );
                            }
                        }
                        unset($akmallPayment[$key]);
                        break;

                    case 'paypay':
                        $paypay_type = json_decode($this->akmallConfig['paypay_type'], true);
                        if ($paypay_type) {
                            $class = array(
                                1 => 'payment-wxpay',
                                2 => 'payment-alipay'
                            );
                            foreach ($paypay_type as $type) {
                                $num = $key . '-' . $type;
                                $akmallPayment[$num] = array(
                                    'name' => $akmallPayment[$key]['type'][$type],
                                    'info' => $akmallPayment[$key]['info'],
                                    'math' => $akmallPayment[$key]['math'],
                                    'classname' => $class[$type],
                                );
                            }
                        }
                        unset($akmallPayment[$key]);
                        break;

                    case 'qrcode_pay':
                        $akmallPayment[$key]['info'] = preg_replace('/\r\n/', '', nl2br($item['qrcode_pay_info']));
                        break;
                }
            }
        }
        if ($this->akmallConfig['payment_global'] != '1') {
            $itemPayment = json_decode($item['payment'], true);
            if ($itemPayment) {
                foreach ($akmallPayment as $k => $v) {
                    preg_match('/([a-zA-Z0-9]+)\-(\d)/', $k, $match);
                    $key = $match ? $match[1] : $k;
                    if (!in_array($key, $itemPayment)) {
                        unset($akmallPayment[$key]);
                    }
                }
            }
        }
       // return $payment_id ? $akmallPayment[$payment_id] : $akmallPayment;
      	if(empty($allow) || empty($allow[0]))
        {
            return $payment_id ? $akmallPayment[$payment_id] : $akmallPayment;
        }
        else 
        {
            // 给定了指定支付方式 $allow,只显示指定支付方式 jerry 
            $akmall_payment = array();
            foreach($allow as $payway){
                if($akmallPayment[$payway]) $akmall_payment[$payway] = $akmallPayment[$payway];
            }
            return $akmall_payment;
        }
    }
    public function getakmallPrice(array $data) {
        $sn = trim($data['sn']);
        $quantity = empty($data['quantity']) ? 1 : intval($data['quantity']);
        $params = trim($data['item_params']);
        $payment_id = $data['payment'];
        $item = getCache('Item', array(
            'sn' => $data['sn']
        ));
        $item_price = $item['price'];
        $item_params = json_decode($item['params'], true);
        $item_params_post = explode('#', $data['item_params']);
        if ($item_params) {
            $item_price = 0;
            foreach ($item_params as $param) {
                if (in_array($param['title'], $item_params_post)) {
                    $item_price+= $param['price'];
                }
            }
        }
        $order_price = $quantity * $item_price;
        $payment = $this->getakmallPayment($sn, $payment_id);
        $num = substr($payment['math'], 1);
        switch (substr($payment['math'], 0, 1)) {
            case '+':
                $order_price+= $num;
                break;

            case '*':
                $order_price*= $num;
                break;
        }
        $shipping_price = $this->getakmallShipping($item['shipping_id'], $quantity, $order_price);
        return array(
            'status' => 1,
            'order_price' => $order_price,
            'shipping_price' => $shipping_price,
            'total_price' => $order_price + $shipping_price,
        );
    }
    public function akmallSafe($item_id, $mobile = '') {
        $Model = M('Order');
        $ip = get_client_ip();
        $today = date('Y-m-d');
        $lastOrderTime = $Model->where("item_id={$item_id} AND status=0 AND  add_ip='{$ip}' ")->limit(1)->order('id DESC')->getField('add_time');
        if (($lastOrderTime + $this->akmallConfig['safe_order_interval']) > $_SERVER['REQUEST_TIME']) return array(
            'status' => 0,
            'message' => lang('intervalLimit')
        );
        $mobileCount = $Model->where("item_id={$item_id} AND mobile='{$mobile}' AND FROM_UNIXTIME(add_time,'%Y-%m-%d')='{$today}' ")->count();
        if ($mobileCount >= $this->akmallConfig['safe_mobile_limit']) return array(
            'status' => 0,
            'message' => lang('mobileLimit')
        );
        if (!empty($this->akmallConfig['safe_ip_limit'])) {
            $ipCount = $Model->where("add_ip='{$ip}' AND add_time >" . ($_SERVER['REQUEST_TIME'] - 3600))->count();
            if ($ipCount >= $this->akmallConfig['safe_ip_limit']) return array(
                'status' => 0,
                'message' => lang('orderLimit')
            );
        }
        return array(
            'status' => 1,
            'message' => lang('success')
        );
    }
    private function akmallOrderLog($order_id, $status = 1, $remark = '', $user_id = 0) {
        $OrderLog = M('OrderLog');
        $data = array(
            'order_id' => $order_id,
            'user_id' => $user_id,
            'status' => $status,
            'add_time' => $_SERVER['REQUEST_TIME'],
            'remark' => $remark,
        );
        $rs = $OrderLog->add($data);
        $this->sendSMS($order_id);
        if ($status > 0) $this->send($order_id, $status, $remark);
        return $rs;
    }
    public function send($order_id, $status = 0, $remark = '', $print = false) {
        if (empty($this->akmallConfig['mail_send'])) return array(
            'status' => 0
        );
        $status = intval($status);
        $order = M('Order')->where(array(
            'id' => $order_id
        ))->find();
        if (empty($order)) return array(
            'status' => 0
        );
        if ($order['is_sent'] == 1 && $status == 0) return array(
            'status' => 0
        );
        $item = $item = M('Item')->where('id=' . $order['item_id'])->field('id,is_auto_send,send_content')->find();
        $send_status = json_decode($this->akmallConfig['mail_send_status'], true);
        $orderStatus = C('ORDER_STATUS');
        if (in_array($status, $send_status) || ($status == 3 && $item['is_auto_send'] == 1)) {
            $content = include (COMMON_PATH . "akmall.mail.tpl{$status}.php");
            $file = file_exists(COMMON_PATH . "akmall.mail.tpl{$status}.php");
            if ($this->akmallConfig['mail_to']) $email = explode(',', $this->akmallConfig['mail_to']);
            if ($order['mail']) $email[] = $order['mail'];
            if (empty($email)) return array(
                'status' => 0
            );
            $title = str_replace(array(
                '[akmallStatus]',
                '[akmallTitle]',
                '[akmallName]'
            ) , array(
                strip_tags($orderStatus[$status]) ,
                $order['item_name'],
                $order['name']
            ) , $this->akmallConfig['mail_title']);
            $send = $this->sendMail($email, $title, $content);
            if ($send['status'] == 1 && $status == 0) {
                M('Order')->where(array(
                    'id' => $order_id
                ))->setField('is_sent', 1);
            }
            if ($print) {
                print_r($send);
            } else {
                return $send;
            }
        }
        return array(
            'status' => 0
        );
    }
    private function sendSMS($order_id) {
        if (empty($this->akmallConfig['sms_send'])) {
            return array(
                'status' => 0
            );
        }
        $order = M('Order')->where(array(
            'id' => $order_id
        ))->find();
        if (empty($order)) return array(
            'status' => 0
        );
        $item = M('Item')->where('id=' . $order['item_id'])->field('id,sms_send')->find();
        $sms = json_decode($item['sms_send'], true);
        $status = $order['status'];
        if ($sms[$status]['status'] == 1 && !empty($sms[$status]['content'])) {
            $express = C('DELIVERY');
            $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
            $akmallHost = $http_type . $_SERVER['HTTP_HOST'] . C('akmall_ROOT');
            $confirmUrl = $akmallHost . (C('URL_MODEL') == 2 ? 'a/' . $order['order_no'] : 'Api/confirm.php?id=' . $order['order_no']);
            $mobiles = $order['mobile'];
            if (!empty($this->akmallConfig['sms_admin_mobile'])) {
                switch ($this->akmallConfig['sms_admin']) {
                    case '1':
                        $mobiles = $this->akmallConfig['sms_admin_mobile'];
                        break;

                    case '2':
                        $mobiles.= ',' . $this->akmallConfig['sms_admin_mobile'];
                        break;
                }
            }
            $replace = array(
                '{[akmallTitle]}' => $order['item_name'],
                '{[akmallParams]}' => $order['item_params'],
                '{[akmallName]}' => $order['name'],
                '{[akmallQuantity]}' => $order['quantity'],
                '{[akmallPrice]}' => $order['total_price'],
                '{[akmallExpress]}' => $express[$order['delivery_name']],
                '{[akmallExpressNum]}' => $order['delivery_no'],
                '{[akmallConfirmUrl]}' => $confirmUrl,
                '#title#' => $order['item_name'],
                '#params#' => $order['item_params'],
                '#name#' => $order['name'],
                '#mobile#' => $order['mobile'],
                '#quantity#' => $order['quantity'],
                '#price#' => $order['total_price'],
                '#express#' => $express[$order['delivery_name']],
                '#expressNum#' => $order['delivery_no'],
                '#confirmUrl#' => $confirmUrl,
                '#orderNum#' => $order['order_no'],
            );
            $content = str_replace(array_keys($replace) , array_values($replace) , $sms[$status]['content']);
            if (trim($this->akmallConfig['sms_account']) == 'yunpian') {
                $url = 'https://sms.yunpian.com/v2/sms/single_send.json';
                $mobile = $this->akmallConfig['sms_countrys_code'] . ltrim($order['mobile'], 0);
                $data = array(
                    'apikey' => $this->akmallConfig['sms_password'],
                    'mobile' => $mobile,
                    'text' => $content,
                );
                $rs = http($url, 'POST', $data);
            } else {
                $data = array(
                    'method' => 'send',
                    'account' => $this->akmallConfig['sms_account'],
                    'password' => $this->akmallConfig['sms_password'],
                    'mobile' => $mobiles,
                    'content' => $content,
                );
                $rs = http(C('akmall_API') . '/sms/', 'POST', $data);
            }
            $ret = json_decode($rs, true);
            if ($ret['status'] == 1 || $ret['code'] == '0') {
                $sendData = array(
                    'order_id' => $order_id,
                    'order_status' => $order['status'],
                    'mobile' => $mobiles,
                    'sent_content' => $content,
                    'sent_time' => date('Y-m-d H:i:s') ,
                    'sent_status' => 1,
                );
                M('Sent')->add($sendData);
            }
        }
    }
    private function akmallCheck(&$data, $extends) {
        $page = trim($data['page']);
        if (in_array($page, array(
            'index',
            'item',
            'wap'
        )) && $data['order_page'] != 'detail') {
            $options = json_decode($this->akmallConfig['order_options'], true);
        } else {
            $template = getCache('ItemTemplate', array(
                'id' => (int)$data['item_id']
            ));
            $options = $template ? json_decode($template['options'], true) : C('TEMPLATE_OPTIONS');
        }
        $template_options = C('TEMPLATE_OPTIONS');
        if ($data['payment'] == 'creaditcard') {
            $template_options['mail']['request'] = true;
            foreach ($data['creditcard'] as $k => $v) {
                $v = trim($v);
                if (empty($v) || !is_numeric($v)) {
                    return array(
                        'status' => 0,
                        'message' => lang('pleaseTpyeCreditCardInfo')
                    );
                }
                if ($k == 'num' && !preg_match('/^[3|4|5]{1}[0-9]{15}$/', $v)) {
                    return array(
                        'status' => 0,
                        'message' => lang('invalid_creditCardNum')
                    );
                }
            }
            $data['creditcard'] = json_encode($data['creditcard']);
        }
        if (!empty($extends)) {
            $kt = 1;
            $extends_data = [];
            foreach ($extends as $ext) {
                $key = $ext['title'];
                if (!empty($data['item_index']) && strstr($key, '#')) {
                    if (strstr($key, $data['item_index'] . '#')) {
                        $key = preg_replace("/\d\#/i", "", $key);
                    } else {
                        continue;
                    }
                }
                if(!empty($data['extends'])){
                    if (empty($data['extends'][$key])) return array(
                        'status' => 0,
                        'message' => lang($key . '  _notEmpty')
                    );    
                     $extends_data[$key][] = $data['extends'][$key];                
                }else if(!empty($data['extends_'.$kt][$key])){
                    if (empty($data['extends_'.$kt][$key])) return array(
                        'status' => 0,
                        'message' => lang($key . '  _notEmpty')
                    ); 
                     $extends_data[$key][] = $data['extends_'.$kt][$key];                   
                }else{
                    return array(
                        'status' => 0,
                        'message' => lang($key . '  _notEmpty')
                    );
                }
               $kt++;     
            }
            $data['item_extends'] = $extends_data;
        }
        if (isset($data['region'])) {
            if (is_string($data['region'])) {
                list($province, $city, $area) = explode('/', $data['region']);
                $data['region'] = array(
                    'province' => $province,
                    'city' => $city,
                    'area' => $area,
                );
            }
            $data['province'] = preg_replace("/(\d+)\|/", "", trim($data['region']['province']));
            $data['city'] = preg_replace("/(\d+)\|/", "", trim($data['region']['city']));
            $data['area'] = preg_replace("/(\d+)\|/", "", trim($data['region']['area']));
            if (C('DEFAULT_LANG') == 'zh-cn') {
                foreach ($data['region'] as $key => & $region) {
                    $region = preg_replace("/(\d+)\|/", "", trim($region));
                    if ($template_options['region']['request'] == true && empty($region)) {
                        return array(
                            'status' => 0,
                            'message' => lang('pleaseSelect_' . $key)
                        );
                    }
                }
            } else if (empty($data['region']['province'])) {
                return array(
                    'status' => 0,
                    'message' => lang('pleaseSelect_province')
                );
            }
        }
        if ($this->akmallConfig['safe_check_mobile'] == 1 && !empty($data['mobile'])) {
            $rs = $this->regionMatch($data['mobile'], $data['region'] . $data['address']);
            if ($rs == false) {
                return array(
                    'status' => 0,
                    'message' => lang('invalid_mobile')
                );
            }
        }
        foreach ($options as $opt) {
            $options_value = is_array($data[$opt]) ? implode(' ', $data[$opt]) : $data[$opt];
            $data[$opt] = strip_tags(trim($options_value));
            if ($template_options[$opt]['request'] && empty($data[$opt])) {
                return array(
                    'status' => 0,
                    'message' => lang($opt . '_notEmpty')
                );
            }
        }
        foreach ($data as $key => $value) {
            switch ($key) {
                case 'mobile':
                    if (isMobileNum($value) == false) return array(
                        'status' => 0,
                        'message' => lang('invalid_' . $key)
                    );
                    break;

                case 'mail':
                    if (!empty($value) && isEmail($value) == false) return array(
                        'status' => 0,
                        'message' => lang('invalid_' . $key)
                    );
                    break;

                case 'name':
                    if (mb_strlen($value, 'utf8') < 2) return array(
                        'status' => 0,
                        'message' => lang('invalid_' . $key)
                    );
                    break;

                case 'address':
                    if (mb_strlen($value, 'utf8') < 3 && !empty($value)) return array(
                        'status' => 0,
                        'message' => lang('invalid_' . $key)
                    );
                    break;

                case 'verify':
                    if (md5($value) != $_SESSION['verify']) return array(
                        'status' => 0,
                        'message' => lang('invalid_' . $key)
                    );
                    break;

                case 'coupon':
                    if (!empty($value)) {
                        $coupon = $this->couponCheck($value, 2);
                        if ($coupon['status'] != '1') {
                            return array(
                                'status' => 0,
                                'message' => $coupon['message']
                            );
                        }
                    }
                    $data['coupon_value'] = $coupon['value'];
                    break;

                case 'code':
                    $CodeModel = M('Code');
                    $map = array(
                        'mobile' => $data['mobile'],
                        'item_id' => $data['item_id'],
                        'status' => 0
                    );
                    $code = $CodeModel->where($map)->field('code,add_time')->order('id desc')->find();
                    if (($code['add_time'] + 1800) < time() || $value != $code['code']) return array(
                        'status' => 0,
                        'message' => lang('invalidMobileCode')
                    );
                    $CodeModel->where($map)->setField('status', 1);
                    break;
                }
            }
            return array(
                'status' => 1
            );
        }
        public function couponCheck($code, $type = 2, $format = 'array') {
            $code = trim($code);
            if (!empty($code)) {
                $coupon = M('Coupon')->where("types={$type} AND code='{$code}'")->find();
                if (empty($coupon)) {
                    $rs = array(
                        'status' => 0,
                        'message' => lang('invalid_coupon')
                    );
                } else {
                    switch ($coupon['is_used']) {
                        case '0':
                            $rs = array(
                                'status' => 1,
                                'message' => 'ok',
                                'value' => $coupon['value']
                            );
                            break;

                        case '1':
                            $rs = array(
                                'status' => 2,
                                'message' => lang('couponIsUsed')
                            );
                            break;

                        default:
                            $rs = array(
                                'status' => 2,
                                'message' => lang('invalid_status')
                            );
                            break;
                    }
                }
            } else {
                $rs = array(
                    'status' => 0,
                    'message' => lang('couponisEmpty')
                );
            }
            if ($format == 'array') {
                return $rs;
            } else {
                echo json_encode($rs);
            }
        }
        private function akmallSameOrderCheck($data) {
            if ($this->akmallConfig['repeat_order'] == 1) return array(
                'status' => 1
            );
            $data['item_extends'] = json_encode($data['extends']);
            $check = array(
                'item_id',
                'item_params',
                'item_extends',
                'name',
                'mobile',
                'region',
                'address',
                'quantity',
                'payment'
            );
            $cookie = cookie('order');
            foreach ($check as $ck) {
                if ($data[$ck] != $cookie[$ck]) {
                    return array(
                        'status' => 1
                    );
                }
            }
            return array(
                'status' => 0,
                'message' => lang('sameOrder')
            );
        }
        public function getakmallShipping($shipping_id, $quantity, $total_price) {
            $cost = 0;
            if (!empty($shipping_id)) {
                $shipping = getCache('Shipping', array(
                    'id' => $shipping_id
                ));
                if ($shipping) {
                    if ($shipping['is_free_num'] && $quantity >= $shipping['free_num']) return $cost;
                    if ($shipping['is_free_cost'] && $total_price >= $shipping['free_cost']) return $cost;
                    if ($quantity <= $shipping['less_num']) {
                        $cost = $shipping['less_num_cost'];
                    } else {
                        $step = ceil(($quantity - $shipping['less_num']) / $shipping['step_num']);
                        $cost = $shipping['less_num_cost'] + $step * $shipping['step_num_cost'];
                    }
                }
            }
            return $cost;
        }
        private function akmallConfig() {
            $config = cache('akmallConfig');
            if (empty($config)) {
                $list = M('Setting')->select();
                foreach ($list as $li) $config[$li['name']] = $li['value'];
                cache('akmallConfig', $config, 8640000);
            }
            return $config;
        }
        public function payQrcode($data = array()) {
            $item = getCache('Item', array(
                'id' => $data['item_id']
            ));
            $params = json_decode($item['params'], true);
            if (empty($params)) {
                $qrcode = $item['qrcode'];
            } else {
                $itemParams = explode(' - ', $data['item_params']);
                foreach ($params as $k => $v) {
                    if ($v['title'] == $itemParams[0]) {
                        $qrcode = $v['qrcode'];
                        break;
                    }
                }
            }
            return $qrcode;
        }
        public function payWxpay($data = array()) {
            Vendor('wxPay.WxPay#NativePay');
            WxPayConfig::setConfig($this->akmallConfig);
            $notify = new NativePay();
            $order_no = $data['order_no'];
            $total_price = $data['total_price'] * 100;
            $item_id = $data['item_id'];
            $item_name = $data['item_params'] ? $data['item_params'] : $data['item_name'];
            $input = new WxPayUnifiedOrder();
            $input->SetBody($item_name);
            $input->SetOut_trade_no($order_no);
            $input->SetTotal_fee($total_price);
            $input->SetProduct_id($item_id);
            $input->SetAttach(L('akmallSystem'));
            $input->SetTime_start(date("YmdHis"));
            $input->SetTime_expire(date("YmdHis", time() + 3000));
            $input->SetGoods_tag(L('akmallSystem'));
            $input->SetNotify_url($this->akmallHost . "Api/wxPay.php");
            $input->SetTrade_type("NATIVE");
            return $notify->GetPayUrl($input);
        }
        Public function payAlipay($order_no) {
            $Model = D('Pay');
            $data = M('Order')->where(array(
                'order_no' => $order_no
            ))->find();
            $alipayType = json_decode($this->akmallConfig['alipay_type'], true);
            if ((isMobile() && in_array('2', $alipayType)) || !in_array('1', $alipayType)) {
                $Model->alipayWap($data, $this->akmallConfig);
            } else {
                $Model->alipay($data, $this->akmallConfig);
            }
        }
        public function sendEmail() {
            $sign = $this->auth($_POST);
            if ($sign['status'] == 0) {
                $json = array(
                    'status' => 0,
                    'info' => lang('illegal_sign')
                );
            } else {
                $json = $this->sendMail($_POST['email'], $_POST['title'], $_POST['content']);
            }
            echo json_encode($json);
        }
        public function alipayNotify() {
            D('Pay')->alipayNotify($this->akmallConfig);
        }
        public function alipayDbNotify() {
            D('Pay')->alipayDbNotify($this->akmallConfig);
        }
        public function alipayWapNotify() {
            D('Pay')->alipayWapNotify($this->akmallConfig);
        }
        public function wxPayNotify() {
            D('Pay')->wxPayNotify();
        }
        public function yunpayNotify() {
            D('Pay')->yunpayNotify($this->akmallConfig);
        }
        public function registNotify() {
            D('Pay')->registNotify($this->akmallConfig);
        }
        public function codepayNotify() {
            D('Pay')->codepayNotify($this->akmallConfig);
        }
        public function gleepayNotify() {
            D('Pay')->gleepayNotify($this->akmallConfig);
        }
        public function paypayNotify() {
            D('Pay')->paypayNotify($this->akmallConfig);
        }
        public function payseraNotify() {
            D('Pay')->payseraNotify($this->akmallConfig);
        }
        private function sendMail($email, $title, $content) {
            $akmallConfig = S('akmallConfig');
            $email = is_array($email) ? $email : explode(',', $email);
            if ($akmallConfig['mail_proxy']) {
                $data = array(
                    'email' => $email,
                    'title' => $title,
                    'content' => $content,
                    'mail_ssl' => $akmallConfig['mail_ssl'],
                    'mail_smtp' => $akmallConfig['mail_smtp'],
                    'mail_port' => $akmallConfig['mail_port'],
                    'mail_account' => $akmallConfig['mail_account'],
                    'mail_password' => $akmallConfig['mail_password'],
                );
                $result = http(C('akmall_API') . '/mail/', 'POST', $data);
                return json_decode($result, true);
            }
            import("ORG.PHPMailer.PHPMailer");
            $mail = new PHPMailer();
            $mail->IsSMTP();
            $mail->SMTPAuth = true;
            $mail->WordWrap = 50;
            $mail->IsHTML(true);
            $mail->AltBody = "";
            $mail->CharSet = "UTF-8";
            $mail->SMTPSecure = $akmallConfig['mail_ssl'];
            $mail->Host = $akmallConfig['mail_smtp'];
            $mail->Port = $akmallConfig['mail_port'];
            $mail->Username = $akmallConfig['mail_account'];
            $mail->Password = $akmallConfig['mail_password'];
            $mail->From = $akmallConfig['mail_account'];
            $mail->FromName = $akmallConfig['title'];
            $mail->Subject = $title;
            $mail->Body = $content;
            $mail->AddReplyTo($akmallConfig['mail_account'], "Information");
            foreach ($email as $m) {
                $mail->AddAddress($m);
            }
            $status = $mail->Send();
            return array(
                'status' => $status ? 1 : 0,
                'info' => $mail->ErrorInfo
            );
        }
        public function confirm() {
            $op = intval($_POST['op']);
            $id = trim($_POST['id']);
            $Order = M('Order');
            if (!is_numeric($id)) {
                $this->ajaxReturn(0, L('OrderNotExist') , 0);
            }
            $where = array(
                'order_no' => $id
            );
            $info = $Order->where($where)->field('id,status')->find();
            if (empty($info)) {
                $this->ajaxReturn(0, L('OrderNotExist') , 0);
            }
            switch ($info['status']) {
                case '0':
                    $data = array(
                        'order_id' => $info['id'],
                        'status' => $op,
                        'remark' => ($op == '2' ? L('customerConfirm') : L('customerCancel')) ,
                    );
                    $data['sign'] = createSign($data, C('akmall_KEY'));
                    $ret = $this->akmallUpdateStatus($data);
                    if ($ret['status'] == 1) {
                        $msg = $op == '2' ? L('confirmSuccess') : L('cancelSuccess');
                        $this->ajaxReturn(0, $msg, 0);
                    } else {
                        $this->ajaxReturn(0, L('failure') , 0);
                    }
                    break;

                case '2':
                    $this->ajaxReturn(0, L('OrderConfirmed') , 0);
                    break;

                case '6':
                    $this->ajaxReturn(0, L('OrderCanceled') , 0);
                    break;

                default:
                    $this->ajaxReturn(0, L('statusMismatching') , 0);
            }
        }
        function regionMatch($mobile, $address = '') {
            $str = http("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" . $mobile);
            preg_match('/province:\'(.+)\'/i', $str, $region);
            $province = iconv('GB2312', 'UTF-8', $region[1]);
            if (empty($address)) {
                $str = http("http://ip.taobao.com/service/getIpInfo.php?ip=" . get_client_ip());
                $json = json_decode($str, true);
                $address = $json['data']['region'];
            }
            if (strstr($address, $province)) {
                return true;
            } else {
                return false;
            }
        }
        private function decQuantity($item_id, $num = 1) {
            M('Item')->where('id=' . (int)$item_id)->setDec('quantity', $num);
        }
    }
?>