فهرست منبع

Merge branch 'kuaiyingyong' into quickqapp_ylf

fly 4 سال پیش
والد
کامیت
fb8a94583d

+ 4 - 0
app/Cache/CacheKeys.php

@@ -33,6 +33,10 @@ class CacheKeys
         'activity' => [
             'statsPv' => 'Activity:pv:%s:%s',
             'statsUv' => 'Activity:uv:%s:%s',
+        ],
+        'user'     => [
+            'info' => 'User:i:%s',
+            'data' => 'User:d:%s',
         ]
     ];
 }

+ 45 - 0
app/Cache/User/UserCache.php

@@ -0,0 +1,45 @@
+<?php
+
+
+namespace App\Cache\User;
+
+
+use App\Libs\Utils;
+use Illuminate\Support\Facades\Redis;
+
+class UserCache
+{
+    /**
+     * 获取用户信息
+     * @param $uid
+     * @return mixed
+     */
+    public static function getUserInfo($uid)
+    {
+        $cacheKey = Utils::getCacheKey('user.info', [$uid]);
+        return Redis::hgetAll($cacheKey);
+    }
+
+    /**
+     * @param $uid
+     * @param $field
+     * @return mixed
+     */
+    public static function getUserInfoByField($uid, $field)
+    {
+        $cacheKey = Utils::getCacheKey('user.info', [$uid]);
+        return Redis::hmget($cacheKey, $field);
+    }
+
+    /**
+     * 修改用户信息
+     * @param $uid
+     * @param $data
+     * @return mixed
+     */
+    public static function setUserInfo($uid, $data)
+    {
+        $cacheKey = Utils::getCacheKey('user.info', [$uid]);
+        return Redis::hmset($cacheKey, $data);
+    }
+}

+ 7 - 4
app/Http/Middleware/QuickAppGetUserFromToken.php

@@ -4,6 +4,7 @@ namespace App\Http\Middleware;
 
 use App\Cache\Push\PushCache;
 use App\Modules\Push\Services\PushService;
+use App\Modules\Report\Services\ReportService;
 use App\Modules\SendOrder\Services\SendOrderService;
 use App\Modules\User\Services\QappUserService;
 use App\Modules\User\Services\UserService;
@@ -40,13 +41,12 @@ class QuickAppGetUserFromToken extends BaseMiddleware
             $user = $this->auth->authenticate($token);
             if ($sendOrderId) {
                 UserService::setUserSendOrder($user->id, $sendOrderId);
-                try{
-                    SendOrderService::recordUserSendOrder($user->id,$sendOrderId);
-                }catch (\Exception $e){
+                try {
+                    SendOrderService::recordUserSendOrder($user->id, $sendOrderId);
+                } catch (\Exception $e) {
                 }
             }
 
-
             // 设置全局信息
             (new QappUserService)->setGolableUser($user->id, $package);
         } catch (TokenExpiredException $e) {
@@ -68,6 +68,9 @@ class QuickAppGetUserFromToken extends BaseMiddleware
             PushCache::zAddPushUv($pushId, date('Ymd'), $uid);
         }
 
+        // 头条次留回传
+        ReportService::reportActive($uid);
+
         return $next($request);
     }
 }

+ 65 - 0
app/Jobs/QappTikTok/NewQappTikTokUserCharge.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Jobs\QappTikTok;
+
+use App\Consts\SysConsts;
+use GuzzleHttp\Client;
+use Illuminate\Bus\Queueable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+
+/**
+ * 抖音用户充值
+ */
+class NewQappTikTokUserCharge implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    private $reportParams;
+
+    protected $url = 'https://newtrackapi.zhuishuyun.com/api/qappuser/new_charge';
+
+    /**
+     * QappTikTokUserCharge constructor.
+     * @param QappTikTokUserChargeRequest $reportParams
+     */
+    public function __construct(QappTikTokUserChargeRequest $reportParams)
+    {
+        $this->reportParams = $reportParams;
+    }
+
+    /**
+     * Execute the job.
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function handle()
+    {
+        $client = new Client();
+        $params = [
+            'uid'         => (int)$this->reportParams->uid,
+            'amount'      => (float)$this->reportParams->amount,
+            'pay_time'    => (string)$this->reportParams->pay_time,
+            'order_no'     => (string)$this->reportParams->order_no,
+            'book_id'     => (string)$this->reportParams->book_id,
+            'book_name'   => (string)$this->reportParams->book_name,
+            'source'      => 'zsy',
+        ];
+
+        // 避免签名错误
+        if ($this->reportParams->send_order_id) {
+            $params['send_order_id'] = $this->reportParams->send_order_id;
+        }
+
+        $params['sign'] = _sign($params, SysConsts::TIKTOK_KEY);
+        $response       = $client->request('post', $this->url, ['form_params' => $params])->getBody()->getContents();
+        myLog('qapp_user_charge')->info($response);
+        $result = json_decode($response);
+        if ($result) {
+            if ($result->code != 0) {
+                myLog('qapp_user_charge')->info($response);
+            }
+        }
+    }
+}

+ 6 - 2
app/Jobs/QappTikTok/QappTikTokUserChargeRequest.php

@@ -15,6 +15,11 @@ class QappTikTokUserChargeRequest
     // 支付时间
     public $pay_time;
 
+    /**
+     * 订单号
+     */
+    public $order_no;
+
     // 上报类型
     public $type;
 
