ÿÿ Response to server-side API requests: 400: Bad request

Response to server-side API requests: 400: Bad request

billing_issue_detected_at_date_comparison_error

Sự cố thanh toán xảy ra khi có vấn đỠtrong quá trình gia hạn gói đăng ký, vì vậy nó luôn xảy ra sau ngày giao dịch (purchased_at).

Äể khắc phục, hãy đảm bảo ngày phát hiện sá»± cố thanh toán (billing_issue_detected_at) muá»™n hÆ¡n ngày giao dịch (purchased_at).

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là billing_issue_detected_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Luôn là billing_issue_detected_at_date_comparison_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ response

{
  "errors": [
    {
      "source": "billing_issue_detected_at",
      "errors": [
        "billing_issue_detected_at must be later than purchased_at."
      ]
    }
  ],
  "error_code": "billing_issue_detected_at_date_comparison_error",
  "status_code": 400
}

expires_date_error

Ngưá»i dùng không thể mua má»™t gói đăng ký đã hết hạn. Vì vậy, ngày expires_at (khi gói đăng ký hết hạn) phải luôn muá»™n hÆ¡n ngày purchased_at (khi giao dịch xảy ra).

Äể khắc phục, hãy kiểm tra các ngày này và đảm bảo rằng expires_at sau purchased_at.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là expires_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là expires_date_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "expires_at",
      "errors": [
        "expires_at must be later than purchased_at."
      ]
    }
  ],
  "error_code": "expires_date_error",
  "status_code": 400
}

family_share_price_error

Yêu cầu thất bại vì tham số is_family_shared được đặt thành true, nghĩa là mức độ truy cập được chia sẻ miễn phí với thành viên gia đình. Tuy nhiên, tham số value của đối tượng Price chưa được đặt vỠ0.

Nếu is_family_shared cần là true, hãy đảm bảo đặt tham số value của đối tượng Price thành 0.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là is_family_shared
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là: family_share_price_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

Không tìm thấy hồ sÆ¡ ngưá»i dùng

{
  "errors": [
    {
      "source": "is_family_shared",
      "errors": [
        "If is_family_shared is true, price.value must be 0."
      ]
    }
  ],
  "error_code": "family_share_price_error",
  "status_code": 400
}

free_trial_price_error

Yêu cầu thất bại vì tham số offer_type được đặt thành free_trial, nhưng tham số value của đối tượng Price không được đặt vỠzero.

Má»™t nguyên nhân khác có thể là tham số offer_id được thêm vào nhưng để giá trị null, trong khi tham số này không được phép null. Trong trưá»ng hợp này, hãy cung cấp giá trị cho offer_id hoặc xóa hoàn toàn tham số này.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là offer.type
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là: free_trial_price_error.
status_codeIntegerMã trạng thái HTTP. Luôn là 400.

Ví dụ phản hồi

Không tìm thấy hồ sÆ¡ ngưá»i dùng

{
  "errors": [
    {
      "source": "offer_type",
      "errors": [
        "If offer_type is 'free_trial', price.value must be 0."
      ]
    }
  ],
  "error_code": "free_trial_price_error",
  "status_code": 400
}

grace_period_expires_date_error

Thá»i gian ân hạn là khoảng thá»i gian bổ sung bạn có thể cấp cho khách hàng để gia hạn gói đăng ký khi há» không thể gia hạn đúng hạn—ví dụ, khi thẻ tín dụng cá»§a há» bị từ chối. Äiá»u này giúp giữ nguyên các cài đặt cá»§a há» trong khi há» xá»­ lý vấn Ä‘á». Việc cung cấp thá»i gian ân hạn là tùy chá»n.

Nếu bạn cung cấp thá»i gian ân hạn, ngày hết hạn cá»§a nó (grace_period_expires_at) phải muá»™n hÆ¡n ngày hết hạn gói đăng ký (expires_at). Nếu không, thá»i Ä‘iểm hết hạn cá»§a thá»i gian ân hạn sẽ trùng vá»›i thá»i Ä‘iểm hết hạn gói đăng ký. Trong má»i trưá»ng hợp, thá»i Ä‘iểm hết hạn cá»§a thá»i gian ân hạn không thể sá»›m hÆ¡n thá»i Ä‘iểm hết hạn gói đăng ký.

