Browse Source

dispart mchsrv from mobile

stanley-king 4 năm trước cách đây
mục cha
commit
cfb44dedcf

+ 3 - 0
mchsrv/config/config.ini.php

@@ -0,0 +1,3 @@
+<?php
+defined('InShopNC') or exit('Access Invalid!');
+

+ 146 - 0
mchsrv/control/merchant.php

@@ -0,0 +1,146 @@
+<?php
+
+
+class merchantControl
+{
+    private $mMchid;
+    private $mAdminid;
+    private $mUseKey;
+    public function __construct()
+    {
+        $mchid = $_POST['mchid'];
+        $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
+        if(empty($mchinfo)) {
+            throw new Exception("合作方ID:{$mchid}不存在");
+        }
+        else {
+            $this->mAdminid = intval($mchinfo['admin_id']);
+        }
+
+        if ($mchinfo['merchant_state'] != 1) {
+            throw new Exception("机构已被关闭。");
+        }
+
+        $ips = unserialize($mchinfo['ip_white_list']);
+
+        if(!empty($ips)) {
+            $addr = $_SERVER['REMOTE_ADDR'];
+            Log::record("request ip:{$addr}",Log::DEBUG);
+
+            if(!in_array($addr,$ips)) {
+                throw new Exception("请求地址不在白名单中");
+            }
+        }
+
+        $this->mUseKey = intval($mchinfo['use_key']);
+        if($this->mUseKey && !$this->verify_md5($mchinfo['secure_key'])) {
+            throw new UnSignException();
+        }
+
+        $this->mMchid = intval($mchid);
+    }
+
+    public function mchid() : int
+    {
+        return $this->mMchid;
+    }
+    public function adminid() : int {
+        return $this->mAdminid;
+    }
+
+    private function pubKey($mchid)
+    {
+        static $pubs = [];
+
+        if(array_key_exists($mchid,$pubs)) {
+            return $pubs[$mchid];
+        }
+        else {
+            $pub_key = BASE_DATA_PATH . "/api/merchant/key/{$mchid}_pub.pem";
+            $key = file_get_contents($pub_key);
+            $pub = openssl_get_publickey($key);
+            $pubs[$mchid] = $pub;
+            return $pub;
+        }
+    }
+
+    private function verify_md5($key)
+    {
+        $input = $_GET;
+        $sign = $input['sign'];
+
+        $input['sign'] = null;
+        $input['from'] = null;
+
+        $body = $this->sign_body($input);
+
+        if($this->mUseKey) {
+            $body .= "&key={$key}";
+        }
+
+        return ($sign == md5($body));
+    }
+
+    private function verify_rsa($mchid)
+    {
+        $pub = $this->pubKey($mchid);
+        if(empty($pub)) {
+            return false;
+        }
+        $input = $_GET;
+        $sign = $input['sign'];
+        $input['sign'] = null;
+        $input['from'] = null;
+
+        $data = $this->sign_body($input);
+        $res = openssl_verify($data,base64_decode($sign),$pub);
+        Log::record("openssl_verify res={$res}",Log::DEBUG);
+
+        return ($res == 1);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign_body($params)
+    {
+        ksort($params);
+
+        $content = "";
+        $i = 0;
+        foreach ($params as $k => $v)
+        {
+            if (false === $this->check_empty($v) && "@" != substr($v, 0, 1))
+            {
+                if ($i == 0) {
+                    $content .= "{$k}" . "=" . urlencode($v);
+                } else {
+                    $content .= "&" . "{$k}" . "=" . urlencode($v);
+                }
+                $i++;
+            }
+        }
+
+        return $content;
+    }
+
+    public static function outsuccess($data)
+    {
+        joutput_data($data);
+        return true;
+    }
+    public static function outerr($code, $msg = '')
+    {
+        joutput_error($code, $msg);
+        return true;
+    }
+}

+ 7 - 0
mchsrv/control/merchant_admin.php

@@ -0,0 +1,7 @@
+<?php
+
+
+class merchant_admin
+{
+
+}

+ 556 - 0
mchsrv/control/merchant_info.php

@@ -0,0 +1,556 @@
+<?php
+require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
+
+class merchant_infoControl extends mbMerchantControl
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function indexOp()
+    {
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $field = 'mchid,admin_id,name,alarm_amount,ip_white_list,use_key,contact_name,contact_phone,warning_phone,company_name,quality,time_out,credit_bonus';
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid], $field);
+        $model_member = Model('member');
+        $member_info = $model_member->getMemberInfo(['member_id' => $merchant_info['admin_id']], 'available_predeposit');
+        if (empty($member_info)) {
+            $member_info['available_predeposit'] = 0;
+        }
+        $merchant_info['member'] = $member_info;
+
+        if (empty($merchant_info['ip_white_list'])) {
+            $merchant_info['ips'] = [];
+        } else {
+            $merchant_info['ips'] = unserialize($merchant_info['ip_white_list']);
+        }
+        if (empty($merchant_info['warning_phone'])) {
+            $merchant_info['warning_phone'] = [];
+        } else {
+            $merchant_info['warning_phone'] = unserialize($merchant_info['warning_phone']);
+        }
+
+        $cond['status'] = $cond['is_operation'] = 2;
+        $cond['mchid'] = $mchid;
+        $stats = Model('')->table('refill_evidence')
+            ->field('sum(amount) as amounts')
+            ->where($cond)->select();
+        $merchant_info['evidence_amounts'] = empty($stats) ? 0 : $stats[0]['amounts'];
+        $cond['add_time'] = ['between', [strtotime(date("Y-m-d",time())), time()]];
+        $day_evidence = $model_merchant->getRefillEvidence($cond);
+        $merchant_info['evidence_count'] = count($day_evidence);
+        $merchant_info['time_out'] = intval($merchant_info['time_out'] / 60);
+        $merchant_info['quality'] = intval($merchant_info['quality']);
+
+        $pub = new message\publisher();
+        $pub->modify_refill_merchant();
+
+        return self::outsuccess($merchant_info);
+    }
+
+    public function SetQualityTimeOutOp()
+    {
+        $mchid = $this->mchid();
+        $save = [];
+        $quality = intval($_POST['quality']);
+        if($quality > 0) {
+            if(!in_array($quality , [1,2,3])) {
+                return self::outerr(errcode::ErrParamter, "通道质量类型错误");
+            }
+            $save['quality'] = $quality;
+        }
+        $time_out = intval($_POST['time_out']);
+        if($quality > 0) {
+            if($time_out <3) {
+                return self::outerr(errcode::ErrParamter, "超时时间应大于3分钟");
+            }
+            $time_out = intval($time_out * 60);
+            $save['time_out'] = $time_out;
+        }
+        if(empty($save)) {
+            return self::outsuccess([]);
+        }
+        $model_merchant = Model('merchant');
+        $resp = $model_merchant->editMerchant($save, ['mchid' => $mchid]);
+        if($resp) {
+            return self::outsuccess([]);
+        }else{
+            return self::outerr(errcode::ErrOperation, "系统错误.");
+        }
+    }
+
+    public function homeOp()
+    {
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid], 'mchid,admin_id,name,company_name');
+        $model_member = Model('member');
+        $member_info = $model_member->getMemberInfo(['member_id' => $merchant_info['admin_id']], 'available_predeposit');
+        if (empty($member_info)) {
+            $merchant_info['available_predeposit'] = 0;
+        } else {
+            $merchant_info['available_predeposit'] = ncPriceFormat($member_info['available_predeposit']);
+        }
+
+        $statistics = $this->statistics();
+        ksort($statistics);
+        $result['merchant_info'] = $merchant_info;
+        $result['todayStatistics'] = $statistics[strtotime(date("Y-m-d",time()))];
+        $result['weeksStatistics'] = $statistics;
+        $max = 0;
+        foreach ($statistics as $key => $val){
+            if($max == 0){
+                $max = $val['successAmounts'];
+
+            }
+            if($max < $val['count']){
+                $max = $val['successAmounts'];
+            }
+        }
+        $result['max'] = ncPriceFormat(ceil($max * 1.1));
+        $week_month_stats = $this->refillStats();
+        $result['month'] = $week_month_stats['month'];
+        $result['week'] = $week_month_stats['week'];
+        return self::outsuccess($result);
+    }
+
+    private function statistics()
+    {
+        $date = date('Y-m-d',time());
+        $today = strtotime("{$date}");
+
+        $times_begin = function ($start) {
+            $times = [];
+            $begin = $start;
+            for($i = 0; $i < 7; $i++) {
+                $times[] = $begin;
+                $begin -= 86400;
+            }
+            return $times;
+        };
+
+        $reader = function ($mchid,$time) {
+            $cond['mchid'] = $mchid;
+            $cond['inner_status'] = 0;
+            $cond['refill_order.order_time'] = ['between', [$time, $time + 86400 -1]];
+
+            $items = Model('')->table('refill_order,vr_order')->join('inner')
+                ->on('refill_order.order_id=vr_order.order_id')
+                ->field('count(*) as order_count, vr_order.order_state, sum(mch_amount) as mch_amounts')
+                ->group('order_state')
+                ->where($cond)->select();
+
+            return $this->refillCountDispose($items);
+        };
+
+        $begins = $times_begin($today);
+
+        $states = rcache($this->mchid() , 'refillstat-');
+
+        if(empty($states)){
+            $states = [];
+        }else{
+            $states = unserialize($states['data']);
+        }
+        $result = [];
+        $cache = [];
+        foreach ($begins as $begin)
+        {
+            if(array_key_exists($begin,$states)) {
+                $item = $states[$begin];
+            }
+            else {
+                $item = $reader($this->mchid(),$begin);
+            }
+            $result[$begin] = $item;
+
+            //判断item 中充值中的状态是否为0,为0且不是今天的情况下放进cache
+            if($item['sendCount'] == 0 && $begin != $today){
+                $cache[$begin] = $item;
+            }
+        }
+        if(!empty($cache) && !$this->isSame($states,$cache)) {
+            wcache($this->mchid() ,['data' => serialize($cache)], 'refillstat-');
+        }
+
+        return $result;
+    }
+
+    private function isSame($arr1, $arr2)
+    {
+        ksort($arr1);
+        ksort($arr2);
+        return $arr1 == $arr2;
+    }
+
+    private function refillCountDispose($stats)
+    {
+        $result['count'] = $result['sendCount'] = $result['errorCount'] = $result['successCount'] = $result['amountCount'] = $result['errorAmounts'] = $result['successAmounts'] = 0;
+        foreach ($stats as $count) {
+            $result['count'] += $count['order_count'];
+            $result['amountCount'] += ncPriceFormat($count['mch_amounts']);
+            if($count['order_state'] == ORDER_STATE_SEND) {
+                $result['sendCount'] = $count['order_count'];
+            }
+            if($count['order_state'] == ORDER_STATE_CANCEL) {
+                $result['errorCount'] = $count['order_count'];
+                $result['errorAmounts'] = ncPriceFormat($count['mch_amounts']);
+            }
+            if($count['order_state'] == ORDER_STATE_SUCCESS) {
+                $result['successCount'] = $count['order_count'];
+                $result['successAmounts'] = ncPriceFormat($count['mch_amounts']);
+            }
+        }
+        $result['amountCount'] = ncPriceFormat($result['amountCount']);
+        $result['errorAmounts'] = ncPriceFormat($result['errorAmounts']);
+        $result['successAmounts'] = ncPriceFormat($result['successAmounts']);
+        return $result;
+    }
+
+    private function refillStats()
+    {
+        $reader = function ($mchid,$time,$end_time) {
+            $cond['mchid'] = $mchid;
+            $cond['inner_status'] = 0;
+            $cond['refill_order.order_time'] = ['between', [$time, $end_time]];
+
+            $items = Model('')->table('refill_order,vr_order')->join('inner')
+                ->on('refill_order.order_id=vr_order.order_id')
+                ->field('count(*) as order_count, vr_order.order_state, sum(mch_amount) as mch_amounts')
+                ->group('order_state')
+                ->where($cond)->select();
+
+            return $this->refillCountDispose($items);
+        };
+        $date = date("Y-m-d");
+        $first = 1;
+        $w = date('w',strtotime($date));
+        $week_start = strtotime(date('Y-m-d',strtotime("$date -".($w ? $w - $first : 6).' days')));
+        $w = 7 - $w + 1;
+        $week_end = strtotime(date('Y-m-d',strtotime("+{$w} days"))) - 1;
+        $week = $reader($this->mchid(), $week_start,$week_end);
+
+        $month_start = strtotime(date("Y-m-1"));
+        $month_end = strtotime(date("Y-m-1",strtotime("+1month")))-1;
+        $month = $reader($this->mchid(), $month_start, $month_end);
+
+        return ['week' => $week , 'month' => $month];
+    }
+
+    public function addipOp()
+    {
+        $mchid = $this->mchid();
+        $ip = $_POST['ip'];
+        if (empty($ip)) {
+            return self::outerr(errcode::ErrParamter, "参数错误");
+        }
+        $ip = trim($ip);
+        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
+        {
+            $model_merchant = Model('merchant');
+            $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+            if (empty($merchant_info['ip_white_list'])) {
+                $ips = [];
+            } else {
+                $ips = unserialize($merchant_info['ip_white_list']);
+            }
+
+            $ips[] = $ip;
+            $ips = array_unique($ips);
+
+            $model_merchant->editMerchant(['ip_white_list' => serialize($ips)], ['mchid' => $merchant_info['mchid']]);
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrParamter, "ip地址错误");
+        }
+    }
+
+    public function ipdelOp()
+    {
+        $mchid = $this->mchid();
+        $ip = $_POST['ip'];
+        if (empty($ip)) {
+            return self::outerr(errcode::ErrParamter, "参数错误");
+        }
+        $ip = trim($ip);
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        $ips = unserialize($merchant_info['ip_white_list']);
+        $new_ips = [];
+        foreach ($ips as $value) {
+            if ($value != $ip) {
+                $new_ips[] = $value;
+            }
+        }
+        if (empty($new_ips)) {
+            $new_ips = '';
+        } else {
+            $new_ips = serialize($new_ips);
+        }
+        $model_merchant->editMerchant(['ip_white_list' => $new_ips], ['mchid' => $merchant_info['mchid']]);
+        return self::outsuccess([]);
+    }
+
+    public function setcontactOp(){
+        $mchid = $this->mchid();
+        if(!empty($_POST['contact_name']))
+        {
+            $params['contact_name'] = trim($_POST['contact_name']);
+        }
+        if(!empty($_POST['contact_phone']))
+        {
+            $params['contact_phone'] = trim($_POST['contact_phone']);
+        }
+        if(!empty($_POST['alarm_amount']))
+        {
+            $params['alarm_amount'] = trim($_POST['alarm_amount']);
+        }
+        if(empty($params))
+        {
+            return self::outsuccess([]);
+        }
+        $model_merchant = Model('merchant');
+        $ret = $model_merchant->editMerchant($params, ['mchid' => $mchid]);
+        if ($ret) {
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrOperation, "系统错误.");
+        }
+    }
+
+    public function addwphoneOp()
+    {
+        $mchid = $this->mchid();
+        $phone = $_POST['phone'];
+        if (empty($phone)) {
+            return self::outerr(errcode::ErrParamter, "参数错误");
+        }
+        $phone = explode(',' ,trim($phone));
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (empty($merchant_info['warning_phone'])) {
+            $phones = [];
+        } else {
+            $phones = unserialize($merchant_info['warning_phone']);
+        }
+        foreach ($phone as $item) {
+            $phones[] = $item;
+        }
+        $phones = array_unique($phones);
+        $model_merchant->editMerchant(['warning_phone' => serialize($phones)], ['mchid' => $merchant_info['mchid']]);
+        return self::outsuccess([]);
+    }
+
+    public function wphonedelOp()
+    {
+        $mchid = $this->mchid();
+        $phone = $_POST['phone'];
+        if (empty($phone)) {
+            return self::outerr(errcode::ErrParamter, "参数错误");
+        }
+        $phone = trim($phone);
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        $phones = unserialize($merchant_info['warning_phone']);
+        $new_phones = [];
+        foreach ($phones as $value) {
+            if ($value != $phone) {
+                $new_phones[] = $value;
+            }
+        }
+        if (empty($new_phones)) {
+            $new_phones = '';
+        } else {
+            $new_phones = serialize($new_phones);
+        }
+        $model_merchant->editMerchant(['warning_phone' => $new_phones], ['mchid' => $merchant_info['mchid']]);
+        return self::outsuccess([]);
+    }
+
+    public function setkeyOp()
+    {
+        $mchid = $this->mchid();
+        $secure_key = $_POST['secure_key'];
+        if (empty($secure_key)) {
+            return self::outerr(errcode::ErrParamter, "参数错误");
+        }
+        $model_merchant = Model('merchant');
+        $ret = $model_merchant->editMerchant(['secure_key' => $secure_key, 'use_key' => 1], ['mchid' => $mchid]);
+        if ($ret) {
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrOperation, "系统错误.");
+        }
+    }
+
+    public function modifypwOp()
+    {
+        $mchid = $this->mchid();
+        $new_pw = $_POST['new_pw'];
+        $new_pw2 = $_POST['new_pw2'];
+        if (trim($new_pw) !== trim($new_pw2)) {
+            return self::outerr(errcode::ErrPasswd, "密码错误");
+        }
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (!$merchant_info) {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+        $pwd = trim($new_pw);
+        if (md5($pwd) == $merchant_info['password']) {
+            return self::outsuccess([]);
+        }
+        $ret = $model_merchant->editMerchant(['password' => md5($pwd), 'org_pwd' => $pwd], ['mchid' => $merchant_info['mchid']]);
+        if ($ret) {
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrOperation, "系统错误.");
+        }
+    }
+
+    public function pdlogOp()
+    {
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (!$merchant_info) {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+        $model_pd = Model('merchant');
+        if (empty($merchant_info['admin_id'])) {
+            $result['data'] = [];
+            $result['total'] = 0;
+            return self::outsuccess($result);
+        }
+        $cond['lg_member_id'] = $merchant_info['admin_id'];
+        if (!empty($_GET['lg_type'])) {
+            $cond['lg_type'] = $_GET['lg_type'];
+        }
+        if ($_GET['start_time'] && $_GET['end_time']) {
+            $cond['lg_add_time'] = ['between', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        $list = $model_pd->getPdlog($cond, $this->page, '*', 'lg_id desc');
+        $list = $this->PdLogFormat($list);
+        $result['data'] = $list;
+        $result['total'] = $model_pd->gettotalpage();
+        return self::outsuccess($result);
+    }
+
+    private function PdLogFormat($pdlog)
+    {
+        $data = [];
+        foreach ($pdlog as $key => $value) {
+            if (isset($value['lg_add_time'])) {
+                $value['lg_add_time'] = date('Y-m-d H:i:s', $value['lg_add_time']);
+            }
+            switch ($value['lg_type']) {
+                case 'order_pay':
+                    $value['lg_type_text'] = '下单减款';
+                    break;
+                case 'order_cancel':
+                    $value['lg_type_text'] = '下单失败返回余款';
+                    break;
+                case 'recharge':
+                    $value['lg_type_text'] = '余款充值';
+                    break;
+                case 'sys_add_money':
+                    $value['lg_type_text'] = '管理员调节预存款【增加】';
+                    break;
+                case 'sys_del_money':
+                    $value['lg_type_text'] = '管理员调节预存款【减少】';
+                    break;
+                case 'sys_freeze_money':
+                    $value['lg_type_text'] = '管理员调节预存款【冻结】';
+                    break;
+                case 'sys_unfreeze_money':
+                    $value['lg_type_text'] = '管理员调节预存款【解冻】';
+                    break;
+                default:
+                    $value['lg_type_text'] = 'unknown';
+                    break;
+            }
+            $data[] = $value;
+        }
+        return $data;
+    }
+
+    public function pdlogexportOp()
+    {
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (!$merchant_info) {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+
+
+        $condition['lg_member_id'] = $merchant_info['admin_id'];
+        if (!empty($_GET['lg_type'])) {
+            $condition['lg_type'] = $_GET['lg_type'];
+        }
+        if ($_GET['start_time'] && $_GET['end_time']) {
+            $condition['lg_add_time'] = ['between', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        $list = Model('')->table('pd_log,refill_order')->join('left')
+            ->on('pd_log.lg_order_sn=refill_order.order_sn')
+            ->field('pd_log.lg_type,pd_log.lg_av_amount,pd_log.lg_add_time,refill_order.card_no,refill_order.mchid,refill_order.card_type,pd_log.lg_available,refill_order.refill_amount')
+            ->where($condition)->select();
+        $result = $this->export_pdlog_exec($list);
+        return self::outsuccess($result);
+    }
+
+    private function export_pdlog_exec($list)
+    {
+        $title = [
+            ['value' => '代理商账号'],
+            ['value' => '金额'],
+            ['value' => '账户余额'],
+            ['value' => '交易日期'],
+            ['value' => '类型'],
+            ['value' => '备注']
+        ];
+        $mchid = $this->mchid();
+        $card_type = ['1'=>'中石油' , '2' =>'中石化' , '4' => '移动' , '5' => '联通' , '6' => '电信'];
+        foreach ($list as $value) {
+            if (isset($value['lg_add_time'])) {
+                $value['lg_add_time'] = date('Y-m-d H:i:s', $value['lg_add_time']);
+            }
+            switch ($value['lg_type']) {
+                case 'order_pay':
+                    $value['lg_type_text'] = '消费';
+                    break;
+                case 'order_cancel':
+                    $value['lg_type_text'] = '退款';
+                    break;
+                case 'recharge':
+                    $value['lg_type_text'] = '充值';
+                    break;
+                case 'sys_add_money':
+                    $value['lg_type_text'] = '管理员充值【增加】';
+                    break;
+                case 'sys_del_money':
+                    $value['lg_type_text'] = '管理员减款';
+                    break;
+                default:
+                    $value['lg_type_text'] = '';
+                    break;
+            }
+            $data = [];
+            $str = "{$value['card_no']}-{$card_type[$value['card_type']]}{$value['refill_amount']}元";
+            if(empty($value['card_no']) || empty($value['card_type']) || empty($value['refill_amount'])) {
+                $str = '';
+            }
+            $data[] = ['value' => $mchid];
+            $data[] = ['value' => $value['lg_av_amount']];
+            $data[] = ['value' => ncPriceFormat($value['lg_available'] + $value['lg_av_amount'])];
+            $data[] = ['value' => $value['lg_add_time']];
+            $data[] = ['value' => $value['lg_type_text']];
+            $data[] = ['value' => $str];
+            $datas[] = $data;
+        }
+        Log::record(json_encode($datas),Log::DEBUG);
+        return ['title' => $title , 'data' => $datas];
+    }
+}

+ 54 - 0
mchsrv/control/merchant_login.php

@@ -0,0 +1,54 @@
+<?php
+
+require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
+
+//商户后台登录
+class merchant_loginControl extends merchantwebControl
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function loginOp()
+    {
+        $name = $_POST['name'];
+        $pwd = md5($_POST['password']);
+        $model_merchant = Model('merchant');
+
+        $mch_info = $model_merchant->getMerchantInfo(['name' => $name], '*');
+        if (!empty($mch_info)) {
+            if ($mch_info['password'] != $pwd) {
+                return self::outerr(errcode::ErrPasswd, "密码错误");
+            }
+            if ($mch_info['merchant_state'] != 1) {
+                return self::outerr(errcode::ErrAccountStop, "机构已被关闭,无法登录。");
+            }
+
+            $client_ip = $_SERVER['REMOTE_ADDR'];
+            $model_merchant->editMerchant(['last_login_time' => time(), 'last_login_ip' => $client_ip], ['mchid' => $mch_info['mchid']]);
+
+            $model_member = Model('member');
+            $member_info = $model_member->getMemberInfo(['member_id' => $mch_info['admin_id']], 'available_predeposit');
+
+            $mch_info['member'] = $member_info;
+            if (empty($mch_info['ip_white_list'])) {
+                $mch_info['ips'] = [];
+            } else {
+                $mch_info['ips'] = unserialize($mch_info['ip_white_list']);
+            }
+            $_SESSION['mchid'] = $mch_info['mchid'];
+            $_SESSION['member_id'] = $mch_info['admin_id'];
+
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+    }
+
+    public function logoutOp()
+    {
+        setNcCookie('MPHPSESSID', 0, -3600);
+        return self::outsuccess([]);
+    }
+}

+ 287 - 0
mchsrv/control/merchant_order.php

@@ -0,0 +1,287 @@
+<?php
+require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
+
+class merchant_orderControl extends mbMerchantControl
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function listOp()
+    {
+        $model_vr_order = Model('refill_order');
+
+        $cond['mchid'] = $this->mchid();
+        $cond['inner_status'] = 0;
+        if (!empty($_GET['card_type'])) {
+            if(in_array($_GET['card_type'] , ['1' , '2' , '4' , '5' , '6'])) {
+                $cond['refill_order.card_type'] = $_GET['card_type'];
+            }
+            if($_GET['card_type'] == 'oil') {
+                $cond['refill_order.card_type'] = ['in' , ['1' , '2']];
+            }
+            if($_GET['card_type'] == 'phone') {
+                $cond['refill_order.card_type'] = ['in' , ['4' , '5' , '6']];
+            }
+        }
+        if (!empty($_GET['card_no'])) {
+            $cond['refill_order.card_no'] = $_GET['card_no'];
+        }
+        if (!empty($_GET['refill_amount'])) {
+            $cond['refill_order.refill_amount'] = $_GET['refill_amount'];
+        }
+        if (!empty($_GET['mch_order'])) {
+            $cond['refill_order.mch_order'] = $_GET['mch_order'];
+        }
+        if (!empty($_GET['order_sn'])) {
+            $cond['refill_order.order_sn'] = $_GET['order_sn'];
+        }
+        if (in_array($_GET['order_state'], array('0', '30', '40'))) {
+            $cond['vr_order.order_state'] = $_GET['order_state'];
+            if($_GET['order_state'] == 30 && $_GET['time'] == 1){
+                $cond['refill_order.order_time'] = ['lt', (time() - 3600)];
+            }
+        }
+        if ($_GET['start_time'] > 0 && $_GET['end_time'] > 0) {
+            $cond['refill_order.order_time'] = ['between', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        $fields = 'refill_order.*,vr_order.order_state';
+        $order_list = $model_vr_order->getMerchantOrderList($cond, $this->page, $fields, 'refill_order.order_id desc');
+        $order_list = $this->merchant_order_format($order_list);
+        $result['data'] = $order_list;
+        $result['total'] = $model_vr_order->gettotalpage();
+        return self::outsuccess($result);
+    }
+
+    public function OrderStatsOp()
+    {
+        if(empty($_GET['time_type']) || empty($_GET['start_time']) || empty($_GET['end_time'])) {
+            return self::outerr(errcode::ErrInputParam, "参数错误.");
+        }
+        $cond['inner_status'] = 0;
+        $time_type = $_GET['time_type'];
+        if ($time_type == 'order_time') {
+            $cond['order_time'] = ['time', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        if ($time_type == 'notify_time') {
+            $cond['notify_time'] = ['time', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        if(empty($cond)) {
+            return self::outerr(errcode::ErrInputParam, "筛选日期类型错误.");
+        }
+        $cond['mchid'] = $this->mchid();
+        $stats = Model('')->table('refill_order,vr_order')->join('inner')
+            ->on('refill_order.order_id=vr_order.order_id')
+            ->field('count(*) as order_count ,sum(refill_amount) as refill_amounts, sum(mch_amount) as mch_amounts, order_state')
+            ->where($cond)->group('order_state')->select();
+
+        $result['count'] = $result['sendCount'] = $result['errorCount'] = $result['successCount'] = $result['refill_amounts'] = $result['mch_amounts'] = 0;
+        foreach ($stats as $stat) {
+            $result['count'] += $stat['order_count'];
+            if($stat['order_state'] == ORDER_STATE_SEND) {
+                $result['sendCount'] = $stat['order_count'];
+            }
+            if($stat['order_state'] == ORDER_STATE_CANCEL) {
+                $result['errorCount'] = $stat['order_count'];
+            }
+            if($stat['order_state'] == ORDER_STATE_SUCCESS) {
+                $result['successCount'] = $stat['order_count'];
+                $result['mch_amounts'] = $stat['mch_amounts'];
+                $result['refill_amounts'] = $stat['refill_amounts'];
+            }
+        }
+        return self::outsuccess($result);
+    }
+
+    private function merchant_order_format($orders)
+    {
+        $data = [];
+        foreach ($orders as $order) {
+            if($order['notify_time'] > 0)
+            {
+                $order['diff_time_text'] = $this->elapse_time($order['notify_time'] - $order['order_time']);
+                $order['diff_time'] = $order['notify_time'] - $order['order_time'];
+            }
+            else
+            {
+                $order['diff_time_text'] = $this->elapse_time(time() - $order['order_time']);
+                $order['diff_time'] = time() - $order['order_time'];
+            }
+            if (isset($order['order_time'])) {
+                $order['order_time'] = date('Y-m-d H:i:s', $order['order_time']);
+            }
+            if (isset($order['notify_time'])) {
+                $order['notify_time'] = date('Y-m-d H:i:s', $order['notify_time']);
+            }
+            if($order['is_retrying'] == 1) {
+                $order['order_state'] = ORDER_STATE_SEND;
+            }
+            if ($order['order_state'] == ORDER_STATE_NEW || $order['order_state'] == ORDER_STATE_PAY) {
+                $order['order_state'] = ORDER_STATE_SEND;
+            }
+            $order['order_state_text'] = $this->_orderState($order['order_state']);
+            $order['card_type_name'] = $this->scard_type($order['card_type']);
+            $data[] = $order;
+        }
+        return $data;
+    }
+
+    /**
+     * 取得订单状态文字输出形式
+     *
+     * @param int $order_state 订单数组
+     * @return string
+     */
+    private function _orderState($order_state)
+    {
+        switch ($order_state) {
+            case ORDER_STATE_CANCEL:
+                $text = '已取消';
+                break;
+            case ORDER_STATE_NEW:
+                $text = '新订单';
+                break;
+            case ORDER_STATE_SEND:
+                $text = '充值中';
+                break;
+            case ORDER_STATE_PAY:
+                $text = '支付成功';
+                break;
+            case ORDER_STATE_SUCCESS:
+                $text = '充值成功';
+                break;
+            case 'retrying':
+                $text = '重试中';
+                break;
+            default:
+                $text = '未知状态';
+        }
+        return $text;
+    }
+
+    private function scard_type(int $card_type)
+    {
+        if ($card_type == mtopcard\PetroChinaCard) { //中石油
+            return '中石油';
+        } elseif ($card_type == mtopcard\SinopecCard) { //中石化
+            return '中石化';
+        } elseif ($card_type == mtopcard\ChinaMobileCard) { //中国移动
+            return '中国移动';
+        } elseif ($card_type == mtopcard\ChinaUnicomCard) { //中国联通
+            return '中国联通';
+        } elseif ($card_type == mtopcard\ChinaTelecomCard) { //中国电信
+            return '中国电信';
+        } else {
+            return 'unknown';
+        }
+    }
+
+    private function elapse_time($seconds)
+    {
+        $minutes = intval($seconds / 60);
+        $second = intval($seconds % 60);
+        if($minutes >= 60) {
+            $minute = $minutes % 60;
+            $hours = intval($minutes / 60);
+            $result = "{$minute}:{$second}";
+        }
+        else {
+            if($minutes > 0){
+                $result = "{$minutes}:{$second}";
+            }else{
+                $result = "{$second}";
+            }
+        }
+        if(isset($hours))
+        {
+            $result = "{$hours}:" . $result;
+        }
+        return $result;
+    }
+
+    public function OrderExportOp()
+    {
+        $model_vr_order = Model('refill_order');
+
+        $cond['mchid'] = $this->mchid();
+        $cond['inner_status'] = 0;
+        if (!empty($_GET['card_type'])) {
+            if(in_array($_GET['card_type'] , ['1' , '2' , '4' , '5' , '6'])) {
+                $cond['refill_order.card_type'] = $_GET['card_type'];
+            }
+            if($_GET['card_type'] == 'oil') {
+                $cond['refill_order.card_type'] = ['in' , ['1' , '2']];
+            }
+            if($_GET['card_type'] == 'phone') {
+                $cond['refill_order.card_type'] = ['in' , ['4' , '5' , '6']];
+            }
+        }
+        if (!empty($_GET['card_no'])) {
+            $cond['refill_order.card_no'] = $_GET['card_no'];
+        }
+        if (!empty($_GET['refill_amount'])) {
+            $cond['refill_order.refill_amount'] = $_GET['refill_amount'];
+        }
+        if (!empty($_GET['mch_order'])) {
+            $cond['refill_order.mch_order'] = $_GET['mch_order'];
+        }
+        if (!empty($_GET['order_sn'])) {
+            $cond['refill_order.order_sn'] = $_GET['order_sn'];
+        }
+        if (in_array($_GET['order_state'], array('0', '30', '40'))) {
+            $cond['vr_order.order_state'] = $_GET['order_state'];
+            if($_GET['order_state'] == 30 && $_GET['time'] == 1){
+                $cond['refill_order.order_time'] = ['lt', (time() - 3600)];
+            }
+        }
+        if ($_GET['start_time'] > 0 && $_GET['end_time'] > 0) {
+            $cond['refill_order.order_time'] = ['time', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        $fields = 'refill_order.*,vr_order.order_state';
+        $order_list = $model_vr_order->getMerchantOrderList($cond, '10000', $fields, 'refill_order.order_id desc');
+        $order_list = $this->merchant_order_format($order_list);
+
+        $result = $this->export_order_exec($order_list);
+        return self::outsuccess($result);
+    }
+
+    private function export_order_exec($order_list)
+    {
+        $title = [
+            ['value' => '代理商账号'],
+            ['value' => '商品名称'],
+            ['value' => '交易账号'],
+            ['value' => '交易金额'],
+            ['value' => '交易面值'],
+            ['value' => '交易日期'],
+            ['value' => '交易状态'],
+            ['value' => '处理时间'],
+            ['value' => '第三方流水']
+        ];
+        $card_type = ['1'=>'中石油' , '2' =>'中石化' , '4' => '移动' , '5' => '联通' , '6' => '电信'];
+        foreach ($order_list as $order) {
+            $data = [];
+            $official_sn = $order['official_sn'];
+            $notify_time = $order['$notify_time'];
+            if(empty($order['official_sn'])) {
+                $official_sn = '';
+            }
+            if(empty($order['$notify_time'])) {
+                $notify_time = '';
+            }
+            $data[] = ['value' => $order['mchid']];
+            $data[] = ['value' => "{$card_type[$order['card_type']]}{$order['refill_amount']}元"];
+            $data[] = ['value' => $order['card_no']];
+            $data[] = ['value' => $order['mch_amount']];
+            $data[] = ['value' => $order['refill_amount']];
+            $data[] = ['value' => $order['order_time']];
+            $data[] = ['value' => $order['order_state_text']];
+            $data[] = ['value' => $notify_time];
+            $data[] = ['value' => $official_sn];
+            $datas[] = $data;
+        }
+        Log::record(json_encode($datas),Log::DEBUG);
+        return ['title' => $title , 'data' => $datas];
+    }
+}

+ 132 - 0
mchsrv/control/merchant_refill.php

@@ -0,0 +1,132 @@
+<?php
+
+require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
+require_once(BASE_HELPER_PATH . '/refill/RefillFactory.php');
+require_once(BASE_HELPER_PATH . '/mtopcard/mtopcard.php');
+
+class merchant_refillControl extends mbMerchantControl
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function goodsOp()
+    {
+        $goods = refill\RefillFactory::instance()->goods();
+
+        $result['oil_amount'] = [];
+        $result['phone_amount'] = [];
+        foreach ($goods as $type => $specs)
+        {
+            if($type == mtopcard\SinopecCard || $type == mtopcard\PetroChinaCard) {
+                foreach ($specs as $spec) {
+                    $result['oil_amount'][] = $spec;
+                }
+            }
+            else {
+                foreach ($specs as $spec) {
+                    $result['phone_amount'][] = $spec;
+                }
+            }
+        }
+
+        $oil_amount = array_unique($result['oil_amount']);
+        sort($oil_amount);
+        $phone_amount = array_unique($result['phone_amount']);
+        sort($phone_amount);
+
+        return self::outsuccess(['oil_amount' => $oil_amount,'phone_amount' => $phone_amount]);
+    }
+
+    private function check_params($params)
+    {
+        if(empty($params['cardno'])) {
+            return [false,'参数没有包含cardno'];
+        }
+        if(empty($params['amount'])) {
+            return [false,'参数没有包含充值金额:amount'];
+        }
+
+        $card_no = $params['cardno'];
+        $card_type = mtopcard\card_type($card_no,$regin_no);
+
+        if($card_type == mtopcard\UnknownCard) {
+            return [false,'卡类型无法识别'];
+        }
+
+        return [true,""];
+    }
+
+    public function addOp()
+    {
+        $params = $_POST;
+
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (empty($merchant_info)) {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+
+        $amount = intval($params['amount']);
+        $card_nos = trim($params['cardno']);
+        $card_nos = explode(',' , $card_nos);
+        if(empty($card_nos)){
+            return self::outerr(errcode::ErrParamter, "卡号格式错误或未上传");
+        }
+
+        //成功个数、失败个数
+        $success_no = $error_no = 0;
+        $data = [];
+        $all_no = count($card_nos);
+        foreach ($card_nos as $no)
+        {
+            $params['cardno'] = $no;
+            [$success,$error] = $this->check_params($params);
+
+            if($success === false) {
+                $error_no++;
+                $arr['state'] = 201;
+                $arr['err'] = $error;
+            }
+            else
+            {
+                Log::record("no = {$no}",Log::DEBUG);
+                $params = [ 'mchid' => $this->mchid(),
+                    'buyer_id' => intval($merchant_info['admin_id']),
+                    'amount' => $amount,
+                    'card_no' => $no,
+                    'mch_order' => "",
+                    'notify_url' => ""];
+
+                $card_type = mtopcard\simple_card_type($no);
+                [$can_refill, $period] = refill\util::can_commit($no, $card_type);
+                if ($can_refill === false) {
+                    $ret = refill\util::async_add($params, $period);
+                } else {
+                    $ret = refill\util::push_add($params);
+                }
+
+                if($ret) {
+                    $arr['state'] = $ret;
+                    $arr['err'] = '';
+                    $success_no++;
+                }
+                else {
+                    $arr['state'] = 202;
+                    $arr['err'] = '提交失败';
+                    $error_no++;
+                }
+            }
+            $arr['card_no'] = $no;
+            $arr['amount'] = $amount;
+            $data[] = $arr;
+        }
+        $result['success_no'] = $success_no;
+        $result['error_no'] = $error_no;
+        $result['all_no'] = $all_no;
+        $result['data'] = $data;
+        return self::outsuccess($result);
+    }
+}

+ 159 - 0
mchsrv/control/merchantweb.php

@@ -0,0 +1,159 @@
+<?php
+
+require_once(BASE_HELPER_PATH . "/session_helper.php");
+
+class merchantwebControl
+{
+    //列表默认分页数
+    protected $page;
+    protected $cur_page;
+    //任务开始时间
+    private static $startime = 0;
+
+    public function __construct()
+    {
+        $_SESSION['client_type'] = $_GET['client_type'];
+        if (is_numeric($_GET['page']) && intval(trim($_GET['page'])) > 0) {
+            $this->page = intval(trim($_GET['page']));
+        } else {
+            $this->page = 10;
+        }
+
+        if (is_numeric($_GET['curpage']) && intval(trim($_GET['curpage'])) > 0) {
+            $this->cur_page = intval(trim($_GET['curpage']));
+        } else {
+            $this->cur_page = 1;
+        }
+        $this->initpage($this->page, $this->cur_page);
+    }
+
+
+    public static function outerr($code, $msg = '', $page = '', $type = 'ajax')
+    {
+        static $json_clients = ['android', 'ios', 'mini'];
+
+        if (!empty($type)) {
+            $show_type = $type;
+        } else {
+            $show_type = $_SESSION['client_type'];
+        }
+
+        if (in_array($show_type, $json_clients)) {
+            joutput_error($code, $msg);
+        } elseif ($show_type == 'wap') {
+            Tpl::clear();
+            Tpl::output("error", $msg);
+            if (!empty($page)) {
+                Tpl::showpage($page);
+            }
+        } elseif ($show_type == 'ajax') {
+            $callback = $_GET['callback'];
+            if (!isset($callback) || empty($callback)) {
+                joutput_error($code, $msg);
+            } else {
+                echo "{$callback}(";
+                joutput_error($code, $msg);
+                echo ");";
+            }
+        } else {
+            if (empty($msg)) {
+                $msg = errcode::msg($code);
+            }
+            $start = microtime(true);
+            echo joutput_error($code, $msg, 'web') . "<br/>";
+            perfor_period("joutput", $start, "web");
+
+            echo sprintf("eclipse_time = %.6f <br/><br/>", self::eclipse_time());
+            echo "性能关键统计:<br/><br/>";
+            echo perfor_log();
+
+            $sqls = Log::sql_log();
+            echo "sql count = " . count($sqls) . "<br/><br/>";
+            foreach ($sqls as $sql) {
+                echo "{$sql}<br/>";
+            }
+        }
+        return true;
+    }
+
+    public static function outsuccess($data, $page = '', $type = NULL)
+    {
+        static $json_clients = ['android', 'ios', 'mini'];
+
+        if (!empty($type)) {
+            $show_type = $type;
+        } else {
+            $show_type = $_SESSION['client_type'];
+        }
+
+        if (in_array($show_type, $json_clients)) {
+            joutput_data($data);
+        } elseif ($show_type == 'wap') {
+            Tpl::clear();
+            if (is_array($data)) {
+                foreach ($data as $key => $val) {
+                    Tpl::output($key, $val);
+                }
+            }
+            if (!empty($page)) {
+                Tpl::showpage($page);
+            }
+        } elseif ($show_type == 'ajax') {
+            $callback = $_GET['callback'];
+            if (!isset($callback) || empty($callback)) {
+                joutput_data($data);
+            } else {
+                echo "{$callback}(";
+                joutput_data($data);
+                echo ");";
+            }
+        } else {
+            echo 'success: return data=<br/>';
+            $start = microtime(true);
+            joutput_data($data, 'web');
+            perfor_period("joutput", $start, "web");
+
+            echo "<br/><br/>";
+            echo sprintf("eclipse_time = %.6f <br/><br/>", self::eclipse_time());
+            echo "性能关键统计:<br/><br/>";
+            echo perfor_log();
+            $sqls = Log::sql_log();
+            echo "sql count = " . count($sqls) . "<br/><br/>";
+
+            foreach ($sqls as $sql) {
+                echo "{$sql}<br/>";
+            }
+        }
+
+        return true;
+    }
+    private static function eclipse_time()
+    {
+        return (microtime(true) - self::$startime);
+    }
+
+    protected function initpage($page_size, $cur_page)
+    {
+        pagecmd('seteachnum', $page_size);
+        pagecmd('setnowpage', $cur_page);
+    }
+}
+
+class mbMerchantControl extends merchantwebControl
+{
+    public $err_code = errcode::Success;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        if (empty($_SESSION['mchid'])) {
+            throw new UnloginException();
+        }
+    }
+
+    public function mchid()
+    {
+        return intval($_SESSION['mchid']);
+    }
+}

+ 91 - 0
mchsrv/control/refill_evidence.php

@@ -0,0 +1,91 @@
+<?php
+require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
+
+class refill_evidenceControl extends mbMerchantControl
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function indexOp()
+    {
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $cond['mchid'] = $mchid;
+        if ($_GET['start_time'] && $_GET['end_time']) {
+            $cond['add_time'] = ['between', [$_GET['start_time'], $_GET['end_time']]];
+        }
+        $list = $model_merchant->getRefillEvidence($cond, $this->page, '*', 'add_time desc', 10);
+        $list = $this->RefillEvidenceFormat($list);
+        $result['data'] = $list;
+        $result['total'] = $model_merchant->gettotalpage();
+        return self::outsuccess($result);
+    }
+
+    public function addOp()
+    {
+        $params = $_POST;
+        if (empty($params['amount'])) {
+            return self::outerr(errcode::ErrParamter, "充值金额错误");
+        }
+        if (empty($params['bank_username'])) {
+            return self::outerr(errcode::ErrParamter, "开户人姓名有误");
+        }
+        if (empty($params['bank_name'])) {
+            return self::outerr(errcode::ErrParamter, "银行名称有误");
+        }
+        if (empty($params['voucher'])) {
+            return self::outerr(errcode::ErrParamter, "凭证名称有误");
+        }
+
+        $mchid = $this->mchid();
+        $model_merchant = Model('merchant');
+        $merchant_info = $model_merchant->getMerchantInfo(['mchid' => $mchid]);
+        if (empty($merchant_info)) {
+            return self::outerr(errcode::ErrMemberNotExist, "用户不存在.");
+        }
+
+
+        $data['amount'] = $params['amount'];
+        $data['bank_username'] = $params['bank_username'];
+        $data['bank_name'] = $params['bank_name'];
+        $data['bz'] = $params['bz'];
+        $data['voucher_name'] = $params['voucher'];
+        $data['mchid'] = $mchid;
+        $data['mch_name'] = $merchant_info['name'];
+        $data['member_id'] = $merchant_info['admin_id'];
+        $data['add_time'] = time();
+
+        $ret = $model_merchant->addRefillEvidence($data);
+        if ($ret) {
+            if(defined('COMPANY_NAME') && COMPANY_NAME === 'XYZ_COMPANY') {
+                global $config;
+                $phones = $config['system_manager_phones'];
+                foreach ($phones as $phone) {
+                    $ret = QueueClient::push('sendSMS', ['mobile'=>$phone,'type'=>'evidence','datas' => [date("m月d日H时") , $merchant_info['company_name'] , $params['amount']]]);
+                    Log::record("phone : {$phone} , result : {$ret}",Log::DEBUG);
+                }
+            }
+            return self::outsuccess([]);
+        } else {
+            return self::outerr(errcode::ErrOperation, "系统错误.");
+        }
+    }
+
+    private function RefillEvidenceFormat($list)
+    {
+        $data = [];
+        $check_status = ['申请中', '已通过', '已驳回'];
+        foreach ($list as $key => $value) {
+            $value['add_time'] = $value['add_time'] > 0 ? date('Y-m-d H:i:s', $value['add_time']) : '/';
+            $value['check_time'] = $value['check_time'] > 0 ? date('Y-m-d H:i:s', $value['check_time']) : '/';
+            $value['status_text'] = $check_status[$value['status'] - 1];
+            if ($value['voucher_name']) {
+                $value['voucher_path'] = UPLOAD_SITE_URL . '/' . ATTACH_UPFILE . DS . $value['voucher_name'];
+            }
+            $data[] = $value;
+        }
+        return $data;
+    }
+}

+ 124 - 0
mchsrv/framework/function/function.php

@@ -0,0 +1,124 @@
+<?php
+/**
+ * mobile公共方法
+ *
+ * 公共方法
+ *
+ */
+defined('InShopNC') or exit('Access Invalid!');
+
+
+require_once(BASE_CORE_PATH . '/framework/libraries/model.php');
+require_once(BASE_DATA_PATH . '/model/member.model.php');
+require_once(BASE_MOBILE_PATH . '/util/errcode.php');
+
+function output_data($datas, $extend_data = array(),$code = 200) 
+{
+    $data = array();
+    $data['code'] = $code;
+
+    if(!empty($extend_data)) {
+        $data = array_merge($data, $extend_data);
+    }
+
+    $data['datas'] = $datas;
+
+    if(!empty($_GET['callback'])) {
+        echo $_GET['callback'].'('.json_encode($data).')';
+    } else {
+        echo json_encode($data);
+    }
+}
+
+function output_error($message, $extend_data = array(),$code = 200) {
+    $datas = array('error' => $message);
+    output_data($datas, $extend_data,$code);
+}
+
+function joutput_data($datas,$type='')
+{
+    $data = [];
+
+    $code = errcode::Success;
+    $data['code'] = $code;
+    $data['message'] = errcode::msg($code);
+
+    $data['datas'] = $datas;
+
+    if($_SESSION['client_type'] != 'ajax')
+    {
+        $contents = ob_get_clean();
+        if(!empty($contents)) {
+            Log::record($contents,Log::ERR);
+        }
+        ob_start();
+    }
+
+    if(!empty($type) && $type == 'web') {
+        echo(json_encode($data,JSON_UNESCAPED_UNICODE));
+    } else {
+        echo(json_encode($data));
+    }
+}
+
+function joutput_error($code,$message = '',$type='')
+{
+    if(empty($message)) {
+        $message = errcode::msg($code);
+    }
+
+    $data = array();
+    $data['code'] = $code;
+    $data['message'] =  $message;
+    $data['datas'] = null;
+
+    if($_SESSION['client_type'] != 'ajax')
+    {
+        $contents = ob_get_clean();
+        if(!empty($contents)) {
+            Log::record($contents,Log::ERR);
+        }
+        ob_start();
+    }
+    Log::record("code = {$code} message = {$message}",Log::ERR);
+
+    if(!empty($type) && $type == 'web') {
+        echo(json_encode($data,JSON_UNESCAPED_UNICODE));
+    } else {
+        echo(json_encode($data));
+    }
+}
+
+function mobile_page($page_count,$totalnum = false)
+{
+    $extend_data = array();
+    $current_page = intval($_GET['curpage']);
+    if($current_page <= 0) {
+        $current_page = 1;
+    }
+    if($current_page >= $page_count) {
+        $extend_data['hasmore'] = false;
+    } else {
+        $extend_data['hasmore'] = true;
+    }
+    $extend_data['page_total'] = $page_count;
+    if($totalnum !== false) {
+        $extend_data['total_num'] = $totalnum;
+    }
+
+    return $extend_data;
+}
+
+/**
+ * 过滤html标签,js代码,css样式标签
+ * @param $str
+ * @return mixed
+ */
+function remove_tags($str) {
+    $str = preg_replace( "@<script(.*?)</script>@is", "", $str );
+    $str = preg_replace( "@<iframe(.*?)</iframe>@is", "", $str );
+    $str = preg_replace( "@<style(.*?)</style>@is", "", $str );
+    $str = preg_replace( "@<(.*?)>@is", "", $str );
+
+    return $str;
+}

+ 1 - 0
mchsrv/framework/index.html

@@ -0,0 +1 @@
+ 

+ 9 - 0
mchsrv/index.php

@@ -0,0 +1,9 @@
+<?php
+/**
+ * 手机接口初始化文件
+ *
+ *
+ */
+require_once(BASE_PATH . '/util/errcode.php');
+require_once(BASE_PATH . '/framework/function/function.php');
+require_once(BASE_PATH . '/control/control.php');

+ 0 - 0
mchsrv/language/index.html


+ 10 - 0
mchsrv/language/zh_cn/mobile.php

@@ -0,0 +1,10 @@
+<?php
+defined('InShopNC') or exit('Access Invalid!');
+
+$lang['order_state_cancel'] = '已取消';
+$lang['order_state_new'] = '待付款';
+$lang['order_state_pay'] = '待发货';
+$lang['order_state_send'] = '待收货';
+$lang['order_state_success'] = '交易完成';
+$lang['order_state_eval'] = '已评价';
+

+ 73 - 0
mchsrv/mchsrv_run.php

@@ -0,0 +1,73 @@
+<?php
+
+define('APP_ID', 'mchsrv');
+define('MOBILE_SERVER',true);
+define('SUPPORT_PTHREAD',true);
+
+define('BASE_ROOT_PATH', str_replace('/mchsrv', '', dirname(__FILE__)));
+define('BASE_PATH', BASE_ROOT_PATH . '/mchsrv');
+
+require_once(BASE_ROOT_PATH . '/global.php');
+require_once(BASE_ROOT_PATH . '/fooder.php');
+require_once(BASE_PATH . '/index.php');
+
+Log::record(__FILE__,Log::DEBUG);
+
+require_once(BASE_ROOT_PATH . '/helper/session.php');
+require_once(BASE_ROOT_PATH . '/helper/img_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/message/msgstates.php');
+require_once(BASE_ROOT_PATH . '/helper/message/msgutil.php');
+require_once(BASE_ROOT_PATH . '/helper/message/subscriber.php');
+require_once(BASE_ROOT_PATH . '/helper/index_tab.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/sms_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/category_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/brand_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
+require_once(BASE_ROOT_PATH . '/helper/search/util.php');
+require_once(BASE_ROOT_PATH . '/helper/search_param.php');
+require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/login_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/third_author/wxauthor.php');
+require_once(BASE_ROOT_PATH . '/helper/fcode/present_manager.php');
+require_once(BASE_ROOT_PATH . '/helper/url_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
+require_once(BASE_HELPER_PATH . '/fcgisrv/MobileServer.php');
+require_once(BASE_HELPER_PATH . '/refill/util.php');
+
+
+function all_channels() {
+    return ['ch_index','activity','goods','refill'];
+}
+
+Base::mobile_init();
+$trdid = Thread::getCurrentThreadId();
+Log::record("thread id = {$trdid}",Log::INFO);
+
+$gMessageStates = new MsgStates();
+StatesHelper::init();
+$listener = new message\subscriber($gMessageStates);
+$listener->start();
+
+//function sig_handler($signo)
+//{
+//    Log::record("queue quit at sig_handler.",Log::DEBUG);
+//    switch($signo) {
+//        case SIGINT:
+//        case SIGHUP:
+//        case SIGQUIT:
+//        case SIGTERM:
+//        default:
+//            break;
+//    }
+//}
+//
+//pcntl_signal(SIGINT,  'sig_handler');
+//pcntl_signal(SIGHUP,  'sig_handler');
+//pcntl_signal(SIGQUIT, 'sig_handler');
+//pcntl_signal(SIGTERM, 'sig_handler');
+
+fcgisrv\MerchantServer::instance()->run_looper();

+ 1 - 0
mchsrv/templates/index.html

@@ -0,0 +1 @@
+ 

+ 231 - 0
mchsrv/util/errcode.php

@@ -0,0 +1,231 @@
+<?php
+declare(strict_types=1);
+
+class errcode //extends SplEnum
+{
+    const __default = self::Success;
+
+    const Success = 200;
+
+    const ErrProtocolDisabled = 300;
+
+    const ErrApptype = 10000;
+    const ErrParamter = 10001;
+    const ErrLogin = 10002;
+    const ErrHasLogined = 10003;
+    const ErrUsertype = 10004;
+    const ErrTokenExpire = 10005;
+    const ErrSmscodeExpire = 10006;
+    const ErrSmscode = 10007;
+    const ErrIDbinded = 10008;
+    const ErrUserExisted = 10009;
+    const ErrPasswd = 10010;
+    const ErrMobileNotBinded = 10011;
+    const ErrOperRepeat = 10012;
+    const ErrAccountStop = 10013;
+    const ErrUnLogin = 10014;
+    const ErrRegister = 10015;
+    const ErrUserOrPass = 10016;
+
+    const ErrFrequentlyRequest = 10017;//请求频繁
+    const ErrUploadFileFailed = 10018; //上传文件失败
+    const ErrUnImplements = 10019;
+    const ErrLittleParamter = 10020;
+    const ErrSignParamter = 10021;
+
+    const ErrSpecial = 10100;
+
+    // 购物车模块(10200-10299)
+    const ErrCart = 10200;
+    const ErrGoodsOff = 10201;
+    const ErrCanNotBuyOwn = 10202;
+    const ErrStorageShort = 10203;
+    const ErrAddCart = 10204;
+    const ErrGoodsOutofStock = 10205;
+    const ErrGoodsSpecial = 10206;
+    const ErrCartDelError = 10207;
+
+    // 订单错误内容
+    const ErrOrder = 10300;
+    const ErrOrderCanNotCancel = 10301;
+    const ErrOrderNotExist = 10302;
+    const ErrOrderState = 10303;
+    const ErrOrderRefundError = 10304;
+    const ErrRefundNotExist = 10305;
+
+
+    const ErrAddress = 10400;
+    const ErrInvoice = 10500;
+    const ErrPayment = 10600;
+    // 快递内容
+    const ErrExpress = 10700;
+    const ErrExpressNotExist = 10701;
+
+    const ErrBonus = 10800;
+    const ErrBonusType = 10801;
+    const ErrBonusMake = 10802;
+    const ErrBonusGrabNull = 10803;
+    const ErrBonusNotEnough = 10804;
+    const ErrBonusSN = 10805;
+    const ErrBonusBinded = 10806;
+    const ErrBonusComment = 10807;
+    const ErrBonusShake = 10808;
+    const ErrBonusDailyRank = 10809;
+
+    //套装
+    const ErrBLUnExist = 10900;
+
+    const ErrDB = 11000;
+    const ErrShake = 11100;
+    const ErrRelation = 11200;
+
+    const ErrTopCard = 11300;
+
+    const ErrSms = 12000;
+    const ErrSmsLessRepeateMinTime = 12001;
+
+    const ErrGoodsNotExist = 13000;
+    const ErrMemberNotExist = 13001;
+    const ErrInputParam = 13002;
+    const ErrVerifyCode = 13003;
+    const ErrMemberExist = 13004;
+    const ErrWxNotExist = 13005;
+    const ErrLoginType = 13006;
+    const ErrGetConfig = 14000;
+    const ErrUpfile = 15000;
+    const ErrAuthor = 16000;
+    const ErrUGC = 17000;
+
+    const ErrRoom = 18000;
+    const ErrRoomCreate = 18001;
+    const ErrRoomInvite = 18002;
+    const ErrRoomLeave   = 18003;
+    const ErrRoomBuild  = 18004;
+    const ErrRoomParam  = 18005;
+    const ErrRoomFactoryOp  = 18006;
+    const ErrRoomAccessOp  = 18007;
+    const ErrRoomPush  = 18008;
+    const ErrRoomChange = 18009;
+    const ErrRoomKickout = 18010;
+    const ErrRoomTwoFace = 18011;
+    const ErrRoomNotice = 18012;
+
+    const ErrAccess = 19000;
+    const ErrTalk = 20000;
+
+    const ErrSafeIp = 21000;
+    const ErrOperation = 22000;
+    const ErrPushQueue = 23000;
+
+    static function msg($code)
+    {
+        switch ($code) {
+            case errcode::Success:
+                return '成功';
+            case errcode::ErrProtocolDisabled:
+                return '协议未启用';
+            case errcode::ErrApptype :
+                return '应用类型错误';
+            case errcode::ErrParamter :
+                return '错误的参数.';
+            case errcode::ErrLogin :
+                return '用户名或密码错误';
+            case errcode::ErrHasLogined :
+                return '当前在登录状态,请先登出再登录.';
+            case errcode::ErrUsertype :
+                return '用户类型错误';
+            case errcode::ErrTokenExpire :
+                return 'token过期';
+            case errcode::ErrSmscodeExpire :
+                return '验证码过期';
+            case errcode::ErrSmscode:
+                return '验证码错误';
+            case errcode::ErrIDbinded:
+                return '用户已经绑定';
+            case errcode::ErrMobileNotBinded :
+                return '手机号尚未绑定';
+            case errcode::ErrOperRepeat :
+                return '抱歉,您登录重试次数超过限制,请十分钟后再试~';
+            case errcode::ErrAccountStop :
+                return '该帐号已经被停用';
+            case errcode::ErrUnLogin :
+                return '您没有登录不能做此操作.';
+            case errcode::ErrSpecial:
+                return 'ErrSpecial.';
+            case errcode::ErrPayment:
+                return '支付错误.';
+            case errcode::ErrGoodsNotExist:
+                return '商品库存不足或已下架.';
+            case errcode::ErrMemberNotExist:
+                return '用户不存在.';
+            case errcode::ErrInputParam:
+                return '输入参数错误';
+            case errcode::ErrVerifyCode:
+                return '验证码错误';
+            case errcode::ErrMemberExist:
+                return '用户已经存在';
+            case errcode::ErrPasswd:
+                return '账号或密码错误';
+            case errcode::ErrWxNotExist:
+                return '该微信账号还没有注册';
+            case errcode::ErrLoginType:
+                return '登陆类型错误';
+            case errcode::ErrOrderCanNotCancel:
+                return '订单已支付或已发送,不能取消';
+            case errcode::ErrOrderNotExist:
+                return '订单不存在';
+            case errcode::ErrExpress:
+                return '查询快递出错';
+            case errcode::ErrGoodsOff:
+                return '商品下架';
+            case errcode::ErrCanNotBuyOwn:
+                return '不能购买自己商品';
+            case errcode::ErrStorageShort:
+                return '商品库存不足';
+            case errcode::ErrAddCart:
+                return '添加购物车失败';
+            case errcode::ErrGoodsOutofStock :
+                return '商品缺货.';
+            case errcode::ErrGoodsSpecial :
+                return '该商品不允许加入购物车,请直接购买';
+            case errcode::ErrCartDelError :
+                return '购物车删除失败.';
+            case errcode::ErrGetConfig:
+                return '获取配置文件出错';
+
+            case errcode::ErrBLUnExist:
+                return '该优惠套装已不存在,建议您单独购买';
+
+            case errcode::ErrDB :
+                return '系统错误';
+            case errcode::ErrSms :
+                return '验证码发送错误';
+            case errcode::ErrSmsLessRepeateMinTime:
+                return '一分钟内只能发送一次验证码,请稍后再试.';
+            case errcode::ErrRoom:
+                return '房间出错';
+            case errcode::ErrRoomCreate:
+                    return '房间创建出错.';
+            case errcode::ErrRoomInvite:
+                return '房间邀请出错.';
+            case errcode::ErrRoomLeave:
+                return '退出房间出错.';
+            case errcode::ErrRoomBuild:
+                return '房间重建出错.';
+            case errcode::ErrRoomParam:
+                return '房间重建参数出错,不存在此房间号.';
+            case errcode::ErrRoomFactoryOp:
+                return '房间不支持此操作.';
+            case errcode::ErrRoomAccessOp:
+                return '房间服务器不支持此access操作.';
+            case errcode::ErrSignParamter:
+                return '请求参数需要做签名.';
+            case errcode::ErrSafeIp:
+                return '无权限的IP.';
+            case errcode::ErrOperation:
+                return '操作失败.';
+            default :
+                return '系统错误.';
+        }
+    }
+}