Example #1
0
 /**
  * 订单完成\归档.
  *
  * @param $sdf array 订单ID\操作者ID\操作者名称
  *
  * @return bool - 成功与否
  */
 public function generate($sdf, &$msg = '')
 {
     $mdl_order = app::get('b2c')->model('orders');
     $order_sdf = $mdl_order->dump($sdf['order_id']);
     //订单作废前验证
     foreach (vmc::servicelist('b2c.order.end.finish') as $service) {
         if (!$service->exec($order_sdf, $msg)) {
             return false;
         }
     }
     $order_sdf['status'] = 'finish';
     // 更新退款日志结果
     if ($mdl_order->save($order_sdf)) {
         //订单日志记录
         vmc::singleton('b2c_order_log')->set_operator(array('ident' => $sdf['op_id'] ? $sdf['op_id'] : $order_sdf['member_id'], 'model' => $sdf['op_id'] ? 'shopadmin' : 'members', 'name' => $sdf['op_name'] ? $sdf['op_name'] : '会员'))->set_order_id($order_sdf['order_id'])->success('finish', '订单已完成归档!', $order_sdf);
     } else {
         $msg = '完成\\归档失败!';
         return false;
     }
     //订单作废时同步扩展服务
     foreach (vmc::servicelist('b2c.order.end.finish') as $service) {
         if (!$service->exec($order_sdf, $msg)) {
             //记录日志,不中断
             logger::error($sdf['order_id'] . '完成归档时出错!' . $msg);
         }
     }
     return true;
 }
Example #2
0
 public function dologin()
 {
     $enc_str = $_GET['enc_str'];
     $enc_str = app::get('mobile')->router()->decode_args($enc_str);
     $member_id = $_GET['mid'];
     $decode_enc = utils::decrypt($enc_str);
     $session_id = $decode_enc['session_id'];
     if ($session_id) {
         $session_arr = explode('|', $session_id);
         $session_id = $session_arr[0];
         $time = $session_arr[1];
         if (time() - (int) $time > 3600) {
             //超时
             logger::error('微信登录失败!超时.' . var_export($_GET, 1) . var_export($decode_enc, 1));
             $this->display('mobile/wxloginerror.html');
             exit;
         }
         vmc::singleton('base_session')->set_sess_id($session_id);
         vmc::singleton('base_session')->start();
         vmc::singleton('b2c_user_object')->set_member_session($member_id);
         $member_id = vmc::singleton('b2c_user_object')->get_member_session();
         $member = app::get('b2c')->model('members')->dump($member_id);
         if ($member) {
             $this->pagedata['member'] = $member;
             $this->display('mobile/wxloginsuccess.html');
         } else {
             logger::error('微信登录失败!未知会员数据.' . var_export($_GET, 1) . var_export($decode_enc['session_id'], 1));
             $this->display('mobile/wxloginerror.html');
         }
     } else {
         logger::error('微信登录失败!未知SESSION_ID.' . var_export($_GET, 1) . var_export($decode_enc['session_id'], 1));
         $this->display('mobile/wxloginerror.html');
     }
 }
Example #3
0
 public function is_return_vaild($form, $key, $secu_id)
 {
     $_key = $key;
     $sign_type = $secu_id;
     $get = $this->para_filter($form);
     //对所有GET反馈回来的数据去空
     $sort_get = $this->arg_sort($get);
     //对所有GET反馈回来的数据排序
     $mysign = $this->build_mysign($sort_get, $_key, $sign_type);
     //生成签名结果
     $mysign = strtoupper($mysign);
     if ($mysign == $form['sign']) {
         return true;
     }
     #记录返回失败的情况
     logger::error(app::get('ectools')->_('支付单号:') . $form['out_trade_no'] . app::get('ectools')->_('签名验证不通过,请确认!') . "\n");
     logger::error(app::get('ectools')->_('本地产生的加密串:') . $mysign);
     logger::error(app::get('ectools')->_('手机财付通传递打过来的签名串:') . $form['sign']);
     $str_xml .= "<tenpayform>";
     foreach ($form as $key => $value) {
         $str_xml .= "<{$key}>" . $value . "</{$key}>";
     }
     $str_xml .= "</tenpayform>";
     return false;
 }
Example #4
0
 public function send($target, $title, $content, $config)
 {
     $tmpl_data = $config['tmpl_data'];
     $action_name = $config['action_name'];
     $action_name_alias = $config['action_name_alias'];
     $new_msg = array('member_id' => $target['member_id'], 'target' => $target['mobile'], 'subject' => $title, 'content' => $content . $this->platform_config['sms_sign'], 'createtime' => time(), 'msg_type' => 'sms', 'status' => 'sent');
     app::get('b2c')->model('member_msg')->save($new_msg);
     if (!$target['mobile']) {
         return false;
     }
     if (empty($this->platform_config['url']) || empty($this->platform_config['params_tmpl'])) {
         return false;
     }
     $args = array('target' => $target['mobile'], 'content' => $content . $this->platform_config['sms_sign'], 'tmpl_data' => json_encode($tmpl_data), 'time' => date('Y-m-d H:i:s'), 'action' => $action_name, 'action_alias' => $action_name_alias);
     //需要获得access_token
     if (!empty($this->platform_config['access_token_action'])) {
         if (!($args['access_token'] = $this->get_access_token($this->platform_config['access_token_action']))) {
             logger::error($this->platform_config['name'] . 'access_token获得失败,无法调用短信发送API');
             return false;
         }
     }
     $params = $this->gen_params($this->platform_config['params_tmpl'], $args);
     $result = $this->net->post($this->platform_config['url'], $params);
     logger::debug(__CLASS__ . $this->platform_config['url']);
     logger::debug(var_export($params, 1));
     logger::debug(var_export($result, 1));
     return true;
 }
