|
@@ -0,0 +1,245 @@
|
|
|
+<?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($user)) {
|
|
|
+ $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')
|
|
|
+ ->where('status', 1)
|
|
|
+ ->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, 'params' => $params]);
|
|
|
+ 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'
|
|
|
+ ];
|
|
|
+}
|