request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ WeChat ] [ OPEN ] [ Ticket ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $request = XML::parse($this->request->getInput()); $result = OpenPlatformService::instance()->initPlatformByAppId($request['AppId']); if($result->code != ErrorCodeConstants::SUCCESS){ $this->error($result->msg); } $openPlatform = OpenPlatformService::instance()->getOpenPlatform(); $openPlatform['cache'] = new RedisCache(Redis::instanceCache()); $server = $openPlatform->server; Log::info('[ WeChat ] [ OPEN ] [ Ticket ] Message: ' . json_encode(var_export($server->getMessage(), true), JSON_UNESCAPED_UNICODE)); // 处理授权成功事件 //callback中已处理 // $server->push(function ($message) { // }, Guard::EVENT_AUTHORIZED); // 处理授权更新事件 $server->push(function ($message) use ($openPlatform) { try { $appid = $message['AuthorizerAppid']; $platformAppid = $message['AppId']; $authCode = $message['AuthorizationCode']; $auth = $openPlatform->handleAuthorize($authCode); // 使用授权码换取接口调用凭据和授权信息 $mp = $openPlatform->getAuthorizer($appid); // 获取授权方的帐号基本信息 //检测权限 $this->checkWeChatAuth($mp); $data = [ 'refresh_token' => $auth['authorization_info']['authorizer_refresh_token'], 'json' => $mp, 'is_auth' => 1, ]; model('AdminConfig')->update($data, ['appid' => $appid]); //维护Ptoken信息 if ($adminConfig = model('AdminConfig')->getAdminInfoByAppId($appid)) { if ($platform = model('Platform')->where(['appid' => $platformAppid])->find()) { $map = ['admin_id' => $adminConfig['admin_id'], 'platform_id' => $platform['id']]; if (model('Ptoken')->where($map)->find()) { model('Ptoken')->where($map)->update(['refresh_token' => $auth['authorization_info']['authorizer_refresh_token'], 'updatetime' => time()]); } else { model('Ptoken')->insert(array_merge($map, ['refresh_token' => $auth['authorization_info']['authorizer_refresh_token'], 'createtime' => time(), 'updatetime' => time()])); } } } } catch (\Exception $e) { Log::info("API 授权更新回调错误,Error:" . $e->getMessage()); } }, Guard::EVENT_UPDATE_AUTHORIZED); // 处理授权取消事件 $server->push(function ($message) { try{ $appid = $message['AuthorizerAppid']; $platformAppid = $message['AppId']; if ($appid != 'wx570bc396a51b8ff8') { $data = [ 'is_auth' => 0, 'wx_ad_source_id' => 0, 'wx_ad_state' => 0 ]; model('AdminConfig')->update($data, ['appid' => $appid]); //维护Ptoken信息 if ($adminConfig = model('AdminConfig')->getAdminInfoByAppId($appid)) { if ($platform = model('Platform')->where(['appid' => $platformAppid])->find()) { $map = ['admin_id' => $adminConfig['admin_id'], 'platform_id' => $platform['id']]; if (model('Ptoken')->where($map)->find()) { model('Ptoken')->where($map)->delete(); } } } } }catch (\Exception $e) { Log::info("API 取消授权回调错误,Error:" . $e->getMessage()); } }, Guard::EVENT_UNAUTHORIZED); $server->serve()->send(); LogService::info("REQUEST_TIME_END:".microtime(true)); } /** * 初始化平台参数 */ public function initPlatform() { $mOphost = OfficialAccountsService::instance()->getOphostModel(); $hosts = $mOphost->getHosts(); $host = UrlService::instance()->getSourceDomain(); if (in_array($host, $hosts) && $ophost = $mOphost->getInfoByHost($host)) { $result = OpenPlatformService::instance()->initPlatformById($ophost['platform_id']); if($result->code != ErrorCodeConstants::SUCCESS){ $this->error($result->msg); } } else { LogService::info('API_LOG 未匹配到域名信息:' . $host . ':' . json_encode($hosts)); } } /** * 接收mp公众平台消息与事件 */ public function mpapi($appid) { LogService::info('[ WeChat ] [ MP ] [ API ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); LogService::info('[ WeChat ] [ MP ] [ API ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $this->initPlatform(); try { if (in_array($appid, OpenPlatformConstants::$app_id_for_all)) { //全网发布处理 OfficialAccountsEventService::instance()->eventForAllNet($appid); } else { //正常业务处理 $result = OfficialAccountsEventService::instance()->eventForNormal($appid); if($result->msg){ return; } } } catch (\Exception $e) { LogService::exception($e); } LogService::info("REQUEST_TIME_END:".microtime(true)); OfficialAccountsEventService::instance()->processCallbackUserInfo($appid); } /** * 根据 admin_id 获取 appid,token */ public function getToken() { $admin_id = $this->request->param('admin_id'); $data = []; $errMsg = ''; try { if (!$admin_id) { $this->error('缺少参数'); } $adminConfig = model('AdminConfig')->getAdminInfoAll($admin_id); if (!$adminConfig) { $this->error('无此数据'); } $wechat = new WeChatObject($adminConfig); $officialAccount = $wechat->getOfficialAccount(); $token = $officialAccount->access_token->getToken(); if (!is_array($token) || !array_key_exists('authorizer_access_token', $token)) { $errMsg = '获取token失败'; } else { $proxy = OpenPlatformService::instance()->getProxyconfigByChannel($admin_id, null, 'job_proxy_config',true); $data = [ 'appid' => $adminConfig['appid'], 'token' => $token['authorizer_access_token'], 'proxy_config' => $proxy ?: [], ]; } } catch (\Exception $exception) { Log::info('API getToken触发异常!admin_id:' . $admin_id . ' message:' . $exception->getMessage()); $this->error('获取异常'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } if (!empty($data)) { exit(json_encode(['code' => 1, 'msg' => 'success', 'time' => time(), 'data' => $data], JSON_UNESCAPED_SLASHES)); //$this->success('success', $data); } else { $this->error($errMsg); } } /** * 根据 admin_id 获取业务域名 */ public function getUrl() { $admin_id = $this->request->param('admin_id'); $data = []; $errMsg = ''; try { if (!$admin_id) { $this->error('缺少参数'); } $info = model('AdminConfig')->getAdminInfoAll($admin_id); if (!empty($info) && $info['ophost_host']) { $data = [ 'url' => $info['ophost_host'], ]; } else { $errMsg = '获取业务域名失败!'; } } catch (\Exception $exception) { Log::error('API getUrl触发异常!admin_id:' . $admin_id . ' message:' . $exception->getMessage()); $this->error('获取异常'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } if (!empty($data)) { $this->success('success', $data); } else { $this->error($errMsg); } } /** * 微信支付回调 */ public function pay() { Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $paymentApplication = Factory::payment(Config::get('wechat')); $paymentApplication['cache'] = new RedisCache(Redis::instanceCache()); $parent_point = $this; $response = $paymentApplication->handlePaidNotify(function ($message, $fail) use ($parent_point) { Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] Message: ' . json_encode(var_export($message, true), JSON_UNESCAPED_UNICODE)); if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态 if (isset($message['result_code']) && $message['result_code'] === 'SUCCESS') { // 用户是否支付成功 $orders = model('Orders')->get(['out_trade_no' => $message['out_trade_no']]); if ($orders['state'] == 1) { // 已支付 return true; } $parent_point->saveOrder($orders, $message['transaction_id'], ''); Log::info(sprintf('wechatpay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $orders['wxpay_id'], $orders['admin_id'], $orders['money'], $orders['goods_id'], $orders['out_trade_no'])); return true; } elseif (!isset($message['result_code']) || $message['result_code'] === 'FAIL') { // 用户支付失败 return true; } else { return $fail('参数错误,请稍后再通知我'); } } else { return $fail('通信失败,请稍后再通知我'); } }); $response->send(); } /** * 四方支付回调 */ public function palmpay() { Log::info('[ palmpay ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ palmpay ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $params = $this->request->post(); if (isset($params['status']) && $params['status'] === 'success') { $order = model('Orders')->get(['out_trade_no' => $params['outTradeNo']]); if ($order['state'] == 1) { Log::info('订单已经支付,out_trade_no:' . $params['outTradeNo']); return 'success'; } $payInfo = model('Wxpay')->getInfoByHost($this->currentPayHost); if (empty($payInfo['quartet_app_key'])) { Log::error('quartet_app_key不存在'); return 'quartet_app_key不存在'; } $appKey = $payInfo['quartet_app_key']; if (!$this->_checkSign($params, $appKey)) { Log::error('sign校验失败'); return 'sign校验失败'; } Log::info(sprintf('palmpay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $order['wxpay_id'], $order['admin_id'], $order['money'], $order['goods_id'], $order['out_trade_no'])); $this->saveOrder($order, $params['chorderid'], $params['pdorderid']); Log::info('订单支付回调成功,pdorderid:' . $params['pdorderid']); return 'success'; } else { $status = empty($params['status']) ? -1 : $params['status']; Log::error('充值不成功,status:' . $status); return $status; } } /** * 汇聚支付回调 */ public function joinpay() { Log::info('[ joinpay ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ joinpay ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $params = $this->request->get(); if (isset($params['r6_Status']) && $params['r6_Status'] == 100) { $order = model('Orders')->get(['out_trade_no' => $params['r2_OrderNo']]); if ($order['state'] == 1) { Log::info('订单已经支付,out_trade_no:' . $params['r2_OrderNo']); return 'success'; } Log::info(sprintf('joinpay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $order['wxpay_id'], $order['admin_id'], $order['money'], $order['goods_id'], $order['out_trade_no'])); $this->saveOrder($order, $params['r7_TrxNo'], ''); Log::info('订单支付回调成功,transaction_id:' . $params['r7_TrxNo']); return 'success'; } else { $status = empty($params['r6_Status']) ? -1 : $params['r6_Status']; Log::error('充值不成功,status:' . $status); return $status; } } public function mihuapay() { Config::set('app_trace', false); Log::info('[ mihuapay ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ mihuapay ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $params = $this->request->get(); $pureHost = UrlService::instance()->getSourceDomain(); $payInfo = model('Wxpay')->getInfoByHost($pureHost); if (empty($payInfo)) { Log::error('回调域名对应的支付信息不存在。host:' . $pureHost); return ''; } $data = $params['data']; $mihuaService = MihuaPayService::instance($payInfo['quartet_app_key'], $payInfo['quartet_app_public_key']); $jsonStr = $mihuaService->decrypt($data); Log::info(sprintf('支付回调返回值明文:%s', $jsonStr)); $result = json_decode($jsonStr, true); if ($mihuaService->checkSign($result)) { if ($result['orderStatus'] == 'SUCCESS') { $order = model('Orders')->get(['out_trade_no' => $result['orderId']]); if ($order['state'] == 1) { Log::info('订单已经支付,out_trade_no:' . $result['orderId']); return 'SUCCESS'; } Log::info(sprintf('mihuapay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $order['wxpay_id'], $order['admin_id'], $order['money'], $order['goods_id'], $order['out_trade_no'])); $transactionId = empty($result['bankOrderNo']) ? $result['mbOrderId'] : $result['bankOrderNo']; $this->saveOrder($order, $transactionId, ''); Log::info('订单支付回调成功,transaction_id:' . $transactionId); return 'SUCCESS'; } else { Log::error('米花支付回调失败,msg:' . $jsonStr); return ''; } } else { Log::error('公钥验证签名出错,msg:' . $jsonStr); return ''; } } public function unspay() { Config::set('app_trace', false); Log::info('[ unsapay ] [ PAY ] [ CALLBACK ] POST: ' . json_encode(var_export($this->request->post(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ unsapay ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $params = $this->request->post(); $pureHost = UrlService::instance()->getSourceDomain(); $payInfo = model('Wxpay')->getInfoByHost($pureHost); if (empty($payInfo)) { Log::error('回调域名对应的支付信息不存在。host:' . $pureHost); return ''; } $params['accountId'] = $payInfo['quartet_app_id']; $verifyResponseResult = UnsPayService::instance($payInfo['quartet_app_key'])->verifyCallbackMacParams($params); if (isset($params['result_code']) && $params['result_code'] == '0000' && $verifyResponseResult) { $order = model('Orders')->get(['out_trade_no' => $params['orderId']]); if ($order['state'] == 1) { Log::info('订单已经支付,out_trade_no:' . $params['r2_OrderNo']); $aResult = [ 'result_code' => "000000", 'channel_refund_trade_no' => $order['transaction_id'], ]; return json_encode($aResult); } Log::info(sprintf('unspay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $order['wxpay_id'], $order['admin_id'], $order['money'], $order['goods_id'], $order['out_trade_no'])); $this->saveOrder($order, $params['channel_refund_trade_no']); Log::info('订单支付回调成功,transaction_id:' . $params['channel_refund_trade_no']); $aResult = [ 'result_code' => "000000", 'channel_refund_trade_no' => $params['channel_refund_trade_no'], ]; return json_encode($aResult); } else { Log::error('充值不成功,result_code:' . $params['result_code']); return $params['result_code']; } } public function ipaynowpay() { Config::set('app_trace', false); Log::info('[ ipaynowpay ] [ PAY ] [ CALLBACK ] POST: ' . json_encode(var_export($this->request->post(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ ipaynowpay ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); $strParams = $this->request->getInput(); parse_str($strParams, $params); $payInfo = model('Wxpay')->getInfoByHost($this->currentPayHost); $verifyResult = IpaynowPayService::instance($payInfo['quartet_app_private_no'])->verifySign($params); if (isset($params['transStatus']) && $params['transStatus'] === 'A001' && $verifyResult) { $order = model('Orders')->get(['out_trade_no' => $params['mhtOrderNo']]); if ($order['state'] == 1) { Log::info('订单已经支付,out_trade_no:' . $params['mhtOrderNo']); return 'success=Y'; } Log::info(sprintf('ipaynow_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $order['wxpay_id'], $order['admin_id'], $order['money'], $order['goods_id'], $order['out_trade_no'])); $this->saveOrder($order, $params['channelOrderNo'], $params['nowPayOrderNo']); Log::info('订单支付回调成功,mhtOrderNo:' . $params['mhtOrderNo']); return 'success=Y'; } else { $status = empty($params['transStatus']) ? -1 : $params['transStatus']; Log::error('充值不成功,status:' . $status); return 'success=N'; } } /** * 支付宝h5支付 */ public function alih5pay() { Log::info('[ WECHAT ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true))); try { $alipay = AliH5PayService::instance()->init(ApiConstants::PAYMENT_METHOD_ALIPAYH5)->initPay(); $data = $alipay->verify(); LogService::debug('Alipay notify' . $data->toJson()); $out_trade_no = $data->get("out_trade_no"); $orders = model('Orders')->get(['out_trade_no' => $out_trade_no]); if ($orders['state'] != OrderContents::ORDER_STATE_PAID) { // 已支付 $this->saveOrder($orders, $data->get('trade_no')); Log::info(sprintf('alih5pay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $orders['wxpay_id'], $orders['admin_id'], $orders['money'], $orders['goods_id'], $orders['out_trade_no'])); } return $alipay->success()->send(); } catch (\Exception $e) { LogService::exception($e); } } /** * 微信支付回调 */ public function wxh5pay() { Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true), JSON_UNESCAPED_UNICODE)); Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true), JSON_UNESCAPED_UNICODE)); try { $wxPay = WechatH5Payservice::instance()->init(ApiConstants::PAYMENT_METHOD_WECHATH5)->initPay(); $data = $wxPay->verify(); LogService::debug('wxPay notify' . $data->toJson()); $out_trade_no = $data->get("out_trade_no"); $orders = model('Orders')->get(['out_trade_no' => $out_trade_no]); if ($orders['state'] != OrderContents::ORDER_STATE_PAID) { // 已支付 $this->saveOrder($orders, $data->get('trade_no')); Log::info(sprintf('alih5pay_callback_success!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s' , $orders['wxpay_id'], $orders['admin_id'], $orders['money'], $orders['goods_id'], $orders['out_trade_no'])); } return $wxPay->success()->send(); } catch (\Exception $e) { LogService::exception($e); } } /** * 校验回调签名 * @param $params post参数 * @param $appKey * @return bool */ private function _checkSign($params, $appKey) { if (!isset($params['sign'])) { Log::error('sign不存在'); return false; } $arrSign = []; ksort($params); $originalSign = $params['sign']; foreach ($params as $k => $param) { if ($k == 'sign') { continue; } $strTmp = trim($k) . '=' . trim($param); $arrSign[] = $strTmp; } $arrSign[] = 'key=' . $appKey; $strSign = implode('&', $arrSign); $sign = md5($strSign); return $originalSign == $sign; } /** * 保存订单信息,并保存统计信息 * @param $orders * @param string $transactionId 微信支付订单号 * @param string $pdorderid 四方支付订单号 */ private function saveOrder(Orders $orders, $transactionId = '', $pdorderid = '') { $time = Request::instance()->server('REQUEST_TIME'); $business = $orders->business_line??'0'; $oOrder = (new OrderObject())->bind($orders->getData()); $cacheKey = OrderService::instance()->getOrderCacheKey($oOrder)->data; LogService::debug("清除缓存:" . $cacheKey); Redis::instance()->delete($cacheKey); if (!OrderService::instance()->getOrderModel()->update([ 'transaction_id' => $transactionId, 'pdorderid' => $pdorderid, 'state' => OrderContents::ORDER_STATE_PAID, 'finishtime' => $time, 'updatetime' => $time, ], ['id' => $orders['id'], 'state' => OrderContents::ORDER_STATE_TO_PAY])) { LogService::error('订单未更新'); return; } BuyMoreService::instance()->checkOrderBuyMore($orders['user_id'], $orders['out_trade_no'], $orders['id']); //如果为复粉支付号,加入用户缓存 $wxpay = OfficialAccountsService::instance()->getWxpayModel()->getInfoById($oOrder->wxpay_id); if ($wxpay['fufen']) { $cache = CacheConstants::getWxpayFunfen($oOrder->user_id); Redis::instance()->sAdd($cache, $oOrder->wxpay_id); } //记录用户充值完成时间 WhiteList::addUserPayTime($orders['user_id']); //处理取消充值redis标志位 $redis = Redis::instance(); $payCancelKey = "O-C:{$orders['user_id']}:{$orders['goods_id']}"; if ($redis->exists($payCancelKey)) { //redis标记设置 $redis->setex($payCancelKey, 600, 2); // (600秒)10分钟 状态改为2 } //取消充值ssdb首充标志位 $userInfo = model('User')->getUserInfo($orders['user_id']); //起充人数 $cid = AdminService::instance()->getAdminExtendModel()->getChannelId($userInfo['channel_id']); $cacheKey = CacheConstants::getPayUserLimitCacheKey($cid); Redis::instance()->pfAdd($cacheKey, $userInfo['id']); Redis::instance()->expire($cacheKey, 86400); if (Config::get('site.smallpay_goods_id') == $orders['goods_id']) { $cacheKey = CacheConstants::getSmallPayCache($orders['user_id']); Redis::instance()->set($cacheKey, 1); } $cacheOrderCount = CacheConstants::getUserOrderCompletedCountCacheKey($orders['user_id']); if ($count = Redis::instance()->get($cacheOrderCount)) { Redis::instance()->incr($cacheOrderCount); } else { $count = OrderService::instance()->getOrderModel() ->where('user_id', $orders['user_id']) ->where('state', OrderContents::ORDER_STATE_PAID) ->count(); Redis::instance()->set($cacheOrderCount, $count + 1); } //未设置的,都按已激活算 $isPay = $userInfo['first_cancel_pay'] ?? 1; if($isPay){ // $is_update = model('User') // ->setConnect($orders['user_id']) // ->where('id',$orders['user_id']) // ->update(['first_cancel_pay'=>0]); $is_update = UserService::instance()->update(['first_cancel_pay' => 0], ['id' => $orders['user_id']]); if($is_update === false){ Log::error("支付回调: UserId:{$orders['user_id']} first_cancel_pay:0 更新用户首冲标志位失败"); } $redis->del("UN:{$orders['user_id']}"); } $this_money_benefit = round($orders['money_benefit'], 2); //写统计数据 //今天 $today = date('Ymd', $orders['createtime']); //本月 // //统计活动充值 $oAna = new AnalysisObject(); $oAna->event_time = $oOrder->createtime; $oAna->type = KafkaDotConstants::TYPE_ORDER_COMPLETE; $oAna->data = [ 'orders_type' => $orders['type'], 'money' => $orders['money'], 'user_collect' => 1, ]; if ($orders['book_id']) { $oAna->data['book_id'] = $orders['book_id']; } try { //活动且非扣量,进行数据统计 if ($oOrder->activity_id && !$oOrder->resource_id) { // $oAna->user_from['activity_id'] = $oOrder->activity_id; $oActivityAna = new AnalysisObject(); $oActivityAna->type = KafkaDotConstants::TYPE_ACTIVITY; $oActivityAna->user_from = [ 'activity_id' => $oOrder->admin_id ]; $oActivityAna->data = [ 'stage' => 'end' ]; KafkaDotService::instance()->sendMsg($oOrder->user_id, $oActivityAna); //如果是渠道自定义活动在处理 if(model('Activity')->checkIsChannelActivity($orders->activity_id)){ $pay_count_key = "ATPU:{$orders['activity_id']}"; $activity_config = Config::get('site.activity_config'); $redis->hIncrBy($pay_count_key,$orders['user_id'],1); $redis->expire($pay_count_key,(intval($activity_config['time_interval'])*86400)*2); } $activityCollect = model('ActivityCollect'); $activityCollectAll = model('ActivityCollectAll'); $dayFindArr = ['aid' => $orders->activity_id, 'admin_id' => $orders->admin_id, 'createdate' => $today, 'business_line'=>$business]; $allFindArr = ['aid' => $orders->activity_id, 'admin_id' => $orders->admin_id, 'business_line'=>$business]; //管理员条件 $managerDayFindArr = ['aid' => $orders->activity_id, 'admin_id' => 0, 'createdate' => $today, 'business_line'=>$business]; $managerAllFindArr = ['aid' => $orders->activity_id, 'admin_id' => 0, 'business_line'=>$business]; $dayRes = $activityCollect->where($dayFindArr)->find(); $allRes = $activityCollectAll->where($allFindArr)->find(); $manageDayRes = $activityCollect->where($managerDayFindArr)->find(); $manageAllRes = $activityCollectAll->where($managerAllFindArr)->find(); //按日统计 if ($dayRes) { //更新 //渠道商代理商 $dayArrAc['money'] = ['exp', "`money`+{$orders['money']}"]; $dayArrAc['recharge_count'] = ['exp', "`recharge_count`+1"]; $dayArrAc['updatetime'] = time(); $sqlRes = $activityCollect->update($dayArrAc, $dayFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($dayArrAc).'where条件:'.json_encode($dayFindArr)); } } else { //插入 $dayFindArr['money'] = $orders['money']; $dayFindArr['recharge_count'] = 1; $dayFindArr['createtime'] = time(); $dayFindArr['updatetime'] = time(); $sqlRes = $activityCollect->insert($dayFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($dayFindArr)); } } //管理员按日统计 if ($manageDayRes) { //更新 //渠道商代理商 $mdayArrAc['money'] = ['exp', "`money`+{$orders['money']}"]; $mdayArrAc['recharge_count'] = ['exp', "`recharge_count`+1"]; $mdayArrAc['updatetime'] = time(); $sqlRes = $activityCollect->update($mdayArrAc, $managerDayFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($mdayArrAc).'where条件:'.json_encode($managerDayFindArr)); } } else { //插入 $managerDayFindArr['money'] = $orders['money']; $managerDayFindArr['recharge_count'] = 1; $managerDayFindArr['createtime'] = time(); $managerDayFindArr['updatetime'] = time(); $sqlRes = $activityCollect->insert($managerDayFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($managerDayFindArr)); } } //汇总统计 if ($allRes) { //更新 $allArrAc['money'] = ['exp', "`money`+{$orders['money']}"]; $allArrAc['recharge_count'] = ['exp', "`recharge_count`+1"]; $allArrAc['updatetime'] = time(); $sqlRes = $activityCollectAll->update($allArrAc, $allFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($allArrAc).'where条件:'.json_encode($allFindArr)); } } else { //插入 $allFindArr['money'] = $orders['money']; $allFindArr['recharge_count'] = 1; $allFindArr['createtime'] = time(); $allFindArr['updatetime'] = time(); $sqlRes = $activityCollectAll->insert($allFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($allFindArr)); } } //管理员汇总统计 if ($manageAllRes) { //更新 $mallArrAc['money'] = ['exp', "`money`+{$orders['money']}"]; $mallArrAc['recharge_count'] = ['exp', "`recharge_count`+1"]; $mallArrAc['updatetime'] = time(); $sqlRes = $activityCollectAll->update($mallArrAc, $managerAllFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($mallArrAc).'where条件:'.json_encode($managerAllFindArr)); } } else { //插入 $managerAllFindArr['money'] = $orders['money']; $managerAllFindArr['recharge_count'] = 1; $managerAllFindArr['createtime'] = time(); $managerAllFindArr['updatetime'] = time(); $sqlRes = $activityCollectAll->insert($managerAllFindArr); if(empty($sqlRes)){ Log::info('统计sql执行失败--表:activityCollect--数据:'.json_encode($managerAllFindArr)); } } } } catch (\Exception $exception) { Log::error('支付回调插入活动表出错'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } try { /** * referral 推广表 */ if (!empty($orders['referral_id']) && $business == PayConstants::BUSINESS_WECHAT) { // 是推广链接产生的订单 $oAna->user_from['referral_id'] = $orders['referral_id']; $redis = Redis::instance(); if (empty($orders['resource_id'])) { // 非转移订单&非扣量订单 model('referral')->update(['money' => ['exp', "`money`+{$orders['money']}"], 'orders_num' => ['exp', "`orders_num`+1"]], ['id' => $orders['referral_id']]); //当天充值金额 $dayMTkey = "M-T:" . $orders['referral_id'] . ":" . date("d"); if ($redis->exists($dayMTkey)) { $redis->incrBy($dayMTkey, intval($orders['money'] * 100)); } else { $redis->set($dayMTkey,intval($orders['money'] * 100)); $redis->expire($dayMTkey,86400); } //当天充值笔数 $dayMTkey = "M-T-N:" . $orders['referral_id'] . ":" . date("d"); if ($redis->exists($dayMTkey)) { $redis->incrBy($dayMTkey, 1); } else { $redis->set($dayMTkey,1); $redis->expire($dayMTkey,86400); } //更新每日数据 ReferralService::instance()->updateDayData($orders['referral_id'], ['orders_num' => 1, 'recharge_money' => $orders['money']], $orders['createtime']); } } /** * referral 推广表 */ if (!empty($orders['referral_id_permanent']) && $orders['referral_id_permanent'] != $orders['referral_id'] && $business == PayConstants::BUSINESS_WECHAT) { // 是推广链接产生的订单 $oAna->data['referral_id_permanent'] = $orders['referral_id_permanent']; $redis = Redis::instance(); if (empty($orders['resource_id'])) { // 非转移订单&非扣量订单 model('referral')->update(['money' => ['exp', "`money`+{$orders['money']}"], 'orders_num' => ['exp', "`orders_num`+1"]], ['id' => $orders['referral_id_permanent']]); //当天充值金额 $dayMTkey = "M-T:" . $orders['referral_id_permanent'] . ":" . date("d"); if ($redis->exists($dayMTkey)) { $redis->incrBy($dayMTkey, intval($orders['money'] * 100)); } else { $redis->set($dayMTkey,intval($orders['money'] * 100)); $redis->expire($dayMTkey,86400); } //当天充值笔数 $dayMTkey = "M-T-N:" . $orders['referral_id_permanent'] . ":" . date("d"); if ($redis->exists($dayMTkey)) { $redis->incrBy($dayMTkey, 1); } else { $redis->set($dayMTkey,1); $redis->expire($dayMTkey,86400); } //更新每日数据 ReferralService::instance()->updateDayData($orders['referral_id_permanent'], ['orders_num' => 1, 'recharge_money' => $orders['money']], $orders['createtime']); } } } catch (\Exception $exception) { Log::error('支付回调更新推广链接表出错'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } /** * recharge表 */ try { // 充值书币/VIP $rechargeModel = model('Recharge'); $data = [ 'user_id' => $orders['user_id'], 'type' => $orders['type'], 'kandian' => $orders['kandian'], 'remain_kandian' => $orders['kandian'], 'free_kandian' => 0, 'remain_free_kandian' => 0, 'day' => $orders['day'], 'book_id' => $orders['book_id'], 'dd' => $orders['deduct'], 'createtime' => $time, 'updatetime' => $time, 'business_line' => $business, 'orders_id' => $orders['id'], ]; //查询订单是不是消耗活动得订单 wud $orderExtendType = model('OrdersExtend')->where(['order_id'=>$orders['id']])->find(); if( !empty($orderExtendType) ){ $data['extend_type'] = $orderExtendType['type']; } if($orders['type'] == '2'){ //VIP充值 $data['vip_starttime'] = $rechargeModel->getVipStartTime($orders['user_id']); if($orders['deduct'] == '0'){ $data['channel_vip_starttime'] = $rechargeModel->getChannelVipStartTime($orders['user_id']); } } $sqlRes = $rechargeModel->setConnect($orders['user_id'])->insertGetId($data); if(empty($sqlRes)){ Log::info('充值书币sql执行失败--表:recharge--数据:'.json_encode($data).'用户id:'.$orders['user_id']); } FinancialService::instance()->getKandian($orders['user_id']); } catch (\Exception $exception) { Log::error('支付回调插入表出错:'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } // 赠送书币(VIP无赠送) try { if ($orders['type'] == 1 && !empty($orders['free_kandian'])) { $data = [ 'user_id' => $orders['user_id'], 'type' => $orders['type'], 'kandian' => 0, 'remain_kandian' => 0, 'free_kandian' => $orders['free_kandian'], 'remain_free_kandian' => $orders['free_kandian'], 'day' => 0, 'book_id' => $orders['book_id'], 'dd' => $orders['deduct'], 'createtime' => $time, 'updatetime' => $time, 'business_line' => $business, 'orders_id' => $orders['id'], ]; if (!empty($orders['activity_id'])) { $activityId = $orders['activity_id']; $activityInfo = ActivityService::instance()->getActivityInfo($activityId); $data['free_endtime'] = $time + $activityInfo['free_day'] * 86400; } else { $data['free_endtime'] = $time + Config::get('site.kandian_free_day') * 86400; } $sqlRes = $rechargeModel->setConnect($orders['user_id'])->insertGetId($data); if(empty($sqlRes)){ Log::info('充值书币sql执行失败--表:recharge--数据:'.json_encode($data).'用户id:'.$orders['user_id']); } FinancialService::instance()->getFreeKandian($orders['user_id']); } } catch (\Exception $exception) { Log::error('支付回调赠送书币出错:'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } try { // user表 金额 $userModel = model('User'); $userInfo = $userModel->getUserInfo($orders['user_id']); $adminId = $orders['admin_id']; $group = model('AuthGroupAccess')->where('uid', $adminId)->find(); $groupId = $group->group_id; //分成比例 $adminExtend = model('AdminExtend')->where('admin_id', $adminId)->find(); $agentID = 0; if ($groupId == 3) { //渠道商 $channel_id = $adminId; } else { if ($adminExtend->distribute == '1') { $agentID = $adminId; } $channel_id = $adminExtend->create_by; $adminChannelExtend = model('AdminExtend')->where('admin_id', $channel_id)->find(); $channelBenefit = $adminChannelExtend->benefit; } if ($userInfo) { $redis = Redis::instance(); $userData = []; $userUpdate = new UserUpdate(); $userUpdate->setId($orders['user_id']); $userKey = 'UN:' . $orders['user_id']; if (!$userInfo['is_pay']) { $userData['is_pay'] = 1; $userUpdate->setIsPay(1); $oAna->data['first_pay'] = 1; if (empty($orders['deduct'])) { //如果不是KL //渠道商OR配号代理商 统计付费用户 $current_channel_id = empty($agentID) ? $channel_id : $agentID; //发送打点数据 $dotData = new DotObject(); $dotData->channel_id = $current_channel_id; $dotData->event_time = Request::instance()->server('REQUEST_TIME'); $dotData->action_type = MqConstants::ROUTING_KEY_COLLECT_CHANNEL_PAY; $dotData->type = MqConstants::MSG_TYPE_PAY; MqService::instance()->sendMessage($dotData); } } if (empty($orders['deduct'])) { //如果不是KL //渠道每日新增用户充值总数 $current_channel_id = empty($agentID) ? $channel_id : $agentID; if ($userInfo['createtime'] >= strtotime(date("Y-m-d"))) { $newsUserMoney = 0; $newsUserMoney += $orders['money']; //发送打点数据 $dotData = new DotObject(); $dotData->channel_id = $current_channel_id; $dotData->event_time = Request::instance()->server('REQUEST_TIME'); $dotData->action_type = MqConstants::ROUTING_KEY_COLLECT_CHANNEL_PAY; $dotData->type = MqConstants::MSG_TYPE_NEW_USER_RECHARGE; $dotData->user_id = $orders['user_id']; $dotData->money = (float)$newsUserMoney; MqService::instance()->sendMessage($dotData); //写入充值的用户 $date_time = date('Ymd'); $key1 = "CNR_D:{$date_time}:{$channel_id}"; $redis->pfAdd($key1, $orders['user_id']); $key2 = "CNR_D:{$date_time}:0"; $redis->pfAdd($key2, $orders['user_id']); } } if ($orders['day']) { if ($userInfo['vip_endtime'] > $time) { $vipTime = $orders['day'] * 86400; $userData['vip_endtime'] = $userInfo['vip_endtime'] + $vipTime; } else { $vipTime = intval($time) + intval($orders['day'] * 86400); $userData['vip_endtime'] = $vipTime; //VIP 间隔续费时,维护vip_starttime UserVipExtendService::instance()->saveVipStartTime($orders['user_id'], intval($time)); } $userUpdate->setAddvipday($orders['day'] * 86400); } if (ApiService::instance()->checkApiOn()) { \app\source\service\UserService::instance()->updateUser($userUpdate); } else { $userModel->setConnect($orders['user_id'])->update($userData, ['id' => $orders['user_id']]); //修改redis $redis->del($userKey); } } } catch (\Exception $exception) { Log::error('支付回调用户操作失败:'.json_encode(['errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage()])); } //内推单页直接购买书籍 try { SinglePushService::instance()->completeOrders($orders); }catch (\Exception $e){ log::error('内推页直接购买书籍失败'.json_encode($orders)); } //消耗活动标记 $cSignKey = CampaignConstants::getUserClickCSignKey($userInfo['id']); $uOrderKey = CampaignConstants::getUserPayOrderKey($userInfo['id']); if (Redis::instance()->get($cSignKey)) { if (Redis::instance()->get($uOrderKey) === false) { Redis::instance()->set($uOrderKey, $orders['out_trade_no'], 86400); } } //添加渠道订单金额统计 if ($orders['deduct']) { AdminKlService::instance($business)->addChannelOrderMoneyCache($orders['resource_id'], $orders['money'], $orders['out_trade_no'], true); AdminKlService::instance($business)->addChannelOrderMoneyCache($orders['resource_id'], $orders['money'], $orders['out_trade_no']); } else { AdminKlService::instance($business)->addChannelOrderMoneyCache($orders['admin_id'], $orders['money'], $orders['out_trade_no']); } // 用户画像打点 $this->_saveUserDot($orders); if (intval($orders['deduct']) < 1 || $orders['createtime'] > 1577203200) { //如果不是KL /* * orders_collect表 */ //判断 充值vip(true) 还是 充值书币(false) $isVip = !empty($orders['day']); $isActivity = !empty($orders['activity_id']); //判断 引导充值(true) 还是 普通充值(false) $yd = !empty($orders['book_id']); $ordersCollect = model('OrdersCollect'); $splitMoney = $this->splitMoney($orders); try { $adminId = $orders['admin_id']; $group = model('AuthGroupAccess')->where('uid', $adminId)->find(); $groupId = $group->group_id; if ($groupId == 3) { //渠道商 /** * 渠道商提现表维护 */ $adminMoneyModel = model('AdminMoney'); $adminMoneyResult = $adminMoneyModel->where(['admin_id' => $adminId])->find(); if ($adminMoneyResult) { //更新 $moneyData = []; $moneyData['count_money'] = ['exp', "`count_money`+{$orders['money']}"]; //总收入金额 $moneyData['split_money'] = ['exp', "`split_money`+{$splitMoney}"]; //总分账金额 $moneyData['orders_count'] = ['exp', "`orders_count`+1"]; $moneyData['updatetime'] = $time; $sqlRes = $adminMoneyModel->update($moneyData, ['id' => $adminMoneyResult->id]); if (empty($sqlRes)) { Log::info('提现sql执行失败--表:AdminMoney--数据:' . json_encode($moneyData) . 'where条件:' . json_encode(['id' => $adminMoneyResult->id])); } } else { //插入 $moneyData = []; $moneyData['admin_id'] = $adminId; $moneyData['count_money'] = $orders['money']; //总收入金额 $moneyData['split_money'] = $splitMoney; //总分账金额 $moneyData['orders_count'] = 1; $moneyData['createtime'] = $time; $moneyData['updatetime'] = $time; $sqlRes = $adminMoneyModel->insert($moneyData); if (empty($sqlRes)) { Log::info('提现sql执行失败--表:AdminMoney--数据:' . json_encode($moneyData)); } } /** * 渠道商 当天 自身 */ $channelDay = [ 'admin_id' => $adminId, 'type' => 1, 'flag' => 1, 'createdate' => $today, 'business_line' => $business, ]; $channelResDay = $ordersCollect->where($channelDay)->find(); if ($channelResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $channelDay, $isVip)->data; $dayArr = []; $dayArr['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $dayArr['recharge_money_benefit'] = [ 'exp', "`recharge_money_benefit`+{$this_money_benefit}", ]; if ($splitMoney) { $dayArr['split_money'] = [ 'exp', "`split_money`+{$splitMoney}", ]; } if ($isVip) { $dayArr['vip_recharge_user_suc_count'] = $user_count['user']; $dayArr['recharge_user_suc_count'] = $user_count['total']; $dayArr['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $dayArr['vip_recharge_money'] = [ 'exp', "`vip_recharge_money`+{$orders['money']}", ]; $dayArr['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $dayArr['vip_recharge_guide_orders'] = [ 'exp', "`vip_recharge_guide_orders`+1", ];; $dayArr['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $dayArr['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } } else { $dayArr['normal_recharge_user_suc_count'] = $user_count['user']; $dayArr['recharge_user_suc_count'] = $user_count['total']; $dayArr['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $dayArr['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $dayArr['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $dayArr['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $dayArr['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $dayArr['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } if (!$isActivity) { $dayArr['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($dayArr, ['id' => $channelResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($dayArr) . 'where条件:' . json_encode(['id' => $channelResDay->id])); } } /** * 渠道商 当天 全部 */ $channelAllDay = [ 'admin_id' => $adminId, 'type' => 1, 'flag' => 3, 'createdate' => $today, 'business_line' => $business, ]; $channelAllResDay = $ordersCollect->where($channelAllDay)->find(); if ($channelAllResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $channelAllDay, $isVip)->data; $dayAllArr = []; $dayAllArr['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $dayAllArr['recharge_money_benefit'] = [ 'exp', "`recharge_money_benefit`+{$this_money_benefit}", ]; if ($splitMoney) { $dayAllArr['split_money'] = [ 'exp', "`split_money`+{$splitMoney}", ]; } if ($isVip) { $dayAllArr['vip_recharge_user_suc_count'] = $user_count['user']; $dayAllArr['recharge_user_suc_count'] = $user_count['total']; $dayAllArr['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $dayAllArr['vip_recharge_money'] = [ 'exp', "`vip_recharge_money`+{$orders['money']}", ]; $dayAllArr['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $dayAllArr['vip_recharge_guide_orders'] = [ 'exp', "`vip_recharge_guide_orders`+1", ]; $dayAllArr['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $dayAllArr['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } } else { $dayAllArr['normal_recharge_user_suc_count'] = $user_count['user']; $dayAllArr['recharge_user_suc_count'] = $user_count['total']; $dayAllArr['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $dayAllArr['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $dayAllArr['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $dayAllArr['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $dayAllArr['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $dayAllArr['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } if (!$isActivity) { $dayAllArr['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($dayAllArr, ['id' => $channelAllResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($dayAllArr) . 'where条件:' . json_encode(['id' => $channelAllResDay->id])); } } /** * 管理员 当天 属下 */ $managerDay = [ 'admin_id' => 0, 'type' => 1, 'flag' => 2, 'createdate' => $today, 'business_line' => $business, ]; $manageResDay = $ordersCollect->where($managerDay)->find(); if ($manageResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $managerDay, $isVip)->data; $mDayArr = []; $mDayArr['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $mDayArr['recharge_money_benefit'] = [ 'exp', "`recharge_money_benefit`+{$this_money_benefit}", ]; if ($isVip) { $mDayArr['vip_recharge_user_suc_count'] = $user_count['user']; $mDayArr['recharge_user_suc_count'] = $user_count['total']; $mDayArr['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $mDayArr['vip_recharge_money'] = ['exp', "`vip_recharge_money`+{$orders['money']}"]; $mDayArr['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $mDayArr['vip_recharge_guide_orders'] = ['exp', "`vip_recharge_guide_orders`+1"]; $mDayArr['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $mDayArr['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } } else { $mDayArr['normal_recharge_user_suc_count'] = $user_count['user']; $mDayArr['recharge_user_suc_count'] = $user_count['total']; $mDayArr['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $mDayArr['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $mDayArr['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $mDayArr['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $mDayArr['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $mDayArr['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } if (!$isActivity) { $mDayArr['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($mDayArr, ['id' => $manageResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($mDayArr) . 'where条件:' . json_encode(['id' => $manageResDay->id])); } } } } catch (\Exception $exception) { Log::error('支付回调渠道商统计出错:' . json_encode([ 'errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage() ])); } if ($groupId == 4 && isset($channelBenefit)) { //代理商 try { $cBenefitMoney = round($channelBenefit * $orders['money'], 2); //渠道商设置的分成收益 $adminMoneyModel = model('AdminMoney'); /** * 代理商 提现表 维护 */ $adminMoneyResult = $adminMoneyModel->where(['admin_id' => $adminId])->find(); $moneyData = []; if ($adminMoneyResult) { //更新 $moneyData['count_money'] = ['exp', "`count_money`+{$orders['money']}"]; //总收入金额 $moneyData['orders_count'] = ['exp', "`orders_count`+1"]; //总收入金额 $sqlRes = $adminMoneyModel->update($moneyData, ['id' => $adminMoneyResult->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:AdminMoney--数据:' . json_encode($moneyData) . 'where条件:' . json_encode(['id' => $adminMoneyResult->id])); } } else { //插入 $moneyData['admin_id'] = $adminId; $moneyData['count_money'] = $orders['money']; //总收入金额 $moneyData['orders_count'] = 1; $sqlRes = $adminMoneyModel->insert($moneyData); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:AdminMoney--数据:' . json_encode($moneyData)); } } /** * 渠道商 提现表 维护 $channel_id */ $channelMcount = $adminMoneyModel->where(['admin_id' => $channel_id])->find(); $chanData = []; if ($channelMcount) { //更新 $chanData['count_money'] = ['exp', "`count_money`+{$orders['money']}"]; //总收入金额 $chanData['split_money'] = ['exp', "`split_money`+{$splitMoney}"]; //总分账金额 $chanData['orders_count'] = ['exp', "`orders_count`+1"]; //总收入金额 $sqlRes = $adminMoneyModel->update($chanData, ['id' => $channelMcount->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:AdminMoney--数据:' . json_encode($chanData) . 'where条件:' . json_encode(['id' => $channelMcount->id])); } } else { //插入 $chanData['admin_id'] = $channel_id; $chanData['count_money'] = $orders['money']; //总收入金额 $chanData['split_money'] = $splitMoney; //总分账金额 $chanData['orders_count'] = 1; $sqlRes = $adminMoneyModel->insert($chanData); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:AdminMoney--数据:' . json_encode($chanData)); } } /** * 代理商 当天 自身 */ $agentDay = [ 'admin_id' => $adminId, 'type' => 1, 'flag' => 1, 'createdate' => $today, 'business_line' => $business, ]; $agentResDay = $ordersCollect->where($agentDay)->find(); if ($agentResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $agentDay, $isVip)->data; $adayArr = []; $adayArr['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $adayArr['recharge_money_benefit'] = [ 'exp', "`recharge_money_benefit`+{$this_money_benefit}", ]; if ($isVip) { $adayArr['vip_recharge_user_suc_count'] = $user_count['user']; $adayArr['recharge_user_suc_count'] = $user_count['total']; $adayArr['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $adayArr['vip_recharge_money'] = ['exp', "`vip_recharge_money`+{$orders['money']}"]; $adayArr['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $adayArr['vip_recharge_guide_orders'] = ['exp', "`vip_recharge_guide_orders`+1"]; $adayArr['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $adayArr['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } } else { $adayArr['normal_recharge_user_suc_count'] = $user_count['user']; $adayArr['recharge_user_suc_count'] = $user_count['total']; $adayArr['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $adayArr['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $adayArr['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $adayArr['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $adayArr['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $adayArr['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } if (!$isActivity) { $adayArr['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($adayArr, ['id' => $agentResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($adayArr) . 'where条件:' . json_encode(['id' => $agentResDay->id])); } } /** * 渠道商 当天 属下 */ $agentParentDay = [ 'admin_id' => $channel_id, 'type' => 1, 'flag' => 2, 'createdate' => $today, 'business_line' => $business, ]; $agentParentResDay = $ordersCollect->where($agentParentDay)->find(); if ($agentParentResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $agentParentDay, $isVip)->data; $apDayArr = []; $apDayArr['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $apDayArr['recharge_money_benefit'] = ['exp', "`recharge_money_benefit`+{$this_money_benefit}"]; if ($isVip) { $apDayArr['vip_recharge_user_suc_count'] = $user_count['user']; $apDayArr['recharge_user_suc_count'] = $user_count['total']; $apDayArr['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $apDayArr['vip_recharge_money'] = ['exp', "`vip_recharge_money`+{$orders['money']}"]; $apDayArr['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $apDayArr['vip_recharge_guide_orders'] = ['exp', "`vip_recharge_guide_orders`+1"]; $apDayArr['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $apDayArr['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } } else { $apDayArr['normal_recharge_user_suc_count'] = $user_count['user']; $apDayArr['recharge_user_suc_count'] = $user_count['total']; $apDayArr['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $apDayArr['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $apDayArr['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$this_money_benefit}", ]; if ($yd) { $apDayArr['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $apDayArr['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $apDayArr['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$this_money_benefit}", ]; } if (!$isActivity) { $apDayArr['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($apDayArr, ['id' => $agentParentResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($apDayArr) . 'where条件:' . json_encode(['id' => $agentParentResDay->id])); } } /** * 渠道商 当天 全部 */ $agentParentAllDay = [ 'admin_id' => $channel_id, 'type' => 1, 'flag' => 3, 'createdate' => $today, 'business_line' => $business, ]; $agentAllParentResDay = $ordersCollect->where($agentParentAllDay)->find(); if ($agentAllParentResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $agentParentAllDay, $isVip)->data; $aChannelAllDay = []; $aChannelAllDay['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $aChannelAllDay['recharge_money_benefit'] = [ 'exp', "`recharge_money_benefit`+{$cBenefitMoney}", ]; if ($splitMoney) { $aChannelAllDay['split_money'] = [ 'exp', "`split_money`+{$splitMoney}", ]; } if ($isVip) { $aChannelAllDay['vip_recharge_user_suc_count'] = $user_count['user']; $aChannelAllDay['recharge_user_suc_count'] = $user_count['total']; $aChannelAllDay['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $aChannelAllDay['vip_recharge_money'] = [ 'exp', "`vip_recharge_money`+{$orders['money']}", ]; $aChannelAllDay['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$cBenefitMoney}", ]; if ($yd) { $aChannelAllDay['vip_recharge_guide_orders'] = [ 'exp', "`vip_recharge_guide_orders`+1", ]; $aChannelAllDay['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $aChannelAllDay['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$cBenefitMoney}", ]; } } else { $aChannelAllDay['normal_recharge_user_suc_count'] = $user_count['user']; $aChannelAllDay['recharge_user_suc_count'] = $user_count['total']; $aChannelAllDay['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $aChannelAllDay['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $aChannelAllDay['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$cBenefitMoney}", ]; if ($yd) { $aChannelAllDay['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $aChannelAllDay['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $aChannelAllDay['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$cBenefitMoney}", ]; } if (!$isActivity) { $aChannelAllDay['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($aChannelAllDay, ['id' => $agentAllParentResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($aChannelAllDay) . 'where条件:' . json_encode(['id' => $agentAllParentResDay->id])); } } /** * 管理员 当天 属下 */ $managerDay = [ 'admin_id' => 0, 'type' => 1, 'flag' => 2, 'createdate' => $today, 'business_line' => $business, ]; $manageResDay = $ordersCollect->where($managerDay)->find(); if ($manageResDay) { $user_count = OrderService::instance()->setOrderUserCountCache($orders['user_id'], $managerDay, $isVip)->data; $aManageDay = []; $aManageDay['recharge_money'] = ['exp', "`recharge_money`+{$orders['money']}"]; $aManageDay['recharge_money_benefit'] = ['exp', "`recharge_money_benefit`+{$cBenefitMoney}"]; if ($isVip) { $aManageDay['vip_recharge_user_suc_count'] = $user_count['user']; $aManageDay['recharge_user_suc_count'] = $user_count['total']; $aManageDay['vip_recharge_orders'] = ['exp', "`vip_recharge_orders`+1"]; $aManageDay['vip_recharge_money'] = ['exp', "`vip_recharge_money`+{$orders['money']}"]; $aManageDay['vip_recharge_money_benefit'] = [ 'exp', "`vip_recharge_money_benefit`+{$cBenefitMoney}", ]; if ($yd) { $aManageDay['vip_recharge_guide_orders'] = ['exp', "`vip_recharge_guide_orders`+1"]; $aManageDay['vip_recharge_guide_money'] = [ 'exp', "`vip_recharge_guide_money`+{$orders['money']}", ]; $aManageDay['vip_recharge_guide_money_benefit'] = [ 'exp', "`vip_recharge_guide_money_benefit`+{$cBenefitMoney}", ]; } } else { $aManageDay['normal_recharge_user_suc_count'] = $user_count['user']; $aManageDay['recharge_user_suc_count'] = $user_count['total']; $aManageDay['normal_recharge_orders'] = ['exp', "`normal_recharge_orders`+1"]; $aManageDay['normal_recharge_money'] = [ 'exp', "`normal_recharge_money`+{$orders['money']}", ]; $aManageDay['normal_recharge_money_benefit'] = [ 'exp', "`normal_recharge_money_benefit`+{$cBenefitMoney}", ]; if ($yd) { $aManageDay['normal_recharge_guide_orders'] = [ 'exp', "`normal_recharge_guide_orders`+1", ]; $aManageDay['noraml_recharge_guide_money'] = [ 'exp', "`noraml_recharge_guide_money`+{$orders['money']}", ]; $aManageDay['noraml_recharge_guide_money_benefit'] = [ 'exp', "`noraml_recharge_guide_money_benefit`+{$cBenefitMoney}", ]; } if (!$isActivity) { $aManageDay['kandian_recharge_orders'] = ['exp', "`kandian_recharge_orders`+1"]; } } $sqlRes = $ordersCollect->update($aManageDay, ['id' => $manageResDay->id]); if (empty($sqlRes)) { Log::info('统计sql执行失败--表:ordersCollect--数据:' . json_encode($aManageDay) . 'where条件:' . json_encode(['id' => $manageResDay->id])); } } } catch (\Exception $exception) { Log::error('支付回调代理商统计出错:' . json_encode([ 'errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage() ])); } } /* * book_collect表 */ if (!empty($orders['book_id'])) { try { if ($business == PayConstants::BUSINESS_APP) { $dotData = new DotBookCollectObject(); $dotData->channelId = $orders['admin_id']; $dotData->eventTime = Request::instance()->server('REQUEST_TIME'); $dotData->bookId = $orders['book_id']; $dotData->rechargeMoney = $orders['money']; $dotData->businessLine = $business; $dot = BookDotService::instance()->generateBookData($dotData); BookDotService::instance()->dotBookInfo($dot); } else { //管理员书籍统计 $this->bookConsumePayCollect(0, $orders['book_id'], $orders['money']); //渠道商/代理商书籍统计 $this->bookConsumePayCollect($orders['admin_id'], $orders['book_id'], $orders['money']); } } catch (\Exception $exception) { Log::error('支付回调book_collect统计出错:' . json_encode([ 'errcode' => $exception->getCode(), 'errmsg' => $exception->getMessage() ])); } } } if ($groupId == 4 && isset($channelBenefit) && intval($orders['deduct']) < 1) { //代理商 $times = time(); $trueToday = date('Ymd', $times); //赏金统计 try { if (!empty($orders['reward_money'])) { $this_reward_money = round($orders['reward_money'], 2); $reward_admin_id = $orders['admin_id']; $rewardCollect = model('reward_collect'); //被邀请人按天 $reward_day = [ 'admin_id' => $reward_admin_id, 'createdate' => $trueToday, 'type' => '1', 'flag' => '1', ]; $reward_aDay_res = $rewardCollect->where($reward_day)->find(); if (!empty($reward_aDay_res)) { //更新 $rDay_res = []; $rDay_res['reward'] = ['exp', "`reward`+{$this_reward_money}"]; $rDay_res['updatetime'] = $times; model('reward_collect')->update($rDay_res, ['id' => $reward_aDay_res->id]); } else { //插入 $reward_day_1['reward'] = $this_reward_money; $reward_day_1['invite_id'] = $orders['reward_admin_id']; $resadd = array_merge($reward_day_1, $reward_day); $resadd['createtime'] = $times; $resadd['updatetime'] = $times; $rewardCollect->insert($resadd); } //被邀请人汇总 $reward_all = [ 'admin_id' => $reward_admin_id, 'type' => '2', 'flag' => '1', ]; $reward_aAll_res = $rewardCollect->where($reward_all)->find(); if (!empty($reward_aAll_res)) { //更新 $rAll_res = []; $rAll_res['reward'] = ['exp', "`reward`+{$this_reward_money}"]; $rAll_res['updatetime'] = $times; $rewardCollect->update($rAll_res, ['id' => $reward_aAll_res->id]); } else { //插入 $reward_all['reward'] = $this_reward_money; $reward_all['invite_id'] = $orders['reward_admin_id']; $reward_all['createtime'] = $times; $reward_all['updatetime'] = $times; $rewardCollect->insert($reward_all); } //邀请人按天 $reward_channel_day = [ 'admin_id' => $orders['reward_admin_id'], 'invite_id' => 0, 'createdate' => $trueToday, 'type' => '1', 'flag' => '2', ]; $reward_cDay_res = $rewardCollect->where($reward_channel_day)->find(); if (!empty($reward_cDay_res)) { //更新 $reward_c_day = []; $reward_c_day['reward'] = ['exp', "`reward`+{$this_reward_money}"]; $reward_c_day['updatetime'] = $times; $rewardCollect->update($reward_c_day, ['id' => $reward_cDay_res->id]); } else { //新增 $reward_channel_day['reward'] = $this_reward_money; $reward_channel_day['createtime'] = $times; $reward_channel_day['updatetime'] = $times; $rewardCollect->insert($reward_channel_day); } //邀请人汇总 $reward_channel_all = [ 'admin_id' => $orders['reward_admin_id'], 'invite_id' => 0, 'type' => '2', 'flag' => '2', ]; $reward_cAll_res = $rewardCollect->where($reward_channel_all)->find(); if (!empty($reward_cAll_res)) { //更新 $reward_c_all = []; $reward_c_all['reward'] = ['exp', "`reward`+{$this_reward_money}"]; $reward_c_all['updatetime'] = $times; $rewardCollect->update($reward_c_all, ['id' => $reward_cAll_res->id]); } else { //插入 $reward_channel_all['reward'] = $this_reward_money; $reward_channel_all['createtime'] = $times; $reward_channel_all['updatetime'] = $times; $rewardCollect->insert($reward_channel_all); } //提现表维护 $reward_money = model('RewardMoney')->where('admin_id', $orders['reward_admin_id'])->find(); $rMoneyData = []; if (!empty($reward_money)) { //更新 $rMoneyData['no_cash_money'] = ['exp', "`no_cash_money`+{$this_reward_money}"]; //未提现金额 $rMoneyData['reward_count'] = ['exp', "`reward_count`+{$this_reward_money}"]; //总赏金金额 $rMoneyData['updatetime'] = $times; model('RewardMoney')->update($rMoneyData, ['id' => $reward_money['id']]); } else { //插入 $rMoneyData['admin_id'] = $orders['reward_admin_id']; $rMoneyData['no_cash_money'] = $this_reward_money; $rMoneyData['reward_count'] = $this_reward_money; $rMoneyData['createtime'] = $times; $rMoneyData['updatetime'] = $times; model('RewardMoney')->insert($rMoneyData); } } } catch (\Exception $exception) { Log::error('支付回调赏金统计出错'); } //赏金统计结束 } //打点 if($orders['deduct'] != 1 || empty($orders['resource_id'])){ //如果不是扣量或转移 $ext_data = json_decode($orders['ext'], true); if (is_array($ext_data) && $ext_data && $business == PayConstants::BUSINESS_WECHAT) { $oAna->user_from['mark'] = $ext_data['mark']; $oAna->user_from['push_id'] = $ext_data['push_id'] ?? 0; $oAna->user_from['push_idx'] = $ext_data['push_idx'] ?? BigData::DEFAULT_PUSH_IDX; $oAna->user_from['push_time'] = $ext_data['push_time'] ?? time(); $dotData = SmartPushDotService::instance()->generateDotData( $ext_data['mark'], $ext_data['push_id'] ?? 0, $ext_data['push_idx'] ?? BigData::DEFAULT_PUSH_IDX, $ext_data['push_time'] ?? time(), time(), array_merge(['money' => $orders['money'], 'type' => 2, 'out_trade_no' => $orders['out_trade_no'], 'business_line'=>$business, 'channel_id'=>$orders['admin_id'], 'user_id'=>$orders['user_id']], $ext_data) ); SmartPushDotService::instance()->dotSmartPushInfo($dotData); } Log::info(sprintf('[ MQ ] [ DOT ] wechatpay_saveorders!wxpay_id:%s,channel_id:%s,money:%s,good_id:%s,out_trade_no:%s,ext:%s,transactionId:%s,pdorderid:%s' , $orders['wxpay_id'], $orders['admin_id'], $orders['money'], $orders['goods_id'], $orders['out_trade_no'], $orders['ext'], $transactionId, $pdorderid)); } //如果是消耗活动充值,直接进行报名 if (isset($orderExtendType['type']) && $orderExtendType['type'] == 1 ){ $matchInfo = json_decode( $orderExtendType['json'], true ); CampaignService::instance()->autoCheckIn($userInfo,$matchInfo); } //订阅活动报名 if (isset($orderExtendType['type']) && $orderExtendType['type'] == 2 ){ $act = json_decode($orderExtendType['json'],true); $actId = $act['act_id']??0; SubscripService::instance()->insertActUser($userInfo,$actId,$orders); } //充值成功 发送活动推送 MqUserPaySuccessService::instance()->sendActiveToUser($orders,$userInfo); $adminConfig = AdminService::instance()->getAdminConfigModel()->getAdminInfoAll($channel_id); //非扣量 if (intval($orders['deduct']) < 1) { KafkaDotService::instance()->sendMsg($oOrder->user_id, $oAna); $toutType = $adminConfig['callback_time_tout'] ?? AdminConstants::CALLBACK_TIME_ONCE_24; LogService::info('toutpaytype:' . $toutType . ':' . $userInfo['id']); $check = ToutiaoNotifyService::instance()->checkCallbackTime($userInfo['subscribe_time'], $toutType)->data; $sToutChuanKey = CacheConstants::getCallbackLimitTout($orders['user_id']); $sToutChuanKeyOnce = CacheConstants::getCallbackLimitToutOnce($orders['user_id']); if (in_array($toutType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //已经回传过的 if (Redis::instance()->get($sToutChuanKeyOnce)) { Redis::instance()->set($sToutChuanKey, $orders['id'], 86400); } } else { Redis::instance()->del($sToutChuanKey); } //头条回传 if ($check && !Redis::instance()->get($sToutChuanKey)) { $toutKl = ReportKlService::instance()->getKlConfig($orders['admin_id'], PostbackConstants::TYPE_TOUTIAO, $orders['referral_id'])->data; $ifNotKl = ReportKlService::instance()->checkNotKl($orders['admin_id'], $toutKl, $orders['referral_id'], $orders['money'])->data; if ($ifNotKl) { $type = ToutiaoNotifyService::instance()::ORANGE_EVENT_TYPE_PAY; $oUser = (new UserObject())->bind($userInfo); //橘子建站回传支持 ToutiaoNotifyService::instance()->OrangeNotify($adminConfig, $oUser, $type, $oOrder); if ($link = Redis::instance()->get(CacheConstants::getGuideWxPay($orders['user_id']))) { ToutiaoNotifyService::instance()->notify($link, $orders['user_id'], ToutiaoNotifyService::EVENT_TYPE_PAY, $orders['money']); Redis::instance()->set($sToutChuanKeyOnce, $orders['id'], 86400); LogService::info('toutpayback:' . $orders['out_trade_no'] . ':' . $userInfo['id'] . ':' . $link); if (in_array($toutType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { LogService::info('toutpaybackonce:' . $toutType . ':' . $userInfo['id'] . ':' . $link); Redis::instance()->set($sToutChuanKey, $orders['id'], 86400); } } } } //uc回传 $ucType = $adminConfig['callback_time_uc'] ?? AdminConstants::CALLBACK_TIME_ONCE_24; LogService::info('ucpaytype:' . $ucType . ':' . $userInfo['id']); $check = ToutiaoNotifyService::instance()->checkCallbackTime($userInfo['subscribe_time'], $ucType)->data; $sUcChuanKey = CacheConstants::getCallbackLimitUc($orders['user_id']); $sUcChuanKeyOnce = CacheConstants::getCallbackLimitUcOnce($orders['user_id']); if (in_array($ucType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //已经回传过的 if (Redis::instance()->get($sUcChuanKeyOnce)) { Redis::instance()->set($sUcChuanKey, $orders['id'], 86400); } } else { Redis::instance()->del($sUcChuanKey); } if ($check && !Redis::instance()->get($sUcChuanKey)) { if ($link = Redis::instance()->get(UcCacheConstants::getGuideWxPay($orders['user_id']))) { $ucKl = ReportKlService::instance()->getKlConfig($orders['admin_id'], PostbackConstants::TYPE_UC, $orders['referral_id'])->data; $ifNotKl = ReportKlService::instance()->checkNotKl($orders['admin_id'], $ucKl, $orders['referral_id'], $orders['money'])->data; if ($ifNotKl) { UcNotifyService::instance()->notify($userInfo, $link, UcNotifyService::EVENT_TYPE_PAY, $orders['money']); Redis::instance()->set($sUcChuanKeyOnce, $orders['id'], 86400); LogService::info('ucpayback:' . $orders['out_trade_no'] . ':' . $userInfo['id'] . ':' . $link); if (in_array($ucType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { LogService::info('ucpaybackonce:' . $ucType . ':' . $userInfo['id'] . ':' . $link); Redis::instance()->set($sUcChuanKey, $orders['id'], 86400); } } } } $channel_id = $userInfo['channel_id']; $chan_id = $userInfo['channel_id']; if ($orders['activity_id']) { $url = "/index/recharge/activity?aid={$orders['activity_id']}&user_id={$orders['user_id']}"; } else { if ($orders['book_id']) { $chan_id = Config::get('site.tdc_bookinfo_url_channel') ?: $channel_id; $url = '/index/book/info?book_id='.$orders['book_id']; } else { $url = "/index/recharge/pay?id={$orders['goods_id']}&user_id={$orders['user_id']}&book_id={$orders['book_id']}"; } } $url = getCurrentDomain($chan_id,$url); $productName = ''; if(empty($orders['book_id'])){ $orders['book_id'] = (int)0; } if ($orders['book_id']) { $theme = \think\Config::get('site.theme'); if ($theme == null) { //库里拉取 $site = model("Config")->getConfigSiteArr(); $theme = $site['theme']; } if($theme == 'yg') { $platformName = "阳光"; } else if ($theme == 'px') { $platformName = "点看"; } else if ($theme == 'sf') { $platformName = "沙发"; } else if ($theme == 'qy') { $platformName = "袋鼠"; } else { $platformName = "西瓜"; } $bookInfo = BookService::instance()->getBookModel()->BookInfo($orders['book_id']); $productName = $bookInfo['name'] . '-' . $platformName; } //mp回传 $mpType = $adminConfig['callback_time_mp'] ?? AdminConstants::CALLBACK_TIME_ONCE_24; LogService::info('mppaytype:' . $mpType . ':' . $userInfo['id']); $check = ToutiaoNotifyService::instance()->checkCallbackTime($userInfo['subscribe_time'], $mpType)->data; $sMpChuanKey = CacheConstants::getCallbackLimitMp($orders['user_id']); $sMpChuanKeyOnce = CacheConstants::getCallbackLimitMpOnce($orders['user_id']); if (in_array($mpType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //已经回传过的 if (Redis::instance()->get($sMpChuanKeyOnce)) { Redis::instance()->set($sMpChuanKey, $orders['id'], 86400); } } else { Redis::instance()->del($sMpChuanKey); } LogService::info('订阅活动-是否首充'.$userInfo['is_pay']); SubscripService::instance()->insertOldLog($userInfo); if ($check && !Redis::instance()->get($sMpChuanKey)) { //当天仅回传一次 $guangdtKl = ReportKlService::instance()->getKlConfig($orders['admin_id'], PostbackConstants::TYPE_GUANGDIANTONG, $orders['referral_id'])->data; $ifNotKl = ReportKlService::instance()->checkNotKl($orders['admin_id'], $guangdtKl, $orders['referral_id'], $orders['money'])->data; if ($ifNotKl) { if (in_array($mpType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //首次充值回传写入缓存 Redis::instance()->set($sMpChuanKey, $orders['id'], 86400); } Redis::instance()->set($sMpChuanKeyOnce, $orders['id'], 86400); //微信AD数据源上报 WeChatAdService::instance()->SendWxAdSource($channel_id,['url'=>$url, 'open_id'=>$userInfo['openid'], 'money'=>$orders['money'], 'product_name'=>$productName, 'product_id'=>$orders['book_id'], 'action_type'=>'COMPLETE_ORDER']); WeChatAdService::instance()->SendWxAdSource($channel_id,['url'=>$url, 'open_id'=>$userInfo['openid'], 'money'=>$orders['money'], 'product_name'=>$productName, 'product_id'=>$orders['book_id'], 'action_type'=>'PURCHASE']); // WeChatAdService::instance()->SendWxAdSource($channel_id,$url,$userInfo['openid'], $orders['money'], $productName); // WeChatAdService::instance()->SendWxAdSource($channel_id,$url,$userInfo['openid'], $orders['money'], $productName, 'PURCHASE'); //回传总金额 $orderReportKey = "CORDS:".$channel_id.":".date("Ymd"); Redis::instance()->sAdd($orderReportKey, $orders['out_trade_no']); Redis::instance()->expire($orderReportKey, 86400*7); //Ab号回源 if (!empty($orders['referral_id']) && $business == PayConstants::BUSINESS_WECHAT) { ReferralService::instance()->sendReferralAdData($orders['referral_id'], ['admin_id' => $channel_id, 'url' => $url, 'orders' => ['money' =>$orders['money'], 'productName' => $productName], 'openid' => $userInfo['openid'], 'action_type' => 'COMPLETE_ORDER', 'product_id'=>$orders['book_id']]); ReferralService::instance()->sendReferralAdData($orders['referral_id'], ['admin_id' => $channel_id, 'url' => $url, 'orders' => ['money' =>$orders['money'], 'productName' => $productName], 'openid' => $userInfo['openid'], 'action_type' => 'PURCHASE', 'product_id'=>$orders['book_id']]); } } } //gdt回传 if (isset($adminConfig['gdt_mp_report_state']) && $adminConfig['gdt_mp_report_state'] == 1) { //回传设置走mp的 $mpType = $adminConfig['callback_time_mp'] ?? AdminConstants::CALLBACK_TIME_ONCE_24; LogService::info('mppaytype:' . $mpType . ':' . $userInfo['id']); $check = ToutiaoNotifyService::instance()->checkCallbackTime($userInfo['subscribe_time'], $mpType)->data; $sGdtChuanKey = CacheConstants::getCallbackLimitGdt($orders['user_id']); $sGdtChuanKeyOnce = CacheConstants::getCallbackLimitGdtOnce($orders['user_id']); if (in_array($mpType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //已经回传过的 if (Redis::instance()->get($sGdtChuanKeyOnce)) { Redis::instance()->set($sGdtChuanKey, $orders['id'], 86400); } } else { Redis::instance()->del($sGdtChuanKey); } if ($check && !Redis::instance()->get($sGdtChuanKey)) { //当天仅回传一次 $gdtKl = ReportKlService::instance()->getKlConfig($orders['admin_id'], PostbackConstants::TYPE_GDT, $orders['referral_id'])->data; $ifNotKl = ReportKlService::instance()->checkNotKl($orders['admin_id'], $gdtKl, $orders['referral_id'], $orders['money'])->data; if ($ifNotKl) { if (in_array($mpType, [AdminConstants::CALLBACK_TIME_ONCE_24, AdminConstants::CALLBACK_TIME_ONCE_DAY])) { //首次充值回传写入缓存 Redis::instance()->set($sGdtChuanKey, $orders['id'], 86400); } Redis::instance()->set($sGdtChuanKeyOnce, $orders['id'], 86400); //数据源上报 GdtMpApiService::instance()->completeOrder($adminConfig, ['action_type' => 'COMPLETE_ORDER', 'url' => $url, 'product_name' => $productName, 'money' => $orders['money'], 'appid' => $adminConfig['appid'], 'openid' => $userInfo['openid'], 'product_id'=>$orders['book_id']]); GdtMpApiService::instance()->completeOrder($adminConfig, ['action_type' => 'PURCHASE', 'url' => $url, 'product_name' => $productName, 'money' => $orders['money'], 'appid' => $adminConfig['appid'], 'openid' => $userInfo['openid'], 'product_id'=>$orders['book_id']]); //回传总金额 $orderReportKey = "CORDS:G:".$channel_id.":".date("Ymd"); Redis::instance()->sAdd($orderReportKey, $orders['out_trade_no']); Redis::instance()->expire($orderReportKey, 86400*7); } } } } if ($float_id = Redis::instance()->get(CacheConstants::getFloatTipsOrderId($orders['id']))) { FloatTipsService::instance()->updateFloatOrder($float_id, $orders['user_id'], $orders['money']); } $export = ExportFansService::instance()->checkFansLead($channel_id, $orders['user_id'])->data; if ($export) { $unrechargeKey = CacheConstants::getFansUnrecharge($orders['user_id']); Redis::instance()->del($unrechargeKey); } KuaifenService::instance()->reportOrders($oOrder); } private function _saveUserDot(Orders $orders) { // getUserInfo($orders['user_id'], true) 直接走数据库,缓存哩vip_endtime 不及时 $user_info = model('User')->getUserInfo($orders['user_id'], true); $ip_redis_key = CacheConstants::USER_IP_PREFIX . $orders['user_id']; $ip_arr = json_decode(Redis::instance()->get($ip_redis_key), true, 1024); // region 用户画像打点到Nginx try{ $dotdata = [ 'ctime' => time(), 'uid' => $user_info['id'], 'openid' => $user_info['openid'], 'unionid' => '', 'ip' => $ip_arr['ip'] ?? '', 'country' => $ip_arr['country'] ?? '', 'province' => $ip_arr['province'] ?? '', 'city' => $ip_arr['city'] ?? '', 'pline' => empty(Config::get('site.theme')) ? 'xg' : Config::get('site.theme'), 'agent_id' => $user_info['agent_id'] ?? '', 'chid' => $user_info['channel_id'] ?? '', 'ua' => $ip_arr['ua'], 'cookie' => '', 'type' => 'pay', 'user' => [ 'gender' => $user_info['sex'], 'is_subscribe' => $user_info['is_subscribe'], 'vip_endtime' => $user_info['vip_endtime'], 'subscribe_time' => $user_info['subscribe_time'], 'is_pay' => $user_info['is_pay'], 'referral_id' => $user_info['referral_id'], 'ext' => $user_info['ext'] ? json_decode($user_info['ext'], true) : [], ], 'content' => [ 'order_id' => $orders['id'], // 订单ID 'discount' => $orders['money'],// 订单金额,单位 元 ] ]; curl_user_dot($dotdata); }catch (\Exception $exception){ LogService::error("save_orders:_saveUserDot:".$exception->getMessage()); } // endregion } /** * 书籍计费统计 * @param $channel_id * @param $book_id * @param $recharge_money * @throws \Exception */ private function bookConsumePayCollect($channel_id,$book_id,$recharge_money){ $redis = Redis::instance(); //设置渠道籍列表 $collect_list_key = "BC-CL:".date("Ymd"); $redis->sadd($collect_list_key,$channel_id); $redis->expire($collect_list_key,86400*2); //设置渠道商书籍列表 $collect_channel_book_key = "BC-BL:{$channel_id}:".date("Ymd"); $redis->sadd($collect_channel_book_key,$book_id); $redis->expire($collect_channel_book_key,86400*2); //设置渠道商对应书籍数据 $collect_key = "BC:{$book_id}:{$channel_id}:".date("Ymd"); if($data = json_decode($redis->get($collect_key),true)){ $data['recharge_num'] = intval($data['recharge_num'] ?? 0)+1; $data['recharge_money'] = intval($data['recharge_money'] ?? 0) + intval($recharge_money * 100); $redis->setex($collect_key,86400*2,json_encode($data)); }else{ $data['recharge_num'] = intval($data['recharge_num'] ?? 0)+1; $data['recharge_money'] = intval($data['recharge_money'] ?? 0) + intval($recharge_money * 100); $redis->setex($collect_key,86400*2,json_encode($data)); } } /** * 分账金额 * @param $orderInfo * @return int * @throws \think\exception\DbException */ public function splitMoney($orderInfo) { $splitMoney = 0; if ($orderInfo['deduct']) { return $splitMoney; } if ($orderInfo['payment_method'] == ApiConstants::PAYMENT_METHOD_PALM) { //四分支付 $payInfo = model('Wxpay')->getInfoById($orderInfo['wxpay_id']); if ($payInfo && $payInfo['quartet_is_split'] == ApiConstants::QUARTET_IS_SPLIT) { //开启分账 查找分账订单 $splitRow = PalmpaySplitAccountLog::get(['order_id' => $orderInfo['out_trade_no']]); if ($splitRow && $splitRow['channel_amount']) { $splitMoney = $splitRow['channel_amount']; } } } return $splitMoney; } }