liuzejian 2 роки тому
батько
коміт
f72ec8eac9

+ 37 - 35
src/Services/LandingPage/ChargeFeedBack/QappRereport.php

@@ -8,6 +8,7 @@ use General\Models\Report\ReportUserChargeRecord;
 use General\Models\User\User;
 use General\Services\LandingPage\Report;
 use General\Services\Report\BaseReport;
+use General\Services\Report\QappTxadqNewReport;
 
 /**
  * qapp付费重传
@@ -40,43 +41,44 @@ class QappRereport extends Rereport
     {
         $report_user = ReportUserBindRecord::find($bind_id);
         if ($report_user) {
-            $instance = $this->reportInstance($report_user->platform);
+            /**
+             * 腾讯adq新版特殊对待一下
+             */
+            if($report_user->platform == 'tx_adq_new') {
+                $result = QappTxadqNewReport::reportCharge($report_user, $order_no, $amount);
+                ReportUserChargeRecord::updateOrCreate(
+                    [
+                        'order_no' => $order_no,
+                    ],
+                    [
+                        'uid' => $report_user->uid,
+                        'status' => $result['result'],
+                        'content' => $result['result'] ? '手动回传' : $result['content'],
+                    ]
+                );
+            } else {
+                $instance = $this->reportInstance($report_user->platform);
+                $result =  $instance->reportCharge($report_user, $amount);
+                $charge = ReportUserChargeRecord::updateOrCreate(
+                    [
+                        'order_no' => $order_no,
+                    ],
+                    [
+                        'uid' => $report_user->uid,
+                        'status' => $result['result'],
+                        'content' => $result['result'] ? '手动回传' : $result['content'],
+                    ]
+                );
+                \Log::info('start_addReportCount:'.json_encode($report_user));
+                $report_info = $this->addReportCount($report_user);
+                \Log::info('end_addReportCount:'.json_encode($report_info));
 
-//            try {
-//                switch($report_user->platform)
-//                {
-//                    case 'uchc':
-//                        //加卓回传
-//                        $res = $instance->reportAddDesk($report_user);
-//                        \Log::info('add_desk_report_result:'.json_encode($res));
-//                        break;
-//                    default:
-//                        break;
-//                }
-//
-//            } catch (\Exception $e) {
-//                \Log::info('add_desk_report_result_error:'.$e);
-//            }
-
-            $result =  $instance->reportCharge($report_user, $amount);
-            $charge = ReportUserChargeRecord::updateOrCreate(
-                [
-                    'order_no' => $order_no,
-                ],
-                [
-                    'uid' => $report_user->uid,
-                    'status' => $result['result'],
-                    'content' => $result['result'] ? '手动回传' : $result['content'],
-                ]
-            );
-            \Log::info('start_addReportCount:'.json_encode($report_user));
-            $report_info = $this->addReportCount($report_user);
-            \Log::info('end_addReportCount:'.json_encode($report_info));
-
-            if ($report_info && isset($report_info['data']['percent'])) {
-                $charge->report_percent = $report_info['data']['percent'];
-                $charge->save();
+                if ($report_info && isset($report_info['data']['percent'])) {
+                    $charge->report_percent = $report_info['data']['percent'];
+                    $charge->save();
+                }
             }
+
         }
     }
 }

+ 244 - 0
src/Services/Report/QappTxadqNewReport.php

