/** * 订单完成\归档. * * @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; }
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'); } }
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; }
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; }
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]); }
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; } }
/** * 订单创建完成时 * @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; }
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'); }
/** * 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); }
/** * 订单发货操作完成时. * * @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; }
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; }
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; }
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']; }
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; } }
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.'); } }
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; }
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; }
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; }
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; } }
/** * 订单创建完成时 * @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; }
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); } }
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'); } }
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; }
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']); } } }
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); } }
/** * 订单退货操作完成时 * @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; }
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...'); }
/** * 发送消息. */ 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; } }
/** * 检验返回数据合法性 * @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; }
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"); } }