orderId = $orderId; $this->state = $state; } /** * Execute the job. */ public function handle(OutService $outService): void { $order = Order::find($this->orderId); if (!$order) { return; } if (!$order->notify_url) { return; } $mchApp = MchApp::query() ->where('mch_no', $order->mch_no) ->where('app_id', $order->app_id) ->first(); if (!$mchApp) { return; } $params = [ 'mchNo' => $order->mch_no, 'appId' => $order->app_id, 'mchOrderNo' => $order->mch_order_no, 'transferId' => $order->transfer_id, 'amount' => (string) $order->amount, 'currency' => $order->currency, 'ifCode' => $order->if_code, 'entryType' => $order->entry_type, 'state' => (string) $this->state, 'accountNo' => $order->account_no, 'accountName' => $order->account_name, 'bankName' => $order->bank_name, 'transferDesc' => $order->transfer_desc, 'channelOrderNo' => $order->channel_order_no, 'errCode' => $order->errCode, 'errMsg' => $order->errMsg, 'extraParam' => $order->ext_param, 'createdAt' => $order->created_at->format('Uv'), ]; if ($this->state == 2) { $params['success_time'] = $order->success_time->format('Uv'); } $params['sign'] = $outService->makeSign($params, $mchApp->secret_key); $notify = new OrderNotify(); $notify->order_id = $this->orderId; $notify->state = $this->state; $notify->push_time = now(); $notify->push_body = http_build_query($params); $notify->save(); try { $options = [ 'allow_redirects' => false, 'timeout' => 10, ]; $response = Http::withOptions($options) ->withBody($notify->push_body, 'application/x-www-form-urlencoded') ->post($order->notify_url); $notify->response_code = $response->status(); $notify->response_body = Str::limit($response->body(), 2000); } catch (Throwable) { $notify->response_code = 0; $notify->response_body = ''; } $notify->response_time = now(); $notify->push_duration = round($notify->push_time->diffInSeconds($notify->response_time) * 1000); $notify->save(); if ($notify->response_body !== 'success') { $this->customRelease(); } } private function customRelease(): void { // 下一次尝试的时间间隔 $delayList = [ 1 => 60 * 2, 2 => 60 * 10, 3 => 60 * 10, 4 => 3600, 5 => 3600 * 2, 6 => 3600 * 6, 7 => 3600 * 15, ]; $currentAttempt = $this->attempts(); $this->release($delayList[$currentAttempt]); } }