@@ -0,0 +1,244 @@
+<?php
+
+
+namespace General\Services\Report;
+
+
+use App\Models\DouyinUserCharge;
+use General\Models\Order\Order;
+use General\Models\Qapp\QappSendOrders;
+use General\Models\Report\ReportUserBindRecord;
+use General\Models\Report\ReportUserChargeRecord;
+use GuzzleHttp\Client;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 补传tx_adq_new 的充值
+ * - 补传的充值要符合派单的回传类型
+ * - 如果不符合派单回传类型的,看该用户以前是不是回传过complete_order,如果回传过,就补传purchase
+ * Class QappTxadqNewReport
+ * @package General\Services\Report
+ */
+class QappTxadqNewReport
+{
+    /**
+     * 充值补传
+     * @param ReportUserBindRecord $user
+     * @param string $orderNo
+     * @param float $amount
+     * @return array
+     */
+    public static function reportCharge(ReportUserBindRecord $user, string $orderNo, float $amount)
+    {
+        $order = Order::where('trade_no', $orderNo)
+            ->select('pay_type', 'pay_end_at', 'from_bid', 'send_order_id')
+            ->first();
+        $payTimeStamp = strtotime($order->pay_end_at);
+
+        $bookInfo = DB::table('book_configs')->where('bid', $order->from_bid)
+            ->select('bid', 'book_name')
+            ->first();
+
+        $completeOrderType = self::getReportCompleteOrderType($user, $order);
+        $resultCompleteOrder = false;
+        $resultPurchase = false;
+        // 回传complete_order
+        if($completeOrderType) {
+            $requestParams = [
+                "action_time" => $payTimeStamp,
+                "action_type" => 'COMPLETE_ORDER',
+                "action_param" => [
+                    "value" => $amount * 100,
+                    "product_id" => $order->from_bid,
+                    "product_name" => ($bookInfo->book_name ?? '') . '-追书云-快应用',
+                    "object" => $completeOrderType,
+                ],
+
+            ];
+            $resultCompleteOrder = self::reportInfo($requestParams, $user->link);
+
+            if(!$resultCompleteOrder) {
+                \Log::info('tx_adq_new:补传:'.$orderNo.',回传complete_order失败, 回传参数为:',
+                    ['requestParams' => $requestParams, 'link' => $user->link]);
+                return [
+                    'result' => false,
+                    'content' => '回传complete_order失败',
+                ];
+            }
+        }
+
+        if($completeOrderType || self::hasReportedCompleteOrder()) {
+            $requestParams = [
+                "action_time" => $payTimeStamp,
+                "action_type" => 'PURCHASE',
+                "action_param" => [
+                    "value" => $amount * 100,
+                    "product_id" => $order->from_bid,
+                    "product_name" => ($bookInfo->book_name ?? '') . '-追书云-快应用',
+                    "object" => '1'
+                ],
+            ];
+            $resultPurchase = self::reportInfo($requestParams, $user->link);
+            if(!$resultPurchase) {
+                \Log::info('tx_adq_new:补传:'.$orderNo .',回传purchase失败, 回传参数为:',
+                    ['requestParams' => $requestParams, 'link' => $user->link]);
+                return [
+                    'result' => false,
+                    'content' => '回传purcahse失败',
+                ];
+            }
+        }
+
+        $result = $resultCompleteOrder  || $resultPurchase ;
+        if($result) {
+            return [
+                'result' => true,
+                'content' => '手动回传',
+            ];
+        } else {
+            return [
+                'result' => false,
+                'content' => '不符合回传条件',
+            ];
+        }
+
+    }
+
+
+    /**
+     * 判断用户以前是不是回传过complete_order
+     * @param $user
+     * @return mixed
+     */
+    private static function hasReportedCompleteOrder($user) {
+       return ReportUserChargeRecord::where('uid', $user->uid)
+            ->where('type', 'tx_adq_new_complete_order')
+            ->exists();
+    }
+
+    /**
+     * 回传给腾讯服务器
+     * @param $params 请求参数
+     * @param $postUrl 请求地址
+     */
+    private static function reportInfo($params, $postUrl) {
+
+        $result = false;
+        $content = '';
+        try {
+            $httpClient = new Client(['timeout' => 4]);
+            $httpResponse = $httpClient->post($postUrl, [
+                'json' => [
+                    'actions' => [$params]
+                ],
+            ]);
+            $result = ($httpResponse->getStatusCode() == 200);
+            $content = $httpResponse->getBody()->getContents();
+            $resultCode = (\json_decode($content, true))['code'] ?? -1;
+            $result = $result && (0 == $resultCode);
+        } catch (\Exception $exception) {
+            \Log::info('第一次回传给腾讯服务器数据时出错:' . $exception->getMessage());
+            try {
+                $httpClient = new Client(['timeout' => 4]);
+                $httpResponse = $httpClient->post($postUrl, [
+                    'json' => [
+                        'actions' => [$params]
+                    ],
+                ]);
+                $result = ($httpResponse->getStatusCode() == 200);
+                $content = $httpResponse->getBody()->getContents();
+                $resultCode = (\json_decode($content, true))['code'] ?? -1;
+                $result = $result && (0 == $resultCode);
+            }catch (\Exception $exception) {
+                \Log::info('第二次重试回传给腾讯服务器数据时出错:' . $exception->getMessage());
+                $result = false;
+                $content = $exception->getMessage();
+            }
+        }
+        \Log::info('tx_adq_new:补传:'.$postUrl. ',请求微信上游返回:', ['result' => $result, 'content' => $content]);
+        return $result;
+
+    }
+
+    /**
+     * 获取complete_order的回传口径的值, 如果没有获取到时,就是 ''
+     * @see TX_ADQ_COMPLETE_ORDER_MAP
+     * @param ReportUserBindRecord $user
+     * @param $order
+     * @return string
+     * <pre>
+     * 'all'=>'read_0',
+     * 'one_day_first_pay'=>'read_1',
+     * 'one_day_all_pay'=>'read_2',
+     * 'current_day_register_first_pay'=>'read_3',
+     * 'current_day_register'=>'read_4',
+     * 'three_day_first_pay'=>'read_5',
+     * 'three_day_all_pay'=>'read_6'
+     * </pre>
+     */
+    private static function getReportCompleteOrderType(ReportUserBindRecord $user,  Order $order) {
+        $completeOrderType = '';
+
+        $isFirstRecharge = $order->pay_type == 1;
+        if($order->send_order_id) {
+            $reportType = QappSendOrders::where('send_order_id', $order->send_order_id)->value('report_type');
+            if(self::isReport($isFirstRecharge, $order->pay_end_at, $user->created_at, $reportType)) {
+                $completeOrderType =  self::TX_ADQ_COMPLETE_ORDER_MAP[$reportType] ?? '';
+            }
+        }
+
+        return $completeOrderType;
+    }
+
+    /**
+     * 判断订单是不是满足派单的回传类型
+     * @param $isFirstTimeRecharge 用户是不是首充
+     * @param $payTime    订单支付时间
+     * @param $registerTime   用户注册时间
+     * @param $reportType     派单回传类型
+     * @return bool
+     */
+    public static function isReport($isFirstTimeRecharge, $payTime, $registerTime, $reportType) {
+        //上报全部
+        if ($reportType == 'all') return true;
+        //当日注册当日充值
+        if ($reportType == 'current_day_register') {
+            if (date('Y-m-d', strtotime($payTime)) == date('Y-m-d', strtotime($registerTime))) {
+                return true;
+            }
+        }
+
+        //24小时全部订单
+        if ($reportType == 'one_day_all_pay') {
+            if ((strtotime($payTime) - strtotime($registerTime)) <= 86400) {
+                return true;
+            }
+        }
+
+        //当日注册首充订单
+        if ($reportType == 'current_day_register_first_pay') {
+            if ($isFirstTimeRecharge &&
+                (date('Y-m-d', strtotime($payTime)) == date('Y-m-d', strtotime($registerTime)))) {
+                return true;
+            }
+        }
+        //24小时的首充
+        if ($reportType == 'one_day_first_pay') {
+            if ($isFirstTimeRecharge && (strtotime($payTime) - strtotime($registerTime)) <= 86400) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    const TX_ADQ_COMPLETE_ORDER_MAP = [
+        'all'=>'read_0',
+        'one_day_first_pay'=>'read_1',
+        'one_day_all_pay'=>'read_2',
+        'current_day_register_first_pay'=>'read_3',
+        'current_day_register'=>'read_4',
+        'three_day_first_pay'=>'read_5',
+        'three_day_all_pay'=>'read_6'
+    ];
+}