Äể khắc phục, hãy đảm bảo ngày hết hạn thá»i gian ân hạn (grace_period_expires_at) muá»™n hÆ¡n ngày hết hạn gói đăng ký (expires_at).

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là grace_period_expires_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Luôn là grace_period_expires_date_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ response

{
  "errors": [
    {
      "source": "grace_period_expires_at",
      "errors": [
        "grace_period_expires_at must be later or equal to expires_at."
      ]
    }
  ],
  "error_code": "grace_period_expires_date_error",
  "status_code": 400
}

grace_period_billing_error

Việc bắt đầu thá»i gian ân hạn được tính là má»™t sá»± cố thanh toán. Vì vậy, nếu thá»i gian ân hạn đã bắt đầu (được xác định bởi tham số grace_period_expires_at đã được Ä‘iá»n), ngày bắt đầu cá»§a nó phải được ghi lại trong tham số billing_issue_detected_at.

Äể khắc phục, hãy đặt ngày bắt đầu cá»§a thá»i gian ân hạn vào billing_issue_detected_at hoặc, nếu thá»i gian ân hạn chưa bắt đầu, hãy xóa tham số grace_period_expires_at.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là grace_period_billing_error
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Luôn là grace_period_billing_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "grace_period_billing_error",
      "errors": [
        "If grace_period_expires_at is specified, billing_issue_detected_at must also be specified."
      ]
    }
  ],
  "error_code": "grace_period_billing_error",
  "status_code": 400
}

missing_offer_id

Yêu cầu thất bại vì tham số offer_category có giá trị khác introductory hoặc offer_type nhưng không bao gồm offer_id. Trong trưá»ng hợp này, hãy cung cấp offer_id hoặc xóa offer_category hay offer_type khá»i yêu cầu.

Một nguyên nhân khác có thể là tham số offer_id đã được thêm vào nhưng để là null, trong khi tham số này không được phép là null. Nếu vậy, hãy thêm giá trị cho offer_id hoặc xóa hoàn toàn tham số này.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là offer.category
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Giá trị có thể có: missing_offer_id.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

Không tìm thấy hồ sÆ¡ ngưá»i dùng

{
  "errors": [
    {
      "source": "offer_category",
      "errors": [
        "offer_id must be specified for all offer types except 'introductory'."
      ]
    }
  ],
  "error_code": "missing_offer_id",
  "status_code": 400
}

Xþ§one_time_purchase_trial_error

Yêu cầu thất bại vì đã cung cấp trial cho sản phẩm mua má»™t lần. Không giống như gói đăng ký, sản phẩm mua má»™t lần không thể có trial. Äể khắc phục, hãy kiểm tra offer_type trong đối tượng Offer bên trong đối tượng One-Time Purchase. Giá trị cá»§a offer_type không được là free_trial. Hãy thay đổi giá trị cá»§a trưá»ng offer_type hoặc chuyển sang sá»­ dụng đối tượng Subscription thay vì One-Time Purchase.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là offer.type
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là one_time_purchase_trial_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ response

{
  "errors": [
    {
      "source": "offer.type",
      "errors": [
        "One-time purchase cannot have a trial."
      ]
    }
  ],
  "error_code": "one_time_purchase_trial_error",
  "status_code": 400
}

originally_purchased_date_error

Äối vá»›i các gói đăng ký dài hạn, má»™t chuá»—i giao dịch sẽ được tạo ra. Giao dịch gốc là giao dịch đầu tiên trong chuá»—i này và liên kết tất cả các giao dịch tiếp theo. Má»—i lần gia hạn chỉ đơn giản là sá»± kéo dài cá»§a giao dịch gốc đó. Nếu giao dịch là lần mua đầu tiên, nó chính là giao dịch gốc cá»§a chính nó.