Example #5
0
 public function __call($method, $params)
 {
     //api 版本历史
     $apiv_history = array('2.0', '1.0');
     $api_info = base_rpc_service::$api_info;
     $api_obj = NULL;
     $flag = false;
     foreach ($apiv_history as $v) {
         if ($this->apiv == $v) {
             $flag = true;
         }
         if ($flag) {
             $service = 'apiv_' . $v . '_' . $api_info['api_name'];
             $api_obj = kernel::service($service);
             if (method_exists($api_obj, $method)) {
                 break;
             } else {
                 logger::error('apiv service:' . $service . ', method:' . $method . '  not found!');
             }
         }
     }
     if (!$api_obj || !method_exists($api_obj, $method)) {
         trigger_error('server reject!', E_USER_ERROR);
     }
     //return call_user_func_array(array( &$api_obj, $method ), $params);
     return $api_obj->{$method}($params[0], $params[1]);
 }
Example #6
0
 public function call($method, $params, $appId)
 {
     $prismHost = config::get('prism.prismHostUrl');
     $prismSocketFile = config::get('prism.prismSocketFile');
     //获取应用对应的key和secret
     $keySecret = apiUtil::getPrismKey($appId);
     $key = $keySecret['key'];
     $secret = $keySecret['secret'];
     //获取path
     $path = apiUtil::genApiPath($method);
     //params加入系统数据
     $systemParams = $this->__genSystemParams($method);
     $params = array_merge($params, $systemParams);
     $params['method'] = $method;
     //实例化请求工具
     $client = new base_prism_client($prismHost, $key, $secret, $prismSocketFile);
     //$path = "/api/bbc?method=bbc.test";
     $result = $client->post($path, $params);
     //日志记录
     //之前request和response分开记录的,发现不容易找,只好放一起了
     logger::info('call API : ' . $method . "\n" . 'wiht host : ' . $prismHost . "\n" . 'wiht key : ' . $key . "\n" . 'wiht secret : ' . $secret . "\n" . 'with params :' . var_export($params, 1) . "\n" . 'api result : ' . $result . "\n");
     //这里是返回数据
     $result = json_decode($result, 1);
     if ($result['error'] == null) {
         return $result['result'];
     } else {
         //根据返回的数据是否错误,如果有错误,尽量以原有异常抛出
         $exception = $result['error']['exception'] ? $result['error']['exception'] : 'Exception';
         logger::error(var_export($result, 1));
         $e = new $exception($result['error']['message']);
         throw $e;
     }
 }
Example #7
0
 /**
  * 订单创建完成时
  * @params array - 订单完整数据,含ITEMS
  * @return boolean - 执行成功与否
  */
 public function exec($sdf, &$msg = '')
 {
     logger::debug($sdf['order_id'] . 'createfinish exec');
     if ($sdf['is_cod'] == 'Y') {
         $freeze_data = array();
         foreach ($sdf['items'] as $key => $item) {
             //购买数量计数
             vmc::singleton('b2c_openapi_goods', false)->counter(array('goods_id' => $item['goods_id'], 'buy_count' => $item['nums'], 'buy_count_sign' => md5($item['goods_id'] . 'buy_count' . $item['nums'] * 1024)));
             //组织库存冻结数据
             $freeze_data[] = array('sku' => $item['bn'], 'quantity' => $item['nums']);
         }
         //库存冻结
         if (!vmc::singleton('b2c_goods_stock')->freeze($freeze_data, $msg)) {
             logger::error('库存冻结异常!ORDER_ID:' . $sdf['order_id'] . ',' . $msg);
         }
     }
     /* 订单金额为0 **/
     $order_sdf = $sdf;
     if ($order_sdf['order_total'] == '0') {
         // 生成支付账单
         $obj_bill = vmc::singleton('ectools_bill');
         $bill_sdf = array('bill_type' => 'payment', 'pay_object' => 'order', 'pay_mode' => in_array($order_sdf['pay_app'], array('-1', 'cod', 'offline')) ? 'offline' : 'online', 'order_id' => $order_sdf['order_id'], 'pay_app_id' => $order_sdf['pay_app'], 'pay_fee' => $order_sdf['cost_payment'], 'member_id' => $order_sdf['member_id'], 'status' => 'succ', 'money' => $order_sdf['order_total'], 'memo' => '订单0元时自动生成');
         if (!$obj_bill->generate($bill_sdf, $msg)) {
             //TODO 自动支付失败,
             logger::error('订单0元时自动支付失败!' . $msg);
             return;
         }
     }
     return true;
 }
