user; self::$goods = $order->goods; self::$payment = $order->payment; } // 支付成功后处理 public function receivedPayment(): bool { if (self::$payment) {// 是否为余额购买套餐 if (self::$payment->status === 1) {// 已处理 return true; } self::$payment->complete(); // 余额充值 if (self::$order->goods_id === 0 || self::$order->goods_id === null) { return $this->chargeCredit(); } } $goods = self::$order->goods; switch ($goods->type) {// 商品为流量或者套餐 case 1:// 流量包 $this->activatePackage(); break; case 2:// 套餐 if ($this->dactivatePlan()) { // 仅在 dactivatePlan 成功执行后,计算佣金 $this->setCommissionExpense(self::$user); // 返利 } else { Log::warning('【处理订单】出现错误'); } // if (Order::userActivePlan(self::$user->id)->where('id', '<>', self::$order->id)->exists()) {// 判断套餐是否直接激活 // $this->setPrepaidPlan(); // } else { // $this->activatePlan(); // } break; default: Log::warning('【处理订单】出现错误-未知套餐类型'); } return true; } // 余额充值 private function chargeCredit(): bool { $credit = self::$user->credit; $ret = self::$user->updateCredit(self::$order->origin_amount); // 余额变动记录日志 if ($ret) { Helpers::addUserCreditLog(self::$order->user_id, self::$order->id, $credit, self::$user->credit, self::$order->amount, '用户通过'.self::$order->pay_way.'充值余额'); } return $ret; } // 激活流量包 private function activatePackage(): bool { $goodsTraffic = self::$goods->traffic * MB; $flow = false; // 用户的剩余流量 $totalTransfer = self::$user->transfer_enable; $usedTransfer = self::$user->u + self::$user->d; $unusedTraffic = $totalTransfer - $usedTransfer; // 计算剩余流量 Log::info("用户: ".self::$user->email." 当前操作: 加油包激活" ." | 加油包流量: ".flowAutoShow($goodsTraffic) ." | 用户剩余流量: ".flowAutoShow($unusedTraffic) ." | 用户总流量: ".flowAutoShow($totalTransfer) ); // 如果剩余流量为负数,将其设置为0 if ($unusedTraffic < 0) { $unusedTraffic = 0; } // 用户的使用流量超过总流量 if ($unusedTraffic == 0 || $unusedTraffic > $totalTransfer) { $flow = true; Log::info("用户: ".self::$user->email." 购买加油包,流量超限处理" ." | 加油包流量: ".flowAutoShow($goodsTraffic) ." | 用户剩余流量: ".flowAutoShow($unusedTraffic) ." | 用户总流量: ".flowAutoShow($totalTransfer) ); } else { $goodsTraffic += $totalTransfer; } Log::info("用户: ".self::$user->email." 加油包处理完成" ." | 到期时间: ".self::$user->expired_at ." | 更新后流量: ".flowAutoShow($goodsTraffic) ." | 用户总流量: ".flowAutoShow($totalTransfer) ); $updateData = [ 'transfer_enable' => $goodsTraffic, ]; if ($flow) { $updateData['u'] = 0; $updateData['d'] = 0; } $ret = self::$user->update($updateData); // 使用 var_export 导出数组并将其拼接到日志消息中 $exportedData = var_export($updateData, true); if ($ret) { Log::info("用户: ".self::$user->email." 更新成功" ." | 更新前流量: ".flowAutoShow($totalTransfer) ." | 更新后流量: ".flowAutoShow($goodsTraffic) ." | 更新内容: " . $exportedData ); return Helpers::addUserTrafficModifyLog( self::$order->user_id, self::$order->id, self::$user->transfer_enable - self::$goods->traffic * MB, self::$user->transfer_enable, '['.self::$order->pay_way.'] 加上用户购买的套餐流量' ); } else { Log::error("用户: ".self::$user->email." 更新失败" ." | 尝试更新内容: " . $exportedData ); } return false; } // 设置预支付套餐 private function setPrepaidPlan(): bool { self::$order->status = 3; // 3为预支付 $oldData = self::$user->transfer_enable; // 预支付订单, 刷新账号有效时间用于流量重置判断 return self::$order->save() && self::$user->update(['expired_at' => date('Y-m-d H:i:s', strtotime(self::$user->expired_at.' +'.self::$goods->days.' days'))]); } // 激活套餐 private function dactivatePlan(): bool { Order::whereId(self::$order->id)->update(['status'=>2,'expired_at' => date('Y-m-d H:i:s', strtotime('+'.self::$goods->days.' days'))]); $oldData = self::$user->transfer_enable; $expired_at = self::$user->expired_at; //如果用户到期 就用当前时间增加.... if (self::$user->expired_at >= date('Y-m-d H:i:s')){ $expired_at = date('Y-m-d H:i:s', strtotime("$expired_at +".self::$goods->days.' days')); } else { $expired_at = date('Y-m-d H:i:s', strtotime(' +'.self::$goods->days.' days')); } Log::info('购买用户'.self::$user->email.'到期时间'.self::$user->expired_at."修改时间".$expired_at); foreach (Order::userPrepay(self::$order->user_id)->get() as $paidOrder) {//拿出可能存在的其余套餐, 推算最新的到期时间 //取出对应套餐信息 $expired_at = date('Y-m-d H:i:s', strtotime("$expired_at +".$paidOrder->goods->days.' days')); } //账号流量重置日期 $nextResetTime = $expired_at; if ($nextResetTime >= self::$user->expired_at) { $nextResetTime = null; } //用户的 剩余流量 $totalTransfer = self::$user->transfer_enable; $usedTransfer = self::$user->u + self::$user->d; $unusedTraffic = $totalTransfer - $usedTransfer; // 计算剩余流量 // 如果剩余流量为负数,将其设置为0 if ($unusedTraffic < 0) { $unusedTraffic = 0; } $googstraffic = self::$goods->traffic * MB; // 套餐流量加上剩余流量 $countt = $googstraffic + $unusedTraffic; Log::info('用户购买'.self::$user->email.'到期时间'.self::$user->expired_at."流量".flowAutoShow($countt)."剩余流量".flowAutoShow($unusedTraffic)); $updateData = [ 'invite_num' => self::$user->invite_num + (self::$goods->invite_num ?: 0), 'level' => self::$goods->level, 'enable' => 1, 'expired_at' => $expired_at, 'reset_time' => $nextResetTime, 'transfer_enable' => $countt, 'd' => 0, 'u' => 0 ]; // 无端口用户 添加端口 if (self::$user->port === null || self::$user->port === 0) { $updateData['port'] = 0; } $ret = self::$user->update($updateData); //$ret = self::$user->update(array_merge($this->resetTimeAndData(), $updateData)); if ($ret) { return Helpers::addUserTrafficModifyLog( self::$order->user_id, self::$order->id, $oldData, self::$user->transfer_enable, '【'.self::$order->pay_way.'】加上用户购买的套餐流量' ); } return false; } // 计算下次重置与账号过期时间 public function resetTimeAndData($expired_at = null): array { $data = ['u' => 0, 'd' => 0]; // 账号有效期 if (! $expired_at) { $expired_at = date('Y-m-d H:i:s', strtotime('+'.self::$goods->days.' days')); foreach (Order::userPrepay(self::$order->user_id)->get() as $paidOrder) {//拿出可能存在的其余套餐, 推算最新的到期时间 //取出对应套餐信息 $expired_at = date('Y-m-d H:i:s', strtotime("$expired_at +".$paidOrder->goods->days.' days')); } $data['expired_at'] = $expired_at; } //账号流量重置日期 $nextResetTime = date('Y-m-d H:i:s', strtotime('+'.self::$goods->period.' days')); if ($nextResetTime >= $expired_at) { $nextResetTime = null; } return array_merge($data, [ 'transfer_enable' => self::$goods->traffic * MB, 'reset_time' => $nextResetTime, ]); } // 佣金计算 private function setCommissionExpense(User $user): bool { $referralType = sysConfig('referral_type'); if ($referralType && $user->inviter_id) { $inviter = $user->inviter; $referral = ReferralLog::whereInviteeId(self::$order->user_id)->doesntExist(); DB::beginTransaction(); try { if ($referral && sysConfig('is_invite_register')) { $inviter->update(['invite_num' => $inviter->invite_num + 1]); } if ($referralType == 2 || $referral) { $this->addReferralLog( $user->id, $inviter->id, self::$order->id, self::$order->amount, self::$order->amount * sysConfig('referral_percent') ); } DB::commit(); } catch (\Exception $e) { DB::rollBack(); Log::error("Failed to set commission expense", [ 'exception' => $e->getMessage(), 'userid' => $user->id, 'orderId' => self::$order->id ]); return false; } } return true; } /** * 添加返利日志. * * @param int $inviteeId 用户ID * @param int $inviterId 返利对象ID * @param int $oid 订单ID * @param int $amount 发生金额 * @param int $commission 返利金额 * * @return bool */ private function addReferralLog(int $inviteeId, int $inviterId, int $oid, int $amount, int $commission): bool { // $log = new ReferralLog(); // $log->invitee_id = $inviteeId; // $log->inviter_id = $inviterId; // $log->order_id = $oid; // $log->amount = $amount; // $log->commission = $commission; // // return $log->save(); try { $log = new ReferralLog(); $log->invitee_id = $inviteeId; $log->inviter_id = $inviterId; $log->order_id = $oid; $log->amount = $amount; $log->commission = $commission; return $log->save(); } catch (\Exception $e) { // 记录错误日志,包括异常信息和相关数据 Log::error("Failed to add referral log", [ 'exception' => $e->getMessage(), 'userid' => $inviteeId, 'inviterId' => $inviterId, 'orderId' => $oid, 'amount' => $amount, 'commission' => $commission ]); return false; } } // 激活预支付套餐 public function activatePrepaidPlan(): bool { self::$order->update([ 'expired_at' => date('Y-m-d H:i:s', strtotime('+'.self::$goods->days.' days')), 'status' => 2, ]); return $this->activatePlan(); } }