GET /v1/
Trang iframe smart-buttons PayPal
Render trang HTML mà iframe do SDK quản lý sẽ load (src của iframe trong PaypalShield.init). Kiểm tra origin qua Referer khi key có cấu hình allowedOrigins (chống hotlink, không phải ranh giới xác thực). Bị chặn bởi pool guard (POOL_MISMATCH nếu pool của key không bao gồm host này).
Tham số
Phản hồi
401
SHIELD_KEY_INVALID | SHIELD_KEY_ENV_MISMATCH | SHIELD_KEY_REVOKED | SHIELD_KEY_EXPIRED (hình dạng V1Error).
V1Error403
SCOPE_DENIED | ORIGIN_NOT_ALLOWED | POOL_MISMATCH (hình dạng V1Error).
V1Error404
NOT_FOUND (đường bị chặn wallet) | INVALID_SHIELD_KEY (/v1/shield/select, /v1/stripe/select) — body inline thuần, không bao giờ có message/docs (hình dạng LegacyControllerError). KHÔNG THỂ XẢY RA trên v1 — lỗi 404 này chỉ fire trên API cũ (không-v1). Được ghi lại ở đây chỉ để đầy đủ/tương thích với API cũ. Một path sai chữ hoa/thường hoặc có dấu gạch chéo cuối trên route v1 thay vào đó sẽ rơi vào 404 mặc định (HTML, ngoài spec này) vì router v1 xử lý đường dẫn nghiêm ngặt — không theo hình dạng JSON này.
LegacyControllerError503
SHIELD_REGISTRY_UNAVAILABLE | SHIELD_REGISTRY_STALE | SHIELD_ENV_MISCONFIGURED | PAYMENT_ENV_MISMATCH | SIGNING_UNAVAILABLE (hình dạng V1Error) HOẶC shield chưa được cấu hình secret (hình dạng LegacyStringError, không có data).
một trong:
Mã lỗi đầy đủ
GET /v1/card-fields
Trang iframe card-fields nâng cao của PayPal
Chặn giống /v1/; render trang biến thể card-fields.
Tham số
Phản hồi
401
SHIELD_KEY_INVALID | SHIELD_KEY_ENV_MISMATCH | SHIELD_KEY_REVOKED | SHIELD_KEY_EXPIRED (hình dạng V1Error).
V1Error403
SCOPE_DENIED | ORIGIN_NOT_ALLOWED | POOL_MISMATCH (hình dạng V1Error).
V1Error404
NOT_FOUND (đường bị chặn wallet) | INVALID_SHIELD_KEY (/v1/shield/select, /v1/stripe/select) — body inline thuần, không bao giờ có message/docs (hình dạng LegacyControllerError). KHÔNG THỂ XẢY RA trên v1 — lỗi 404 này chỉ fire trên API cũ (không-v1). Được ghi lại ở đây chỉ để đầy đủ/tương thích với API cũ. Một path sai chữ hoa/thường hoặc có dấu gạch chéo cuối trên route v1 thay vào đó sẽ rơi vào 404 mặc định (HTML, ngoài spec này) vì router v1 xử lý đường dẫn nghiêm ngặt — không theo hình dạng JSON này.
LegacyControllerError503
SHIELD_REGISTRY_UNAVAILABLE | SHIELD_REGISTRY_STALE | SHIELD_ENV_MISCONFIGURED | PAYMENT_ENV_MISMATCH | SIGNING_UNAVAILABLE (hình dạng V1Error) HOẶC shield chưa được cấu hình (hình dạng LegacyStringError, không có data).
một trong:
Mã lỗi đầy đủ
POST /v1/create_order
Tạo một đơn hàng PayPal
Kiểm tra origin qua sec-fetch-or-origin khi key có cấu hình allowedOrigins. Được gọi từ bên trong iframe của SDK (cùng origin với shield domain đã chọn).
Tham số
Nội dung yêu cầu
Phản hồi
401
lỗi xác thực key (V1Error) HOẶC tổng đơn hàng vượt MAX_ORDER_AMOUNT (body rỗng, res.status(401).send() — cùng mức giới hạn mà PayPal/Stripe chia sẻ; phân biệt bằng body RỖNG so với body JSON V1Error).
V1Error403
SCOPE_DENIED | ORIGIN_NOT_ALLOWED | POOL_MISMATCH (hình dạng V1Error).
V1Error429
RATE_LIMITED | TEMPORARILY_LOCKED (giới hạn tốc độ thanh toán theo IP dùng chung)
LegacyControllerError500
Chuyển tiếp lỗi API PayPal nguyên bản — data là JSON lỗi gốc đã parse của PayPal, không phải hình dạng {issue,...} — HOẶC "Internal server error" (hình dạng LegacyStringError, không có data).
một trong:
503
SHIELD_REGISTRY_UNAVAILABLE | SHIELD_REGISTRY_STALE | SHIELD_ENV_MISCONFIGURED | PAYMENT_ENV_MISMATCH | SIGNING_UNAVAILABLE (hình dạng V1Error) HOẶC shield chưa được cấu hình (hình dạng LegacyStringError, không có data).
một trong:
Mã lỗi đầy đủ
POST /v1/capture_order
Capture một đơn hàng PayPal và nhận envelope đã ký
Không kiểm tra origin (ràng buộc thực hiện lúc tạo order thông qua ràng buộc capture-key hậu-charge). Khi thành công trả về một SignedEnvelope mà data mang kết quả capture gốc của PayPal và signed_payload parse ra PaypalCaptureV1Payload. Bằng chứng đã ký là đường hoàn tất CHÍNH (store hoàn tất ngay, không chờ webhook). Một capture THÀNH CÔNG (tiền đã chuyển) nhưng không thể ký trả về 502 CAPTURED_PROOF_UNAVAILABLE: người mua đã bị charge; không retry hay hiển thị lỗi — đơn hàng được hoàn tất bởi webhook AIO transaction.completed (khớp theo settle_ref) như đường fallback.
Tham số
Nội dung yêu cầu
Phản hồi
400
capture_id/order_id thiếu hoặc không an toàn — data ở đây là một STRING thuần (ví dụ "Capture ID is required"), không phải object {issue,...} (validate trước khi gọi PayPal trên route này).
401
lỗi xác thực key (V1Error) HOẶC gate fraud blocklist đã từ chối capture này (body rỗng, res.status(401).send() — không lộ lý do cho client; phân biệt bằng body RỖNG so với JSON V1Error).
V1Error403
SCOPE_DENIED | POOL_MISMATCH (cố gắng capture bằng key khác). LƯU Ý: /v1/capture_order không kiểm tra origin — ràng buộc origin được thực hiện lúc tạo order — nên ORIGIN_NOT_ALLOWED không bao giờ xảy ra ở route này dù nó có trong danh sách issue chung của ForbiddenError.
V1Error429
RATE_LIMITED | TEMPORARILY_LOCKED (giới hạn tốc độ thanh toán theo IP dùng chung)
LegacyControllerError500
Chuyển tiếp lỗi API PayPal nguyên bản — data là JSON lỗi gốc đã parse của PayPal, không phải hình dạng {issue,...} — HOẶC "Internal server error" (hình dạng LegacyStringError, không có data).
một trong:
502
CAPTURED_PROOF_UNAVAILABLE — người mua đã bị charge; không retry hay hiển thị lỗi — đơn hàng được hoàn tất bởi webhook AIO transaction.completed (khớp theo settle_ref) như đường fallback.
V1Error503
SHIELD_REGISTRY_UNAVAILABLE | SHIELD_REGISTRY_STALE | SHIELD_ENV_MISCONFIGURED | PAYMENT_ENV_MISMATCH | SIGNING_UNAVAILABLE (hình dạng V1Error) HOẶC shield chưa được cấu hình (hình dạng LegacyStringError, không có data).
một trong:
Mã lỗi đầy đủ
GET /v1/shield/select
Chọn một shield PayPal từ pool của key
Được gọi bởi PaypalShield.init trước khi mount iframe (bỏ qua khi script SDK mang pin ?domain=). Kiểm tra origin qua Origin khi key có cấu hình allowedOrigins.
Tham số
Phản hồi
200
kết quả chọn pool khi thành công. Với NO_ACTIVE/NO_POOL/SELECT_FAILED (nhánh JSON pool-select chung không set status, nên Express mặc định về 200) đây thay vào đó là một LegacyControllerError — error:true với data.issue là một trong ba mã đó. SELECT_FAILED là một quy ước phía SDK (selector chung không bao giờ phát ra chuỗi đó; nó được dành riêng cho việc phân loại network/timeout của SDK trên lời gọi này), được giữ trong enum V1Issue chung cho các caller muốn một tập hợp đóng duy nhất trên cả hai lớp.
một trong:
401
SHIELD_KEY_INVALID | SHIELD_KEY_ENV_MISMATCH | SHIELD_KEY_REVOKED | SHIELD_KEY_EXPIRED (hình dạng V1Error).
V1Error403
SCOPE_DENIED | ORIGIN_NOT_ALLOWED | POOL_MISMATCH (hình dạng V1Error).
V1Error404
NOT_FOUND (đường bị chặn wallet) | INVALID_SHIELD_KEY (/v1/shield/select, /v1/stripe/select) — body inline thuần, không bao giờ có message/docs (hình dạng LegacyControllerError). KHÔNG THỂ XẢY RA trên v1 — lỗi 404 này chỉ fire trên API cũ (không-v1). Được ghi lại ở đây chỉ để đầy đủ/tương thích với API cũ. Một path sai chữ hoa/thường hoặc có dấu gạch chéo cuối trên route v1 thay vào đó sẽ rơi vào 404 mặc định (HTML, ngoài spec này) vì router v1 xử lý đường dẫn nghiêm ngặt — không theo hình dạng JSON này.
LegacyControllerError503
SHIELD_REGISTRY_UNAVAILABLE | SHIELD_REGISTRY_STALE | SHIELD_ENV_MISCONFIGURED | PAYMENT_ENV_MISMATCH | SIGNING_UNAVAILABLE (hình dạng V1Error).
V1ErrorMã lỗi đầy đủ