Example #8
0
 function __construct($app)
 {
     $this->app = $app;
     $this->sitemap = app::get('wap')->getConf('sitemaps');
     // print_r($this->sitemap);exit;
     if (!is_array($this->sitemap)) {
         $sitemap_config = kernel::single('wap_module_base')->assemble_config();
         if (is_array($sitemap_config)) {
             $this->sitemap = $sitemap_config;
             //todo:兼容kvstroe出错的情况下
             if (!kernel::single('wap_module_base')->write_config($sitemap_config)) {
                 logger::error('Error: sitemap can\'t save to kvstore');
                 //todo:如果写入失败,记录于系统日志中,前台不报错,保证网站运行正常
             }
         } else {
             //if false
             trigger_error('sitemap is lost!', E_USER_ERROR);
             //todo:无sitemap时报错
         }
     }
     foreach ($this->sitemap as $part => $controller) {
         $urlmap[$controller[0] . ':' . $controller[1]] = $part;
         if ($controller[3]) {
             $extmap[$part] = '.' . $controller[3];
         }
     }
     $this->urlmap = $urlmap;
     $this->extmap = $extmap;
     $this->_request = kernel::single('base_component_request');
     $this->_response = kernel::single('base_component_response');
 }
Example #9
0
 /**
  * Check the given plain value against a hash.
  *
  * @param  string  $value
  * @param  string  $hashedValue
  * @param  array   $options
  * @return bool
  */
 public static function check($value, $hashedValue, base_hashing_hasher_interface $hasher = null)
 {
     if (!$hasher) {
         $hasher = kernel::single('base_hashing_hasher_bcrypt');
     }
     logger::error(var_export(array($value, $hashedValue), 1));
     return $hasher->check($value, $hashedValue);
 }
Example #10
0
 /**
  * 订单发货操作完成时.
  *
  * @delivery_sdf array - 发货单据SDF
  * @msg  异常消息
  *
  * @return bool - 执行成功与否
  */
 public function exec($delivery_sdf, &$msg = '')
 {
     $order_id = $delivery_sdf['order_id'];
     if (!$order_id) {
         $msg = '未知订单id';
         return false;
     }
     $all_send = true;
     $order_items = app::get('b2c')->model('order_items')->getList('*', array('order_id' => $order_id));
     $order_items = utils::array_change_key($order_items, 'item_id');
     foreach ($delivery_sdf['delivery_items'] as $item) {
         $order_items[$item['order_item_id']]['sendnum'] += $item['sendnum'];
         if ($order_items[$item['order_item_id']]['sendnum'] > $order_items[$item['order_item_id']]['nums']) {
             $msg = '发货异常,超出应发数量';
             return false;
         }
         if ($order_items[$item['order_item_id']]['sendnum'] < $order_items[$item['order_item_id']]['nums']) {
             $all_send = false;
             //部分发货
         }
     }
     $order_sdf = array('order_id' => $order_id, 'items' => $order_items, 'ship_status' => $all_send ? '1' : '2');
     if (!app::get('b2c')->model('orders')->save($order_sdf)) {
         $msg = '订单状态修改失败!';
         return false;
     }
     //库存冻结释放,真实扣除库存
     $stock_data = array();
     foreach ($delivery_sdf['delivery_items'] as $key => $value) {
         $stock_data[] = array('sku' => $value['bn'], 'quantity' => $value['sendnum']);
     }
     if (!vmc::singleton('b2c_goods_stock')->unfreeze($stock_data, $msg)) {
         logger::error('库存冻结释放异常!ORDER_ID:' . $order_sdf['order_id'] . ',' . $msg);
     }
     if (!vmc::singleton('b2c_goods_stock')->delivery($stock_data, $msg)) {
         logger::error('库存扣减异常!ORDER_ID:' . $order_sdf['order_id'] . ',' . $msg);
     }
     //订单日志记录
     vmc::singleton('b2c_order_log')->set_operator(array('ident' => $delivery_sdf['op_id'], 'model' => 'shopadmin', 'name' => '操作员'))->set_order_id($order_sdf['order_id'])->success('shipment', '订单' . (!$all_send ? '部分' : '') . '发货成功!', $delivery_sdf);
     /*
      * 消息通知
      * @args1 事件名称
      * @args2 消息模板数据填充
      * @args3 消息目标
      */
     $pam_data = vmc::singleton('b2c_user_object')->get_pam_data('*', $delivery_sdf['member_id']);
     logger::debug('pam_data' . var_export($pam_data, 1));
     $dlycorp = app::get('b2c')->model('dlycorp')->dump($delivery_sdf['dlycorp_id']);
     $consignee_area = $delivery_sdf['consignee']['area'];
     $consignee_area = explode(':', $consignee_area);
     $consignee_area = $consignee_area[1];
     //消息模板参数
     $env_list = array('order_id' => $delivery_sdf['order_id'], 'consignee_name' => $delivery_sdf['consignee']['name'], 'consignee_area' => $consignee_area, 'consignee_addr' => $delivery_sdf['consignee']['addr'], 'consignee_tel' => $delivery_sdf['consignee']['tel'], 'consignee_mobile' => $delivery_sdf['consignee']['mobile'], 'dlycorp_name' => $dlycorp['name'], 'dlycorp_code' => $dlycorp['corp_code'], 'dlycorp_website' => $dlycorp['website'], 'logistics_no' => $delivery_sdf['logistics_no'], 'timestr' => date('Y-m-d H:i:s', $delivery_sdf['last_modify']));
     vmc::singleton('b2c_messenger_stage')->trigger('orders-shipping', $env_list, array('mobile' => $pam_data['mobile'] ? $pam_data['mobile']['login_account'] : $order_sdf['consignee']['mobile'], 'email' => $pam_data['email'] ? $pam_data['email']['login_account'] : $order_sdf['consignee']['email'], 'member_id' => $delivery_sdf['member_id']));
     return true;
 }