@@ -38,5 +43,4 @@ class QappTikTokUserChargeRequest
 
     // 分母
     public $denominator = 100;
-
-}
+}

+ 86 - 0
app/Modules/Report/Services/ReportService.php

@@ -0,0 +1,86 @@
+<?php
+
+
+namespace App\Modules\Report\Services;
+
+
+use Psr\Http\Message\ResponseInterface;
+use App\Cache\User\UserCache;
+use App\Modules\User\Services\UserService;
+use GuzzleHttp\Client;
+
+class ReportService
+{
+    /**
+     * 次留回传
+     * @param $uid
+     * @return false|mixed
+     */
+    public static function reportActive($uid)
+    {
+        if (empty($uid)) {
+            return false;
+        }
+
+        // 获取用户缓存
+        $now       = date('Y-m-d H:i:s');
+        $userCache = UserCache::getUserInfo($uid);
+        if (empty($userCache)) {
+            $user = UserService::getById($uid);
+            if ($user === null) {
+                return false;
+            }
+
+            // 初始化缓存
+            $userCache = [
+                'uid'           => $uid,
+                'channel_id'    => getProp($user, 'distribution_channel_id', 0),
+                'send_order_id' => getProp($user, 'send_order_id', 0),
+                'register_time' => $user->created_at->format('Y-m-d H:i:s'),
+                'active_time'   => $now
+            ];
+            UserCache::setUserInfo($uid, $userCache);
+        }
+
+        // 获取注册时间、活跃时间
+        $registerAt      = getProp($userCache, 'register_time');
+        $activeAt        = getProp($userCache, 'active_time');
+        $registerYmd     = date('Y-m-d', strtotime($registerAt));
+        $registerNextYmd = date('Y-m-d', strtotime($registerYmd . ' +1 day'));
+        $activeYmd       = date('Y-m-d', strtotime($activeAt));
+        $todayYmd        = date('Y-m-d');
+
+        // 判断是否是次留回传
+        if ($registerYmd === $activeYmd && $todayYmd === $registerNextYmd) {
+            myLog('reportSActive')->info('', compact('uid', 'registerYmd'));
+            self::report($userCache);
+        }
+
+        // 更新用户活跃时间
+        return UserCache::setUserInfo($uid, ['active_time' => $now]);
+    }
+
+    /**
+     * 上报
+     * @param $userCache
+     * @return ResponseInterface
+     */
+    private static function report($userCache)
+    {
+        $client = new Client(['timeout' => 3, 'verify' => false]);
+
+        // 执行上报
+        return $client->post(env('REPORT_URI') . '/api/reportSActive', [
+            'headers' => [
+                'x-code' => 'Mvnx1Yr3O8i!TS5u'
+            ],
+            'json'    => [
+                'uid'           => getProp($userCache, 'uid'),
+                'channel_id'    => getProp($userCache, 'channel_id'),
+                'register_time' => getProp($userCache, 'register_time'),
+                'active_time'   => getProp($userCache, 'active_time'),
+                'platform'      => 'zhuishuyun',
+            ]
+        ]);
+    }
+}

+ 3 - 9
app/Modules/Trade/Pay/PaySuccessAbstract.php

@@ -2,6 +2,7 @@
 
 namespace App\Modules\Trade\Pay;
 
+use App\Jobs\QappTikTok\NewQappTikTokUserCharge;
 use App\Jobs\QappTikTok\QappTikTokUserChargeRequest;
 use App\Jobs\QappTikTok\QappTikTokUserCharge;
 use App\Modules\Book\Models\BookConfig;
@@ -99,22 +100,15 @@ abstract class PaySuccessAbstract
         $tikTokChargeRequest                = new QappTikTokUserChargeRequest();
         $tikTokChargeRequest->uid           = $this->order->uid;
         $tikTokChargeRequest->amount        = $this->order->price;
+        $tikTokChargeRequest->order_no        = $this->order->trade_no;
         $tikTokChargeRequest->pay_time      = $this->order->created_at;
-        $tikTokChargeRequest->type          = $reportType ?: $this->getReportType($this->order->distribution_channel_id);
         $tikTokChargeRequest->book_id       = $book_id;
         $tikTokChargeRequest->book_name     = $book_name;
         $tikTokChargeRequest->send_order_id = $sendOrderId;
-        $tikTokChargeRequest->molecule      = $reportRate;
-
-        // 求最大公约数、格式化比例值
-        $molecule    = $reportRate;
-        $denominator = $tikTokChargeRequest->denominator;
-        $gcd         = gcd($molecule, $denominator);
-        [$tikTokChargeRequest->molecule, $tikTokChargeRequest->denominator] = proportion($molecule, $denominator, $gcd);
 
         // 需要跟派单设置的回传类型一致才上报
         myLog('qapp_user_charge')->info('addQueue', compact('tikTokChargeRequest'));
-        $job = new QappTikTokUserCharge($tikTokChargeRequest);
+        $job = new NewQappTikTokUserCharge($tikTokChargeRequest);
         dispatch($job->onConnection('rabbitmq')->onQueue('qapp_tiktok_user_charge_queue'));
     }
 }