Đăng ký sandbox
Xác định use case, volume, callback và yêu cầu định danh.
Tích hợp Trusted Delivery qua REST API, webhook ký số, OAuth 2.1, mTLS, AS4/eDelivery và mô hình bằng chứng có cấu trúc.
Tài sản kỹ thuật trong bản v3 là mẫu triển khai an toàn, không chứa endpoint, secret hoặc chứng thư vận hành chính thức.
Xác định use case, volume, callback và yêu cầu định danh.
OAuth 2.1 client, mTLS, IP chính sách và webhook signing key.
Tiếp nhận gửi, consignment, handover, failure và evidence retrieval.
Security review, SLA, DR, capacity và runbook vận hành.
API Gateway và AS4 Gateway cùng kết nối vào lõi giao nhận và Bộ máy bằng chứng, nhưng dùng profile và kiểm soát khác nhau.
Mẫu minh họa validation, timeout, idempotency, retry có giới hạn và không ghi log secret.
curl --request POST https://sandbox.example/v1/consignments \
--cert client.crt --key client.key \
--header "Authorization: Bearer ${TOKEN}" \
--header "Idempotency-Key: 04df..." \
--header "Content-Type: application/json" \
--data '{"recipient":{"type":"legal_entity","id":"DEMO-001"},"contentHash":"sha256:...","callbackUrl":"https://client.example/webhooks/delivery"}'
// Java 21 example: validate input, use idempotency and handle retryable failures.
HttpRequest request = HttpRequest.newBuilder(endpoint)
.header("Authorization", "Bearer " + token)
.header("Idempotency-Key", idempotencyKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
if (response.statusCode() == 429 || response.statusCode() >= 500) {
retryWithExponentialBackoff(request); // bounded, jittered retry
}
if (response.statusCode() / 100 != 2) throw new DeliveryApiException(response.body());
// Node.js: validate, send idempotently, verify the signed webhook separately.
const response = await fetch(endpoint, {
method: 'POST',
headers: { authorization: `Bearer ${token}`, 'idempotency-key': key,
'content-type': 'application/json' },
body: JSON.stringify(payload),
signal: AbortSignal.timeout(10_000)
});
if ([429, 500, 502, 503, 504].includes(response.status)) await boundedRetry();
if (!response.ok) throw new Error(`Delivery API ${response.status}`);
# Python: typed validation, timeout and bounded retry.
with httpx.Client(cert=("client.crt", "client.key"), timeout=10.0) as client:
response = client.post(endpoint, json=payload, headers={
"Authorization": f"Bearer {token}",
"Idempotency-Key": idempotency_key,
})
if response.status_code in {429, 500, 502, 503, 504}:
raise RetryableDeliveryError(response.text)
response.raise_for_status()
result = response.json()
// .NET: use HttpClientFactory, mTLS handler, timeout and idempotency.
using var request = new HttpRequestMessage(HttpMethod.Post, endpoint);
request.Headers.Authorization = new("Bearer", token);
request.Headers.Add("Idempotency-Key", idempotencyKey);
request.Content = JsonContent.Create(payload);
using var response = await client.SendAsync(request, cancellationToken);
if ((int)response.StatusCode == 429 || (int)response.StatusCode >= 500)
throw new RetryableDeliveryException(await response.Content.ReadAsStringAsync());
response.EnsureSuccessStatusCode();
Mỗi chủ đề có trang riêng để phục vụ kiến trúc sư, lập trình viên và đội vận hành.