where('order_sn', $orderSn)->first(); if (empty($orderInfo)) { logger('订单不存在', [$orderSn]); return false; } // 获取商户信息 $merchantInfo = MerchantModel::query()->where('uid', $orderInfo->merchant_uid)->first(); if (empty($merchantInfo)) { logger('商户不存在', [$orderSn]); return false; } $sendData = [ 'merchant_code' => $merchantInfo->merchant_code, 'status' => $orderInfo->status == 2 ? 2 : 1, 'order_id' => $orderInfo->merchant_order_sn, 'trade_no' => $orderInfo->order_sn, 'amount' => $orderInfo->order_amount, 'real_amount' => $orderInfo->real_amount, 'product_name' => $orderInfo->product_name, 'notify_url' => $orderInfo->notify_url, 'redirect_url' => $orderInfo->redirect_url, ]; $sendData['signature'] = build_sign($sendData, $merchantInfo->key); $result = app(CommonService::class)->httpPost($sendData, $orderInfo['notify_url']); $upData['callback_sent_times'] = $orderInfo['callback_sent_times'] + 1; $res = false; if ($result === 'SUCCESS') { $upData['notice_status'] = 2; $upData['notice_at'] = date('Y-m-d H:i:s'); $res = true; } else { logger('回调发送失败:' . $result, [$orderSn]); } // 增加回调次数 OrderModel::query()->where('id', $orderInfo['id'])->update($upData); return $res; } /** * 回调订单处理 * * @param array $order * @param $tradeNo * @param $payMoney * @return false */ public function doBuy(array $order, $tradeNo, $payMoney) { try { DB::beginTransaction(); $orderMoney = floatval($order['real_amount']); $payMoney = floatval($payMoney); $minusMoney = floatval($orderMoney - $payMoney); $minusMoney = abs(round($minusMoney, 2)); if ($minusMoney > 2) { logger("只允许订单金额和付款金额相差2元内", $order); DB::rollBack(); return false; } //修改订单状态 $updateData = array( 'real_amount' => $payMoney, 'status' => 2, 'pay_at' => Carbon::now()->toDateTimeString(), 'trade_no' => $tradeNo, ); $orderRes = OrderModel::query()->where('id', $order['id'])->update($updateData); if (!$orderRes) { logger("修改订单状态失败", $order); DB::rollBack(); return false; } // 发送回调 $this->sendSuccessCallback($order['order_sn']); DB::commit(); return true; } catch (\Exception $e) { logger($e->getMessage(), $order); DB::rollBack(); return false; } DB::rollBack(); return false; } }