跳至内容
ShopentlyLearn

获取 — 退货、投诉与换货

读取“退货、投诉与换货”的数据。结果取决于此操作的参数。

GET/api/v1/requests/{request_id}

身份验证
Bearer
最低套餐
BASIC
所需权限
returns.request:read

代码示例

请求示例

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request GET \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/requests/example

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/requests/example');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'GET', base_url + '/api/v1/requests/example', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

响应示例 200

JSON
{
  "data": {
    "created_at": "2026-01-01T12:00:00Z",
    "customer": {
      "email": "customer@example.invalid",
      "name": "Example"
    },
    "id": "example",
    "items": [
      {
        "id": "example",
        "name": "Example",
        "order_line_id": "example",
        "product_id": "example",
        "quantity": 1,
        "returned_quantity": 1,
        "sku": "example",
        "total": {
          "amount": "0.00",
          "currency": "PLN",
          "minor_units": 2
        },
        "unit_price": {
          "amount": "0.00",
          "currency": "PLN",
          "minor_units": 2
        },
        "variant_id": "example",
        "variant_options": [
          {
            "name": "Example",
            "value": "example"
          }
        ]
      }
    ],
    "number": "example",
    "order_id": "example",
    "order_number": "example",
    "products_value": {
      "amount": "0.00",
      "currency": "PLN",
      "minor_units": 2
    },
    "refund": {
      "amount": {
        "amount": "0.00",
        "currency": "PLN",
        "minor_units": 2
      },
      "completed_at": null,
      "status": "pending",
      "updated_at": "2026-01-01T12:00:00Z",
      "version": 1
    },
    "resolution_state": "unknown",
    "status": {
      "id": "example",
      "locale": "en",
      "name": "Example"
    },
    "type": "return",
    "updated_at": "2026-01-01T12:00:00Z",
    "version": 1
  },
  "meta": {
    "request_id": "example"
  }
}

工作原理

  • 通过集合和详情端点获取申请编号与类型、相关订单、申请商品、客户详情及退款数据。
  • 有效类型为 return、exchange 和 complaint。
  • 从 /api/v1/request-statuses 获取状态标识符。
  • 状态和退款金额是分别进行版本检查的写入操作。
  • 修改记录的退款金额只更新申请记录,不会执行资金转账。

参数

路径参数

request_id字符串必填

申请标识符;在响应元数据中表示 HTTP 请求标识符。

约束
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
示例: "example"

此操作不接受 JSON 请求体。

响应

响应 200

dataRequestDetailData 必填

成功响应的数据。

字段 · data
created_at字符串必填

创建时间。

format: "date-time"
customerRequestCustomerData 必填

此资源记录的客户信息。

字段 · customer
email字符串必填

电子邮箱地址。

name字符串必填

对应上下文中的资源名称。

id字符串必填

资源标识符;请保留返回的原值。

items数组 <RequestItemData > 必填

资源中包含的项目。

字段 · items
number字符串必填

面向用户的订单号或申请编号。

order_id字符串必填

相关订单标识符。

order_number字符串必填

相关订单号。

products_valueMoneyData 必填

订单中产品的总价值。

字段 · products_value
amount字符串必填

以 JSON 字符串编码的十进制金额;仅在允许时使用 null。

currency字符串必填

金额的币种代码。

约束
pattern
"^[A-Z]{3}$"
minor_units整数必填

币种使用的小数位数。

minimum: 0maximum: 4
refundRefundData 必填

记录的退款信息。

字段 · refund
amountMoneyData null必填

以 JSON 字符串编码的十进制金额;仅在允许时使用 null。

completed_at字符串 null必填

完成时间。

字符串:format: "date-time"
status字符串必填

此操作接受的状态。

约束
enum
["pending", "completed"]
updated_at字符串 null必填

最近更新时间。

字符串:format: "date-time"
version整数必填

用于并发控制的资源版本。

resolution_state字符串必填

客户申请的处理状态。

约束
enum
["unknown", "open", "completed", "rejected", "cancelled"]
statusRequestStatusData 必填

此操作接受的状态。

字段 · status
id字符串必填

资源标识符;请保留返回的原值。

locale字符串必填

本次请求选择的语言。

name字符串 null必填

对应上下文中的资源名称。

typeRequestType 必填

资源类型。

updated_at字符串必填

最近更新时间。

format: "date-time"
version整数必填

用于并发控制的资源版本。

metaContextPageMeta ContextMeta PageMeta RequestMeta 必填

响应元数据。

字段 · meta

ContextPageMeta

locale字符串必填

本次请求选择的语言。

market_code字符串必填

上下文端点返回的市场代码。

market_id字符串必填

上下文端点返回的市场标识符。

paginationPagination 必填

游标分页元数据。

request_id字符串必填

申请标识符;在响应元数据中表示 HTTP 请求标识符。

minLength: 1maxLength: 100

ContextMeta

locale字符串必填

本次请求选择的语言。

market_code字符串必填

上下文端点返回的市场代码。

market_id字符串必填

上下文端点返回的市场标识符。

request_id字符串必填

申请标识符;在响应元数据中表示 HTTP 请求标识符。

minLength: 1maxLength: 100

PageMeta

paginationPagination 必填

游标分页元数据。

request_id字符串必填

申请标识符;在响应元数据中表示 HTTP 请求标识符。

minLength: 1maxLength: 100

RequestMeta

request_id字符串必填

申请标识符;在响应元数据中表示 HTTP 请求标识符。

minLength: 1maxLength: 100
响应示例

HTTP 状态

200
请求成功 架构
400
无效请求
401
需要身份验证
403
权限不足
404
未找到资源
409
版本冲突
422
验证失败
429
超出请求限制
其他 HTTP 状态 (7)
405
不允许的方法
413
请求过大
415
不支持的格式
500
服务器错误
502
API 网关错误
503
服务不可用
504
网关超时

错误目录: ErrorResponse

请求头与响应头

401

WWW-Authenticate字符串可选

服务器要求的身份验证方案。

405

Allow字符串可选

此资源支持的 HTTP 方法。

429, 503

Retry-After整数可选

重试前最少等待的秒数。

minimum: 0