[A-Za-z0-9_-]+)'; $query_args = [ 'order_status' => ['sanitize_callback' => 'sanitize_key'], 'order_type' => ['sanitize_callback' => 'sanitize_key'], 'order_number' => ['sanitize_callback' => 'sanitize_text_field'], 'order_page' => ['sanitize_callback' => 'absint'], ]; register_rest_route($namespace, '/orders/view', [ 'methods' => \WP_REST_Server::READABLE, 'callback' => [$this, 'get_view'], 'permission_callback' => [$this, 'require_logged_in'], 'args' => $query_args, ]); $route_args = [ 'order_number' => [ 'required' => true, 'sanitize_callback' => 'sanitize_text_field', 'validate_callback' => static function ($value): bool { return is_string($value) && (bool) preg_match('/^[A-Za-z0-9_-]+$/', $value); }, ], ]; register_rest_route($namespace, '/orders/' . $order_number . '/pay', [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [$this, 'pay'], 'permission_callback' => [$this, 'require_logged_in'], 'args' => $route_args, ]); register_rest_route($namespace, '/orders/' . $order_number . '/cancel', [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [$this, 'cancel'], 'permission_callback' => [$this, 'require_logged_in'], 'args' => $route_args, ]); register_rest_route($namespace, '/orders/' . $order_number . '/refresh', [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [$this, 'refresh'], 'permission_callback' => [$this, 'require_logged_in'], 'args' => $route_args, ]); register_rest_route($namespace, '/orders/' . $order_number, [ 'methods' => \WP_REST_Server::READABLE, 'callback' => [$this, 'get_order'], 'permission_callback' => [$this, 'require_logged_in'], 'args' => $route_args, ]); } /** @return true|\WP_Error */ public function require_logged_in() { if (!is_user_logged_in()) { return new \WP_Error('aksrt_rest_forbidden', __('请先登录', 'aksrt'), ['status' => 401]); } return true; } public function get_view(\WP_REST_Request $request): \WP_REST_Response { if (!class_exists(UserOrders::class)) { return $this->error(__('订单服务不可用', 'aksrt'), 500); } $view = UserOrders::get_instance()->get_order_center_view(get_current_user_id(), $this->query_args($request)); return $this->success(['data' => $view]); } public function pay(\WP_REST_Request $request): \WP_REST_Response { $params = $request->get_json_params(); $params = is_array($params) ? $params : []; $result = UserOrders::get_instance()->pay_order( get_current_user_id(), sanitize_text_field((string) $request->get_param('order_number')), sanitize_key((string) ($params['payment_method'] ?? '')) ); return !empty($result['success']) ? $this->success(['data' => $result['data'] ?? []]) : $this->error((string) ($result['message'] ?? __('支付失败', 'aksrt')), 400); } public function cancel(\WP_REST_Request $request): \WP_REST_Response { $result = UserOrders::get_instance()->cancel_order( get_current_user_id(), sanitize_text_field((string) $request->get_param('order_number')) ); return !empty($result['success']) ? $this->success(['data' => $result['data'] ?? []]) : $this->error((string) ($result['message'] ?? __('关闭订单失败', 'aksrt')), 400); } public function refresh(\WP_REST_Request $request): \WP_REST_Response { $order = UserOrders::get_instance()->refresh_order( get_current_user_id(), sanitize_text_field((string) $request->get_param('order_number')) ); return $order ? $this->success(['data' => $order]) : $this->error(__('订单不存在', 'aksrt'), 404); } public function get_order(\WP_REST_Request $request): \WP_REST_Response { $order = UserOrders::get_instance()->get_order_detail_view( get_current_user_id(), sanitize_text_field((string) $request->get_param('order_number')) ); return $order ? $this->success(['data' => $order]) : $this->error(__('订单不存在', 'aksrt'), 404); } /** @return array */ private function query_args(\WP_REST_Request $request): array { return [ 'status' => $request->get_param('order_status'), 'type' => $request->get_param('order_type'), 'order_number' => $request->get_param('order_number'), 'page' => $request->get_param('order_page'), ]; } private function success(array $data = [], int $status = 200): \WP_REST_Response { return new \WP_REST_Response(array_merge(['success' => true], $data), $status); } private function error(string $message, int $status = 400): \WP_REST_Response { return new \WP_REST_Response(['success' => false, 'message' => $message], $status); } }