Example #11
0
function error_handler($code, $msg, $file, $line)
{
    if ($code == ($code & (E_ERROR ^ E_USER_ERROR ^ E_USER_WARNING))) {
        logger::error(sprintf('ERROR:%d @ %s @ file:%s @ line:%d', $code, $msg, $file, $line));
        if ($code == ($code & (E_ERROR ^ E_USER_ERROR))) {
            exit;
        }
    }
    return true;
}
Example #12
0
 public function loadModule($moduleName)
 {
     $moduleName .= "Action";
     $class_file = $this->getLocation($moduleName);
     try {
         require_once $class_file;
     } catch (Exception $ex) {
         logger::error("can not load module" . $class_file, $ex, "ModuleLoader");
     }
     $mod_obj = new $moduleName();
     return $mod_obj;
 }
Example #13
0
 public function call($conn, $path, $params, $method_type = 'get')
 {
     $caller = new PrismClient($conn['host'], $conn['key'], $conn['secret']);
     if (in_array($method_type, array('get', 'post', 'delete', 'put'))) {
         $result = call_user_func_array(array($caller, $method_type), array($path, $params));
     }
     $result = json_decode($result, true);
     if ($result['error'] != null) {
         logger::error(var_export(['conn' => $conn, 'path' => $path, 'params' => $params, 'method' => $method_type, 'result' => $result], 1));
         throw new RuntimeException($result['error']['code'] . ':' . $result['error']['message'], $result['error']['code']);
     }
     return $result['result'];
 }
Example #14
0
 static function register($data = null)
 {
     $sys_params = base_setup_config::deploy_info();
     $code = md5(microtime());
     base_kvstore::instance('ecos')->store('net.handshake', $code);
     $app_exclusion = app::get('base')->getConf('system.main_app');
     /** 得到框架的总版本号 **/
     $obj_apps = app::get('base')->model('apps');
     $tmp = $obj_apps->getList('*', array('app_id' => 'base'));
     $app_xml = $tmp[0];
     $app_xml['version'] = $app_xml['local_ver'];
     if (defined('CERTIFICATE_SAS') && constant('CERTIFICATE_SAS')) {
         $data = array('certi_app' => 'open.reg', 'app_id' => 'ecos.' . $app_exclusion['app_id'], 'url' => $data ? $data : kernel::base_url(1), 'result' => $code, 'version' => $app_xml['version']);
     } else {
         $conf = base_setup_config::deploy_info();
         $data = array('certi_app' => 'open.reg', 'identifier' => base_enterprise::ent_id(), 'password' => base_enterprise::ent_ac(), 'product_key' => $conf['product_key'], 'url' => $data ? $data : kernel::base_url(1), 'result' => $code, 'version' => $app_xml['version'], 'api_ver' => '1.3');
     }
     $http = kernel::single('base_httpclient');
     $http->set_timeout(6);
     $result = $http->post(LICENSE_CENTER, $data);
     //todo: 声称获取一个唯一iD,发给飞飞
     $result = json_decode($result, 1);
     if ($result['res'] == 'succ') {
         if ($result['info']) {
             /*
                             if ($result['info']['node_id'])
                             {
                                 $arr_shop_node_id = array(
                                     'node_id' => $result['info']['node_id'],
                                 );
                                 base_shopnode::set_node_id($arr_shop_node_id,$app_exclusion['app_id']);
                                 unset($result['info']['node_id']);
                             }
             */
             //1.3接口不再返回node_id信息
             base_shopnode::register($app_exclusion['app_id']);
             $certificate = $result['info'];
             $flag = self::set_certificate($certificate);
             if ($flag) {
                 app::get('base')->setConf('certificate_code_url', $data['url']);
                 return true;
             } else {
                 return false;
             }
         }
     } else {
         //throw new Exception(LICENSE_CENTER." return ".$result['res']."error is-- ".$result['code'].",".$result['msg']);
         logger::error('create certificate_id faile, reason:' . LICENSE_CENTER . " return " . $result['res'] . "error is " . $result['code'] . "," . $result['msg'], false, LOG_ERR);
         return false;
     }
 }
Example #15
0
 function command_create($project_name)
 {
     $options = $this->get_options();
     $options['template'] = $options['template'] ? $options['template'] : 'dev_app';
     list($template, $template_args) = explode(':', $options['template']);
     $project_prototype = kernel::single($template);
     $project_path = $project_prototype->init($project_name, $template_args);
     if ($project_path) {
         $project = array('name' => $project_name, 'path' => $project_path, 'createtime' => time(), 'type' => $options['template']);
         dev_project::save($project);
         logger::info('Write project info... ok.');
     } else {
         logger::error('error.');
     }
 }