Timestamp originally_purchased_at đánh dấu thá»i Ä‘iểm mua hàng gốc, còn purchased_at là thá»i Ä‘iểm cá»§a giao dịch hiện tại. Vì vậy, purchased_at không bao giá» có thể sá»›m hÆ¡n originally_purchased_at; trong trưá»ng hợp tốt nhất, chúng bằng nhau ở giao dịch đầu tiên.

Yêu cầu thất bại vì originally_purchased_at được đặt muộn hơn purchased_at. Hãy đảm bảo giá trị này sớm hơn hoặc bằng purchased_at.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là originally_purchased_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Luôn là originally_purchased_date_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ response

{
  "errors": [
    {
      "source": "originally_purchased_at",
      "errors": [
        "originally_purchased_at must be earlier than or equal to purchased_at."
      ]
    }
  ],
  "error_code": "originally_purchased_date_error",
  "status_code": 400
}

Yêu cầu thất bại do không tìm thấy mức độ truy cập trong yêu cầu. Hãy kiểm tra lại xem access_level_id có bị nhập sai không và liệu nó có khớp với đúng ứng dụng không.

Body

Tham sốLoạiMô tả
errorsObject
  • source: (string) Luôn là non_field_errors
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Giá trị có thể có: paid_access_level_does_not_exist.
status_codeIntegerHTTP status. Luôn là 404.

Ví dụ phản hồi

Không tìm thấy mức độ truy cập.

{
  "errors": [
    {
      "source": "non_field_errors",
      "errors": [
        "Paid access level `premium` does not exist"
      ]
    }
  ],
  "error_code": "paid_access_level_does_not_exist",
  "status_code": 400
}

profile_does_not_exist

Yêu cầu thất bại vì không tìm thấy hồ sÆ¡ ngưá»i dùng trong header cá»§a yêu cầu. Hãy kiểm tra lại xem có lá»—i đánh máy nào trong profile_id hoặc customer_user_id bạn đã nhập vào header hay không, và đảm bảo rằng đó là thông tin cá»§a đúng ứng dụng.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là non_field_errors
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Giá trị có thể có: profile_does_not_exist.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

Không tìm thấy hồ sÆ¡ ngưá»i dùng

{
  "errors": [
    {
      "source": "non_field_errors",
      "errors": [
        "Profile not found"
      ]
    }
  ],
  "error_code": "profile_does_not_exist",
  "status_code": 400
}

profile_paid_access_level_does_not_exist

Yêu cầu thất bại do hồ sÆ¡ ngưá»i dùng trong yêu cầu không khá»›p vá»›i mức độ truy cập đã chỉ định. Hãy kiểm tra lại ID hồ sÆ¡ ngưá»i dùng trong header và ID mức độ truy cập trong body, đồng thá»i đảm bảo không có lá»—i đánh máy nào.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là non_field_errors
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i rút gá»n. Luôn là profile_paid_access_level_does_not_exist.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "non_field_errors",
      "errors": [
        "Profile `478b2e7f-d557-4b8b-9c5f-cbd46fc2dee2` has no `premium` access level"
      ]
    }
  ],
  "error_code": "profile_paid_access_level_does_not_exist",
  "status_code": 400
}

refund_date_error

Yêu cầu thất bại vì ngày mua (purchased_at) sá»›m hÆ¡n hoặc bằng ngày hoàn tiá»n (refunded_at). Hoàn tiá»n luôn xảy ra sau khi mua, vì nó đảo ngược giao dịch.

Äể khắc phục, hãy kiểm tra các tham số purchased_at và refunded_at và đảm bảo rằng ngày hoàn tiá»n muá»™n hÆ¡n ngày mua.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là refunded_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là refund_date_error.
status_codeIntegerTrạng thái HTTP. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "refunded_at",
      "errors": [
        "refunded_at must be later than purchased_at."
      ]
    }
  ],
  "error_code": "refund_date_error",
  "status_code": 400
}

refund_fields_error

Yêu cầu thất bại do bao gồm cancellation_reason mà không có ngày refunded_at, hoặc có refunded_at mà không có cancellation_reason.

