ReportService.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Modules\Report\Services;
  3. use Psr\Http\Message\ResponseInterface;
  4. use App\Cache\User\UserCache;
  5. use App\Modules\User\Services\UserService;
  6. use GuzzleHttp\Client;
  7. class ReportService
  8. {
  9. /**
  10. * 次留回传
  11. * @param $uid
  12. * @return false|mixed
  13. */
  14. public static function reportActive($uid)
  15. {
  16. if (empty($uid)) {
  17. return false;
  18. }
  19. // 获取用户缓存
  20. $now = date('Y-m-d H:i:s');
  21. $userCache = UserCache::getUserInfo($uid);
  22. if (empty($userCache)) {
  23. $user = UserService::getById($uid);
  24. if ($user === null) {
  25. return false;
  26. }
  27. // 初始化缓存
  28. $userCache = [
  29. 'uid' => $uid,
  30. 'channel_id' => getProp($user, 'distribution_channel_id', 0),
  31. 'send_order_id' => getProp($user, 'send_order_id', 0),
  32. 'register_time' => $user->created_at->format('Y-m-d H:i:s'),
  33. 'active_time' => $now
  34. ];
  35. UserCache::setUserInfo($uid, $userCache);
  36. }
  37. // 获取注册时间、活跃时间
  38. $registerAt = getProp($userCache, 'register_time');
  39. $activeAt = getProp($userCache, 'active_time');
  40. $registerYmd = date('Y-m-d', strtotime($registerAt));
  41. $registerNextYmd = date('Y-m-d', strtotime($registerYmd . ' +1 day'));
  42. $activeYmd = date('Y-m-d', strtotime($activeAt));
  43. $todayYmd = date('Y-m-d');
  44. // 判断是否是次留回传
  45. if ($registerYmd === $activeYmd && $todayYmd === $registerNextYmd) {
  46. myLog('reportSActive')->info('', compact('uid', 'registerYmd'));
  47. self::report('/api/reportSActive', [
  48. 'uid' => getProp($userCache, 'uid'),
  49. 'channel_id' => getProp($userCache, 'channel_id'),
  50. 'register_time' => getProp($userCache, 'register_time'),
  51. 'active_time' => getProp($userCache, 'active_time'),
  52. 'platform' => 'zhuishuyun',
  53. ]);
  54. }
  55. // 更新用户活跃时间
  56. return UserCache::setUserInfo($uid, ['active_time' => $now]);
  57. }
  58. /**
  59. * @param $user
  60. * @return ResponseInterface
  61. */
  62. public static function reportRegister($user)
  63. {
  64. return self::report('/api/reportRegister', [
  65. 'platform' => 'zhuishuyun',
  66. 'register' => [
  67. 'uid' => $user->id,
  68. 'channel_id' => $user->channel_id,
  69. 'register_time' => $user->created_at->format('Y-m-d H:i:s'),
  70. 'register_ip' => $user->register_ip,
  71. ]
  72. ]);
  73. }
  74. /**
  75. * @param $order
  76. * @return false|ResponseInterface
  77. */
  78. public static function reportRecharge($order)
  79. {
  80. $channelId = getProp($order, 'distribution_channel_id');
  81. if (empty($channelId)) {
  82. return false;
  83. }
  84. return self::report('/api/reportOrder', [
  85. 'platform' => 'zhuishuyun',
  86. 'order' => [
  87. 'uid' => getProp($order, 'uid'),
  88. 'order_no' => getProp($order, 'trade_no'),
  89. 'price' => getProp($order, 'price'),
  90. 'channel_id' => $channelId,
  91. 'pay_time' => getProp($order, 'pay_end_at'),
  92. 'order_created_at' => $order->created_at->format('Y-m-d H:i:s')
  93. ]
  94. ]);
  95. }
  96. /**
  97. * 上报
  98. * @param $uri
  99. * @param $data
  100. * @return ResponseInterface
  101. */
  102. private static function report($uri, $data)
  103. {
  104. $client = new Client(['timeout' => 3, 'verify' => false]);
  105. // 执行上报
  106. $url = env('REPORT_URI') . $uri;
  107. $result = $client->post($url, [
  108. 'headers' => [
  109. 'x-code' => 'Mvnx1Yr3O8i!TS5u'
  110. ],
  111. 'json' => $data
  112. ]);
  113. $statusCode = $result->getStatusCode();
  114. $contentJson = $result->getBody()->getContents();
  115. $contentArr = json_decode($contentJson, true);
  116. myLog('report')->info($uri, compact('data', 'statusCode', 'contentArr'));
  117. return $contentArr;
  118. }
  119. }