Example #16
0
File: chdb.php Project: noikiy/snk
 public function create($data)
 {
     foreach ((array) $data as $k => $v) {
         $data[$k] = serialize($v);
     }
     chdb_create($this->_get_pathname(), $data);
     $this->_controller = new chdb($this->_get_pathname());
     if (is_file($this->_get_prev_pathname()) && $this->_get_prev_pathname() != $this->_get_pathname()) {
         try {
             unlink($this->_get_prev_pathname());
         } catch (Exception $e) {
             logger::error($e->getMessage());
         }
     }
     return true;
 }
Example #17
0
 public function exec(&$order_sdf, &$msg = '')
 {
     $order_items = app::get('b2c')->model('order_items')->getList('bn,nums', array('order_id' => $order_sdf['order_id']));
     //库存释放
     $unfreeze_data = array();
     foreach ($order_items as $key => $value) {
         $freeze_data[] = array('sku' => $value['bn'], 'quantity' => $value['nums']);
     }
     if (!vmc::singleton('b2c_goods_stock')->unfreeze($freeze_data, $msg)) {
         logger::error('库存冻结释放异常!ORDER_ID:' . $order_sdf['order_id'] . ',' . $msg);
     }
     //消息
     $pam_data = vmc::singleton('b2c_user_object')->get_pam_data('*', $order_sdf['member_id']);
     $env_list = array('order_id' => $order_sdf['order_id'], 'timestr' => date('Y-m-d H:i:s', $order_sdf['last_modify']));
     vmc::singleton('b2c_messenger_stage')->trigger('orders-cancel', $env_list, array('email' => $pam_data['email'] ? $pam_data['email']['login_account'] : $order_sdf['consignee']['email'], 'mobile' => $pam_data['mobile'] ? $pam_data['mobile']['login_account'] : $order_sdf['consignee']['mobile'], 'member_id' => $order_sdf['member_id']));
     return true;
 }
Example #18
0
 public function save(&$delivery_sdf, &$msg = '')
 {
     if (!$this->mdl_delivery->save($delivery_sdf)) {
         $msg = '单据保存失败';
         return false;
     } else {
         //时同步扩展服务
         foreach (vmc::servicelist('b2c.order.delivery.' . $delivery_sdf['delivery_type'] . '.finish') as $service) {
             if (!$service->exec($delivery_sdf, $msg)) {
                 logger::error($delivery_sdf['delivery_id'] . $delivery_sdf['delivery_type'] . '单据保存出错!' . $msg);
                 return false;
                 //直接中断
             }
         }
     }
     return true;
 }
Example #19
0
 public function exec($sql, $skipModifiedMark = false, $db_lnk = null)
 {
     if ($this->prefix != 'sdb_') {
         //$sql = preg_replace('/([`\s\(,])(sdb_)([a-z\_]+)([`\s\.]{0,1})/is',"\${1}".$this->prefix."\\3\\4",$sql);
         $sql = preg_replace_callback('/([`\\s\\(,])(sdb_)([0-9a-z\\_]+)([`\\s\\.]{0,1})/is', array($this, 'fix_dbprefix'), $sql);
         //todo: 兼容有特殊符号的表名前缀
     }
     if (!$skipModifiedMark && cachemgr::enable() && preg_match('/(?:(delete\\s+from)|(insert\\s+into)|(update))\\s+([]0-9a-z_:"`.@[-]*)/is', $sql, $match)) {
         $table = strtoupper(trim(str_replace('`', '', str_replace('"', '', str_replace("'", '', $match[4])))));
         $now = time();
         $pos = strpos($table, strtoupper($this->prefix));
         if ($pos === 0) {
             $table = substr($table, strlen($this->prefix));
         }
         //todo: 真实表名
         $this->exec('UPDATE sdb_base_cache_expires SET expire = "' . $now . '" WHERE type = "DB" AND name = "' . $table . '"', true);
         if ($this->affect_row()) {
             cachemgr::set_modified('DB', $table, $now);
         }
     }
     if (!is_resource($db_lnk)) {
         if ($this->_rw_lnk) {
             $db_lnk = $this->_rw_lnk;
         } else {
             $db_lnk = $this->_rw_conn();
         }
     }
     if (defined("STRESS_TESTING")) {
         b2c_forStressTest::$sqlAmount++;
         b2c_forStressTest::slowSqlStart();
     }
     if ($rs = mysql_query($sql, $db_lnk)) {
         if (defined("STRESS_TESTING")) {
             b2c_forStressTest::slowSqlEnd($sql);
         }
         self::$mysql_query_executions++;
         logger::debug('sql:' . self::$mysql_query_executions . '.' . $sql);
         $db_result = array('rs' => $rs, 'sql' => $sql);
         return $db_result;
     } else {
         logger::error($sql . ':' . mysql_error($db_lnk));
         trigger_error($sql . ':' . mysql_error($db_lnk), E_USER_WARNING);
         return false;
     }
 }
