getUserId(); $order = DatabaseRoute::getDb('orders', $userId)->where([ 'orders_id' => $orderId ])->find(); if (!$order) { $this->error('订单不存在'); } $detail = DatabaseRoute::getDb('pay_details', $userId)->where([ 'order_id' => $order['orders_no'] ])->find(); if (!$detail) { $this->error('订单不存在2'); } $this->successWithData($detail['state'] == 1 ? 1 : 0); } public function payOrder() { $get = $this->request->route->param(); $params = $this->request->get(); $params = [ 'payType' => $params['payType'], 'orderId' => $params['orderId'] ]; (new WuyouValidate())->scene('payOrder')->check($params); $userId = $this->getUserId(); debounce('payOrder' . $params['orderId']); Log::info(format('生成商品订单信息接口入参为: {}', $params)); $order = DatabaseRoute::getDb('orders', $userId)->where([ 'orders_id' => $params['orderId'], 'user_id' => $userId ])->find(); if (!$order) { throw new SysException("订单不存在"); } if ($order['status'] != 0) { throw new SysException("订单已支付"); } if (RedisUtils::setCreateOrderFlagAndCheckLimit($userId, $params['orderId'])) { (new TbUserBlacklist())->addBlackUser($userId, '一分钟频繁下单超22次'); } $orderDetail = DatabaseRoute::getDb('pay_details', $userId)->where([ 'order_id' => $params['orderId'] ])->find(); if ($orderDetail) { DatabaseRoute::getDb('pay_details', $userId, true)->where([ 'order_id' => $params['orderId'] ])->update([ 'trade_no' => $orderDetail['trade_no'] ]); } else { $orderDetail = [ 'id' => Random::generateRandomPrefixedId(19), 'state' => 0, 'create_time' => date('Y-m-d H:i:s'), 'order_id' => $order['orders_no'], 'user_id' => $order['user_id'], 'money' => (float)$order['pay_money'], 'type' => 1, 'classify' => 9, 'trade_no' => uuid(), ]; DatabaseRoute::getDb('pay_details', $userId, true)->insert($orderDetail); } if (bccomp($order['pay_money'], '0', 2) === 0) { // ordersTask.updateOrderStatus(payDetails, order); $this->successWithData([ 'tradeNo' => $orderDetail['trade_no'], 'payStatus' => 1 ]); } $result = WuYouPayUtils::payOrder($orderDetail['trade_no'], $userId, $order['pay_money'], request()->header('user-agent'), // $result = WuYouPayUtils::payOrderTest($orderDetail['trade_no'], $userId, $order['pay_money'], request()->header('user-agent'), format("{}-{}", $order['course_id'], $order['course_details_id']), $params['payType']); // $result = [ // 'code' => 200, // ]; if (!$result) { DatabaseRoute::getDb('orders', $userId, true)->where([ 'orders_id' => $params['orderId'], 'user_id' => $userId ])->update([ 'status' => 3 ]); DatabaseRoute::getDb('pay_details', $userId, true)->where([ 'id' => $orderDetail['id'], 'user_id' => $userId ])->update([ 'status' => 2 ]); throw new SysException("系统繁忙,请稍后再尝试购买"); } if (!isset($result['code']) || $result['code'] !== '200') { throw new SysException($result['msg'] ?? $result['error_msg']); } $result['data']['orderId'] = $params['orderId']; $result['data']['h5Url'] = $result['data']['h5_url']; $this->successWithData($result['data']); } public function extractNotify() { $params = $this->request->post(); Log::info("无忧支付提现回调,入参: " . json_encode($params)); $signData = [ 'callbacks' => $params['callbacks'], 'total' => $params['total'], 'out_trade_no' => $params['out_trade_no'], "status" => $params['status'] ]; $sign = WuYouPayUtils::getParamsSign($signData); if ($sign != $params['sign']) { Log::info("无忧支付回调,验签失败, 签名结果: {$sign}"); // return 'success'; } $split = explode("-", $params['out_trade_no']); if (count($split) != 2) { Log::info("无忧支付回调,订单号分割错误"); return 'success'; } $orderNo = $split[0]; $userId = $split[1]; $cashOut = DatabaseRoute::getAllDbData('cash_out', function ($query) use ($orderNo, $userId) { $query->where([ 'order_number' => $orderNo ]); if ($userId) { $query->where([ 'user_id' => $userId ]); } return $query; })->where([ 'order_number' => $orderNo ])->find(); if ($cashOut) { \app\admin\model\Order::executeExtractCallback($cashOut, $params); }else{ $info = DatabaseRoute::getDb('user_info', $userId)->find(); DatabaseRoute::getDb('cash_out', $userId, true)->insert([ 'user_id' => $userId, 'order_number' => $orderNo, 'money' => $params['total'], 'relation_id' => $params['msg'], 'state' => 9, 'zhifubao_name' => $info ? $info['cert_name'] : '', ]); } return "success"; } /** * 无忧支付回调 */ public function notify() { try { $params = $this->request->post(); // $params = json_decode('{"callbacks": "CODE_SUCCESS","order_sn": "test001","out_trade_no": "bcf60b80e805480984a9956088e74225-357901754385306920","pay_time": "1751584904","sign": "495D873175D4A7762B3B7162DA6C9F35","total": 1.50}', true); Log::info("无忧支付回调,入参: " . json_encode($params)); $signData = [ 'callbacks' => $params['callbacks'], 'total' => $params['total'], 'out_trade_no' => $params['out_trade_no'], 'pay_time' => $params['pay_time'], ]; $sign = WuYouPayUtils::getParamsSign($signData); if ($sign != $params['sign']) { Log::info("无忧支付回调,验签失败, 签名结果: {$sign}"); // return 'success'; } if ($params['callbacks'] != 'CODE_SUCCESS') { Log::info("无忧支付回调,支付失败"); return 'success'; } $split = explode("-", $params['out_trade_no']); if (count($split) != 2) { Log::info("无忧支付回调,订单号分割错误"); return 'success'; } $orderNo = $split[0]; $userId = $split[1]; $payDetails = DatabaseRoute::getDb('pay_details', $userId)->where([ 'trade_no' => $orderNo, 'user_id' => $userId ])->select(); if (count($payDetails) == 0) { Log::info("无忧支付回调,订单不存在"); return 'success'; } if (count($payDetails) > 1) { Log::info("无忧支付回调,订单存在多个"); return 'success'; } $payDetail = $payDetails[0]; if ($payDetail['state'] == 1) { Log::info("无忧支付回调,重复回调"); return 'success'; } $order = DatabaseRoute::getDb('orders', $userId)->where([ 'orders_no' => $payDetail['order_id'], 'user_id' => $userId ])->limit(1)->find(); if (!$order) { Log::info("无忧支付回调,订单不存在"); return '订单不存在'; } if ($order['status'] != 0) { Log::info("无忧支付回调,订单已支付"); return '订单已支付'; } $payDetail['third_order_no'] = $params['order_sn']; Orders::updateOrderStatus($payDetail, $order, $userId); }catch (Throwable $e) { Log::info("异常".$e->getMessage()); throw $e; } return "success"; } public function test() { $data = DatabaseRoute::getAllDbData('tb_user', function ($query) { return $query->where([ 'user_id' => 14256 ]); })->find(); $this->successWithData($data); } }