Khi thiết lập hoàn tiá»n, cần chỉ định cả ngày hoàn tiá»n lẫn lý do hoàn tiá»n.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là refunded_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là refund_fields_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "refunded_at",
      "errors": [
        "refunded_at and cancellation_reason=refund must be specified together."
      ]
    }
  ],
  "error_code": "refund_fields_error",
  "status_code": 400
}

renew_status_changed_date_error

Renewal là việc gia hạn gói đăng ký. Ngưá»i dùng có thể há»§y gia hạn gói đăng ký và sau đó gia hạn lại. Thá»i Ä‘iểm cá»§a cả hai hành động này được lưu trong tham số renew_status_changed_at. Và giá trị này không thể xảy ra trước thá»i Ä‘iểm giao dịch.

Äể khắc phục sá»± cố, hãy đảm bảo renew_status_changed_at sau thá»i Ä‘iểm giao dịch (purchased_at).

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là originally_purchased_at
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là originally_purchased_date_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ response

{
  "errors": [
    {
      "source": "renew_status_changed_at",
      "errors": [
        "renew_status_changed_at must be later than purchased_at."
      ]
    }
  ],
  "error_code": "renew_status_changed_date_error",
  "status_code": 400
}

revocation_date_more_than_expiration_date

Yêu cầu thất bại vì revoke_at bạn định nghĩa trong yêu cầu muộn hơn tham số expires_at của mức độ truy cập hiện tại. Nếu bạn muốn gia hạn mức độ truy cập, hãy sử dụng yêu cầu Grant access level.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là non_field_errors
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là revocation_date_more_than_expiration_date.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

  {
  "errors": [
    {
      "source": "revoke_at",
      "errors": [
        "Revocation date (2029-08-29 09:33:42+00:00) is more than current expiration date (2028-08-29 09:33:42+00:00)"
      ]
    }
  ],
  "error_code": "revocation_date_more_than_expiration_date",
  "status_code": 400
}

store_transaction_id_error

Trong trưá»ng hợp các gói đăng ký gia hạn liên tục, má»™t chuá»—i giao dịch sẽ được tạo ra. Giao dịch gốc là giao dịch đầu tiên trong chuá»—i này và toàn bá»™ chuá»—i được liên kết qua đó. Các giao dịch còn lại trong chuá»—i là các lần gia hạn. Nếu giao dịch là lần mua đầu tiên trong chuá»—i gói đăng ký, nó có thể là giao dịch gốc cá»§a chính nó.

Trưá»ng hợp khác là sản phẩm mua má»™t lần. Loại này không bao giá» tạo chuá»—i vì không thể có gia hạn. Vá»›i loại này, store_transaction_id luôn giống vá»›i store_original_transaction_id.

Yêu cầu cá»§a bạn thất bại vì giá trị store_transaction_id trong đối tượng Sản phẩm mua má»™t lần khác vá»›i store_original_transaction_id cá»§a nó. Äể khắc phục, hãy đặt chúng bằng nhau, hoặc thay đổi đối tượng — dùng Subscription thay vì Sản phẩm mua má»™t lần.

Body

Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là store_transaction_id
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là store_transaction_id_error.
status_codeIntegerHTTP status. Luôn là 400.

Ví dụ phản hồi

{
  "errors": [
    {
      "source": "store_transaction_id",
      "errors": [
        "store_transaction_id must be equal to store_original_transaction_id for purchase."
      ]
    }
  ],
  "error_code": "store_transaction_id_error",
  "status_code": 400
}

value_error

Yêu cầu thất bại vì ngày thu hồi được chỉ định đã ở trong quá khứ. Hãy đặt revoke_at thành má»™t ngày trong tương lai hoặc null để thu hồi quyá»n truy cập ngay lập tức.

Body
Tham sốKiểuMô tả
errorsObject
  • source: (string) Luôn là revoke_at.
  • errors: Mô tả lá»—i.
error_codeStringTên lá»—i ngắn gá»n. Luôn là value_error.
status_codeIntegerHTTP status. Luôn là 400.
Ví dụ Response
{
    "errors": [
        {
            "source": null,
            "errors": [
                "Must be greater than the current time or null"
            ]
        }
    ],
    "error_code": "value_error",
    "status_code": 400
}
ÿÿÿÿ