Example #20
0
 /**
  * 订单创建完成时
  * @params array - 订单完整数据,含ITEMS
  * @return boolean - 执行成功与否
  */
 public function exec($sdf, &$msg = '')
 {
     logger::debug($sdf['order_id'] . 'createfinish exec');
     if ($sdf['is_cod'] == 'Y') {
         $freeze_data = array();
         foreach ($sdf['items'] as $key => $item) {
             //购买数量计数
             vmc::singleton('b2c_openapi_goods', false)->counter(array('goods_id' => $item['goods_id'], 'buy_count' => $item['nums'], 'buy_count_sign' => md5($item['goods_id'] . 'buy_count' . $item['nums'] * 1024)));
             //组织库存冻结数据
             $freeze_data[] = array('sku' => $item['bn'], 'quantity' => $item['nums']);
         }
         //库存冻结
         if (!vmc::singleton('b2c_goods_stock')->freeze($freeze_data, $msg)) {
             logger::error('库存冻结异常!ORDER_ID:' . $order_sdf['order_id'] . ',' . $msg);
         }
     }
     return true;
 }
Example #21
0
File: api.php Project: noikiy/snk
 public function dopost($post_xml)
 {
     $post_arr = vmc::singleton('mobile_utility_xml')->xml2array($post_xml);
     $post_data = $post_arr['xml'];
     //公众账号ID获取
     $wechat_id = $post_data['ToUserName'];
     $bind = app::get('wechat')->model('bind')->getRow('*', array('wechat_id' => $wechat_id, 'status' => 'active'));
     //需要解密消息
     if ($_GET['encrypt_type'] == 'aes') {
         $obj_crypt = new wechat_crypt($bind['token'], $bind['aeskey'], $bind['appid']);
         if ($obj_crypt->decryptMsg($_GET['msg_signature'], $_GET["timestamp"], $_GET["nonce"], $post_xml, $decode_post_xml) === 0) {
             $post_arr = vmc::singleton('mobile_utility_xml')->xml2array($decode_post_xml);
             $post_data = $post_arr['xml'];
         } else {
             logger::error('微信消息解密失败!' . $post_xml . var_export($_GET, 1) . var_export($bind, 1));
             return;
         }
     }
     if (!empty($bind)) {
         $post_data['bind_id'] = $bind['id'];
         $post_data['eid'] = $bind['eid'];
     } else {
         return;
     }
     //logger::alert(var_export($post_data,1));
     switch ($post_data['MsgType']) {
         case 'event':
             /**
              * subscribe(订阅)、unsubscribe(取消订阅)
              * scan 带参数二维码事件
              * location 上报地理位置事件
              * click 自定义菜单事件
              * view  点击菜单跳转链接时的事件推送
              *
              */
             $this->stage->event_reply($post_data);
             break;
         default:
             $this->stage->normal_reply($post_data);
     }
 }
Example #22
0
function eqphp_autoload($class)
{
    if (isset($_SERVER['REQUEST_URI'])) {
        $root = current(explode('/', trim($_SERVER['REQUEST_URI'], '/')));
    }
    //optimize: $config save memcache or redis
    $group = config('group.list');
    $path = isset($root) && is_array($group) && in_array($root, $group) ? $root . '/' : '';
    $module = array('a' => $path . 'action', 'm' => $path . 'model', 'p' => $path . 'plugin', 's' => 'server');
    $prefix = substr($class, 0, strpos($class, '_'));
    $dir_name = in_array($prefix, array('a', 'm', 's', 'p')) ? $module[$prefix] : 'class';
    $execute_file = $dir_name . '/' . $class . '.php';
    if (strtolower($class) === 'smarty') {
        $execute_file = 'data/smarty/Smarty.class.php';
    }
    if (file_exists($execute_file)) {
        return include PATH_ROOT . $execute_file;
    }
    //通用加载
    if (config('state.common_load') && in_array($prefix, array('a', 'm'), true)) {
        $common_option = array('a' => 'action/', 'm' => 'model/');
        $execute_file = PATH_ROOT . $common_option[$prefix] . $class . '.php';
        if (file_exists($execute_file)) {
            return include $execute_file;
        }
    }
    //贪婪加载
    if (config('state.greedy_load')) {
        $execute_file = file::search(PATH_ROOT . $dir_name, $class, $file_list, true);
        if ($execute_file) {
            return include $execute_file;
        }
    }
    if ($prefix === 'a') {
        logger::notice('class [' . $class . '] not found');
        http::send(404);
    }
    if (strpos(strtolower($execute_file), 'smarty_internal_') === false) {
        logger::error('class [' . $class . '] not found');
    }
}
Example #23
0
 public function exec($params = null)
 {
     $order_sdf = $params;
     $mdl_orders = app::get('b2c')->model('orders');
     $order_num = $mdl_orders->count(array('member_id' => $order_sdf['member_id']));
     $mdl_members = app::get('b2c')->model('members');
     //更新会员订单数
     $mdl_members->update(array('order_num' => $order_num), array('member_id' => $order_sdf['member_id']));
     /* 订单金额为0 **/
     if ($order_sdf['order_total'] == '0') {
         // 生成支付账单
         $obj_bill = vmc::singleton('ectools_bill');
         $sdf = array('bill_type' => 'payment', 'pay_object' => 'order', 'pay_mode' => in_array($order_sdf['pay_app'], array('-1', 'cod', 'offline')) ? 'offline' : 'online', 'order_id' => $order_sdf['order_id'], 'pay_app_id' => $order_sdf['pay_app'], 'pay_fee' => $order_sdf['cost_payment'], 'member_id' => $order_sdf['member_id'], 'status' => 'succ', 'money' => $order_sdf['order_total'], 'memo' => '订单0元时自动生成');
         if (!$obj_bill->generate($sdf, $msg)) {
             //TODO 自动支付失败,
             logger::error('订单0元时自动支付失败!' . $msg);
             return;
         }
     }
     return true;
 }
Example #24
0
 public function getway_callback($pay)
 {
     $mdl_bills = $this->app->model('bills');
     $obj_bill = vmc::singleton('ectools_bill');
     $params = vmc::singleton('base_component_request')->get_params(true);
     $pay_app_class = key($pay);
     if (!stripos($pay_app_class, '_')) {
         //兼容处理
         $pay_app_class = 'ectools_payment_applications_' . $pay_app_class;
     }
     $pay_app_method = current($pay);
     $pay_app_instance = new $pay_app_class();
     if ($pay_app_class == 'wechat_payment_applications_wxpay') {
         /**
          * 微信支付特殊处理
          */
         $params['_http_raw_post_data_'] = $GLOBALS["HTTP_RAW_POST_DATA"];
     }
     $pay_result = $pay_app_instance->{$pay_app_method}($params);
     logger::debug('支付网关回调params:' . var_export($params, 1) . "\n" . $pay_app_class . "\n" . $pay_app_method . "\n" . var_export($pay_result, 1));
     if (!$pay_result || empty($pay_result['status'])) {
         $pay_result['status'] = 'error';
     }
     if ($pay_result['bill_id'] && ($bill = $mdl_bills->dump($pay_result['bill_id']))) {
         $pay_result = array_merge($bill, $pay_result);
         //update bill
         if (!$obj_bill->generate($pay_result, $msg)) {
             logger::error('支付网关回调后,更新或保存支付单据失败!' . $msg . '.bill_export:' . var_export($pay_result, 1));
         }
     }
     // Redirect page.
     if ($pay_app_method != 'notify' && $pay_result['return_url']) {
         //for ecmobilecenter
         if (preg_match('/^http([^:]*):\\/\\//', $pay_result['return_url'])) {
             header('Location: ' . $pay_result['return_url']);
         } else {
             header('Location: ' . strtolower(vmc::request()->get_schema() . '://' . vmc::request()->get_host()) . $pay_result['return_url']);
         }
     }
 }
Example #25
0
 public function process($request, $response)
 {
     if ($request == null) {
         $request = new base_prism_request();
     }
     if ($response == null) {
         $response = new base_prism_response();
     }
     $params = $request->getParams();
     //过滤systemParams,并返回api的配置
     //对systemParams进行判断,没有进行剥离,在下面的__unsetSystemParams方法中剥离的。
     $api = $this->__getApiInfo($params, $response);
     //实例化api class
     $handler = $api['uses'];
     list($class_name, $action_name) = explode('@', $handler);
     $class = new $class_name();
     $oauth = $request->getOauth();
     $appInfo = $request->getAppInfo();
     //这里做个日志点
     //这个日志点埋在系统参数处理之后,剥离系统参数之前
     //理由是系统参数验证正确后,该请求来自prism,当被外界请求会被拦截下来
     logger::info('request_id : ' . $request->getRequestID() . "\n" . 'request_ip : ' . $request->getCallerIP() . "\n" . 'request_app_info : ' . var_export($appInfo, true) . "\n" . 'request_oauth_info : ' . var_export($oauth, true) . "\n" . 'request_params : ' . var_export($params, true));
     //从params里面剥离systemParams
     $format = $params['format'];
     $this->__unsetSystemParams($params);
     //验证方法和参数
     try {
         $params = $this->checkParams($class, $action_name, $params);
         $result = call_user_func([$class, $action_name], $params, $oauth, $appInfo);
         //这里记录返回的日志,原本想放在response里面,考虑了一下那里不好获取request_id,就放这里了
         logger::info('request_id : ' . $request->getRequestID() . "\n" . 'reponse_info : ' . var_export($result, true));
         return $response->send($result, $format);
     } catch (Exception $e) {
         $exceptionClass = get_class($e);
         $errorMessage = $e->getMessage();
         logger::error('request_id : ' . $request->getRequestID() . "\n" . 'message : ' . $e->getMessage() . "\n" . 'string : ' . $e->__toString());
         return $response->sendError($method . ".runtimeException", $errorMessage, $format, $exceptionClass);
     }
 }
Example #26
0
 /**
  * 订单退货操作完成时
  * @params array - 退货单据数据SDF
  * @return boolean - 执行成功与否
  */
 public function exec($delivery_sdf, &$msg = '')
 {
     $order_id = $delivery_sdf['order_id'];
     if (!$order_id) {
         $msg = '未知订单id';
         return false;
     }
     $all_send = true;
     $order_items = app::get('b2c')->model('order_items')->getList('*', array('order_id' => $order_id));
     $order_items = utils::array_change_key($order_items, 'item_id');
     foreach ($delivery_sdf['delivery_items'] as $item) {
         $order_items[$item['order_item_id']]['sendnum'] -= $item['sendnum'];
         if ($order_items[$item['order_item_id']]['sendnum'] < 0) {
             $msg = '退货时,造成订单明细数据异常';
             return false;
         }
         if ($order_items[$item['order_item_id']]['sendnum'] != 0) {
             $all_send = false;
             //部分退货
         }
     }
     $order_sdf = array('order_id' => $order_id, 'items' => $order_items, 'ship_status' => $all_send ? '4' : '3');
     if (!app::get('b2c')->model('orders')->save($order_sdf)) {
         $msg = '订单状态修改失败!';
         return false;
     }
     //库存冻结释放,真实扣除库存
     $stock_data = array();
     foreach ($delivery_sdf['delivery_items'] as $key => $value) {
         $stock_data[] = array('sku' => $value['bn'], 'quantity' => $value['sendnum']);
     }
     if (!vmc::singleton('b2c_goods_stock')->returned($stock_data, $msg)) {
         logger::error('库存回滚异常!ORDER_ID:' . $order_sdf['order_id'] . ',' . $msg);
     }
     //订单日志记录
     vmc::singleton('b2c_order_log')->set_operator(array('ident' => $delivery_sdf['op_id'], 'model' => 'shopadmin', 'name' => '操作员'))->set_order_id($order_sdf['order_id'])->success('reship', '订单' . (!$all_send ? '部分' : '') . '退货成功!', $delivery_sdf);
     return true;
 }
Example #27
0
 public function command_kvrecovery($instance = null)
 {
     if (app::get('base')->status() == 'uninstalled') {
         logger::info('系统未安装!请先运行install');
         return;
     }
     base_kvstore::config_persistent(false);
     //临时禁用KV持久化 TODO 比较危险
     $testObj = base_kvstore::instance('test');
     if (get_class($testObj->get_controller()) === 'base_kvstore_mysql') {
         logger::info('The \'base_kvstore_mysql\' is default persistent, Not necessary recovery');
         exit;
     }
     logger::info('KVrecovery BEGIN...');
     $db = vmc::database();
     $count = $db->count('SELECT count(*) AS count FROM vmc_base_kvstore', true);
     if (empty($count)) {
         logger::info('No data recovery');
         exit;
     }
     $pagesize = 100;
     $page = ceil($count / 100);
     for ($i = 0; $i < $page; $i++) {
         $rows = $db->selectlimit('SELECT * FROM vmc_base_kvstore', $pagesize, $i * $pagesize);
         foreach ($rows as $row) {
             $arr_value = unserialize($row['value']);
             if (!$arr_value || !is_array($arr_value)) {
                 logger::error($row['prefix'] . '=>' . $row['key'] . ' ... KVrecovery ERROR');
             }
             $row['value'] = $arr_value;
             if (base_kvstore::instance($row['prefix'])->recovery($row)) {
                 logger::info($row['prefix'] . '=>' . $row['key'] . ' ... KVrecovery Success');
             } else {
                 logger::warning($row['prefix'] . '=>' . $row['key'] . ' ... KVrcovery Failure');
             }
         }
     }
     logger::info('KVrecovery END...');
 }
Example #28
0
 /**
  * 发送消息.
  */
 public function echo_msg($data, $bind)
 {
     $data['CreateTime'] = time();
     $post_xml = vmc::singleton('mobile_utility_xml')->array2xml($data, 'xml');
     $obj_crypt = new wechat_crypt($bind['token'], $bind['aeskey'], $bind['appid']);
     $flag = $obj_crypt->encryptMsg($post_xml, $data['CreateTime'], $this->randomkeys(5), $encode_post_xml);
     if ($flag === 0) {
         echo $encode_post_xml;
     } else {
         logger::error('回应消息时,加密失败!ERROR_CODE:' . $flag . $post_xml . var_export($data, 1) . var_export($bind, 1));
         return;
     }
 }
Example #29
0
 /**
  * 检验返回数据合法性
  * @param mixed $form 包含签名数据的数组
  * @param mixed $key 签名用到的私钥
  * @access private
  * @return boolean
  */
 public function is_return_vaild($form, $key)
 {
     ksort($form);
     foreach ($form as $k => $v) {
         if ($k != 'sign' && $k != 'sign_type') {
             $signstr .= "&{$k}={$v}";
         }
     }
     $signstr = ltrim($signstr, "&");
     $signstr = $signstr . $key;
     if ($form['sign'] == md5($signstr)) {
         return true;
     }
     #记录返回失败的情况
     logger::error(app::get('ectools')->_('支付单号:') . $form['out_trade_no'] . app::get('ectools')->_('签名验证不通过,请确认!') . "\n");
     logger::error(app::get('ectools')->_('本地产生的加密串:') . $signstr);
     logger::error(app::get('ectools')->_('支付宝传递打过来的签名串:') . $form['sign']);
     $str_xml .= "<alipayform>";
     foreach ($form as $key => $value) {
         $str_xml .= "<{$key}>" . $value . "</{$key}>";
     }
     $str_xml .= "</alipayform>";
     return false;
 }
Example #30
0
 function install()
 {
     $db = vmc::database();
     $sql = $this->get_sql();
     $real_table_name = $this->real_table_name();
     $db->exec('drop table if exists `' . $real_table_name . '`');
     $db->exec($sql);
     $log = 'Creating table ' . $real_table_name;
     if (intVal($db->errorCode()) > 0) {
         $error_info = $db->errorInfo();
         logger::info($err = $log . " fail \n" . 'ERROR_INFO:' . $error_info[2]);
         logger::error($err . "\n" . $db->last_query);
     } else {
         logger::info($log . " success");
     }
 }