Marketplace Selling

Tích hợp API người bán SHEIN: Xác thực, ký và đồng bộ

Hướng dẫn tích hợp API người bán SHEIN: quy trình tempToken đến openKeyId, ký request bằng code, giải mã secretKey và thiết kế đồng bộ đơn hàng.

Ảnh đại diện Long Nguyen

Long Nguyen

Lập trình viên Fullstack · Kỹ sư AI · Nhà nghiên cứu

• • 5 phút đọc •

API người bán SHEIN bao gồm những gì?

SHEIN cung cấp hệ thống tích hợp dưới tên SHEIN Developer Platform (còn gọi là SHEIN Open Platform). SHEIN mô tả đây là các giải pháp kết nối công nghệ cho quy trình sản phẩm, đơn hàng, đổi trả và thu mua. Trên thực tế, tích hợp API người bán SHEIN có nghĩa là hệ thống của bạn (ERP, công cụ bán hàng đa kênh, WMS hoặc hệ thống quản trị tùy chỉnh) giao tiếp với SHEIN qua HTTPS thay vì nhân viên phải thao tác thủ công trong cổng người bán.

Phạm vi thực tế của lần tích hợp đầu tiên nên tương đối nhỏ. Hầu hết đội ngũ cần ba luồng sau, theo thứ tự này:

Luồng Dữ liệu được truyền Hướng truyền Lý do nên ưu tiên
Đơn hàng Đơn mới, chi tiết đơn, trạng thái xử lý và vận chuyển Từ SHEIN đến bạn, sau đó gửi thông tin vận chuyển ngược lại Xác nhận giao hàng trễ là cách nhanh nhất làm ảnh hưởng tài khoản người bán
Tồn kho Số lượng tồn theo từng SKU Từ bạn đến SHEIN Bán vượt tồn tạo ra các đơn hủy mà bạn phải chịu chi phí
Sản phẩm Tạo và cập nhật sản phẩm đăng bán Từ bạn đến SHEIN Tốn nhiều công sức nhất, nên triển khai sau khi hai luồng trên đã ổn định

API đổi trả và thu mua cũng có sẵn, nhưng hãy để sau khi đơn hàng và tồn kho đã hoạt động đáng tin cậy. Một lưu ý trước khi lập kế hoạch: tài liệu của developer platform là một ứng dụng một trang và có thể thay đổi. Vì vậy, hãy xem mọi đường dẫn endpoint và tên trường trong bài viết này là điểm bắt đầu, đồng thời kiểm tra lại tài liệu SHEIN hiện hành trước khi lập trình.

Cơ chế xác thực API SHEIN

SHEIN không cung cấp cho bạn một API key tĩnh duy nhất. Có hai lớp thông tin xác thực, và nhầm lẫn giữa chúng là lý do phổ biến nhất khiến request đầu tiên thất bại.

Thông tin xác thực Thuộc về Dùng để
appid + app secret key Ứng dụng của bạn (đăng ký trên developer platform) Đổi token tạm thời và giải mã secret nhận được
tempToken Một lần ủy quyền, có hiệu lực 10 phút Thực hiện trao đổi một lần rồi loại bỏ
openKeyId + secretKey Một người bán (nhà cung cấp) đã ủy quyền Ký mọi request API nghiệp vụ cho người bán đó

Quy trình mà các hệ thống tích hợp triển khai như sau:

  1. Người bán mở trang ủy quyền của SHEIN với appid của bạn, redirectUrl được mã hóa Base64 và một giá trị state do bạn tự chọn.
  2. Sau khi người bán chấp thuận, SHEIN chuyển hướng về URL của bạn cùng tempToken và state được gửi lại. Token có hiệu lực trong 10 phút.
  3. Server của bạn gửi POST {"tempToken": "..."} đến /open-api/auth/get-by-token trên API domain.
  4. Response chứa openKeyId, supplierId, supplierSource, appid và secretKey đã được mã hóa.
  5. Bạn giải mã secretKey bằng app secret key rồi lưu cặp thông tin này gắn với người bán đó.

Java SDK chính thức của SHEIN cũng phản ánh sự phân tách này: SDK cung cấp chế độ ký APPID (dùng để đổi token qua getToken(tempToken, authInfo)) và chế độ ký OPEN_KEY_ID (dùng cho các API thông thường). SDK cũng liệt kê hai API domain là openapi.sheincorp.com và openapi.sheincorp.cn. Chi tiết về quy trình trao đổi có trên trang chính thức của SHEIN, Trao đổi openKeyId và secretKey, còn SDK được phát hành tại sheinsight/open-sdk-java trên GitHub.

Hệ quả khi thiết kế: tham số state là cách duy nhất để biết khách hàng nào của bạn vừa thực hiện ủy quyền. Hãy tạo giá trị này ở server, liên kết với hồ sơ khách hàng và từ chối mọi callback có state không phải do bạn phát hành. Bỏ qua bước này có thể khiến thông tin xác thực của một người bán bị gắn nhầm vào tài khoản của người bán khác trong các công cụ đa bên thuê.

Cách ký một request API SHEIN

Mỗi request đều chứa chữ ký được tạo từ thông tin xác thực của người bán, đường dẫn request và timestamp tính bằng mili giây. Cơ chế mà các hệ thống tích hợp sử dụng là:

  • Chuỗi cần ký: openKeyId&timestamp&path (ví dụ đường dẫn /open-api/auth/get-by-token, không bao gồm domain).
  • Khóa HMAC: secretKey nối với một chuỗi ngẫu nhiên gồm 5 ký tự.
  • Digest: HMAC-SHA256, mã hóa dạng hex rồi mã hóa Base64.
  • Kết quả: chuỗi ngẫu nhiên 5 ký tự được đặt trước giá trị Base64 và gửi trong header x-lt-signature.

Cùng với chữ ký, bạn gửi timestamp mili giây trong x-lt-timestamp, application id trong x-lt-appid, content type dạng JSON và header language. Đây là phiên bản Python có thể chạy được:

import base64, hashlib, hmac, secrets, string, time

def shein_signature(open_key_id: str, secret_key: str, path: str, timestamp_ms: int) -> str:
    alphabet = string.ascii_letters + string.digits
    random_key = ''.join(secrets.choice(alphabet) for _ in range(5))
    to_sign = f'{open_key_id}&{timestamp_ms}&{path}'
    hex_digest = hmac.new(
        (secret_key + random_key).encode(),
        to_sign.encode(),
        hashlib.sha256,
    ).hexdigest()
    return random_key + base64.b64encode(hex_digest.encode()).decode()

ts = int(time.time() * 1000)
sig = shein_signature('YOUR_OPEN_KEY_ID', 'YOUR_SECRET_KEY', '/open-api/auth/get-by-token', ts)

Có hai chi tiết thường gây lỗi. Thứ nhất, Base64 được áp dụng cho chuỗi hex, không phải các byte digest thô. Vì vậy, với ngôn ngữ trả về byte thô theo mặc định (Go, hoặc digest() của Node không có encoding), bạn cần thêm bước chuyển sang hex rõ ràng. Thứ hai, đường dẫn trong chuỗi cần ký phải khớp với đường dẫn thực tế được gọi, không bao gồm query string. Vì vậy, ký request ở một nơi nhưng định tuyến ở nơi khác là nguyên nhân kinh điển gây lỗi không khớp chữ ký.

Hãy kiểm tra tên header chính xác và quy tắc đường dẫn dành cho các request nghiệp vụ (khác với trao đổi token) trong tài liệu SHEIN hiện hành. Nếu viết bằng Java, chức năng ký tích hợp sẵn trong SDK chính thức sẽ loại bỏ cả nhóm lỗi này.

Cách giải mã secretKey của SHEIN

secretKey trả về từ quá trình trao đổi token không thể sử dụng ngay. Khóa này được mã hóa bằng AES-128-CBC và mã hóa Base64, sau đó được giải mã bằng secret key của ứng dụng cùng IV cố định được các bên tích hợp ghi nhận là space-station-de. Dưới đây là phiên bản Python sử dụng PyCryptodome:

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def decrypt_secret_key(encrypted_b64: str, app_secret: str) -> str:
    key = app_secret.encode()[:16].ljust(16, b'\0')
    cipher = AES.new(key, AES.MODE_CBC, iv=b'space-station-de')
    return unpad(cipher.decrypt(base64.b64decode(encrypted_b64)), 16).decode()

Dòng key mô phỏng cách OpenSSL xử lý AES-128: khóa được cắt hoặc đệm thêm số 0 để đủ 16 byte. Nếu thư viện bạn dùng yêu cầu độ dài khóa chính xác, đây là vị trí thường phát sinh lỗi. Sau khi giải mã, hãy lưu giá trị trong secrets manager hoặc một cột đã mã hóa. Tuyệt đối không ghi giá trị này vào log và không gửi đến trình duyệt.

Thiết kế đồng bộ đơn hàng và tồn kho ổn định khi vận hành

Khiến một request đã ký trả về 200 là phần dễ. Điều quyết định khả năng tích hợp hoạt động bền vững là cách bạn luân chuyển dữ liệu trong nhiều tuần.

Dùng webhook để nhanh và polling để đối soát dữ liệu chuẩn

SHEIN có tài liệu về cơ chế webhook trên developer platform (xem trang Webhook Instruction). Thông báo đẩy giúp giảm độ trễ, nhưng bất kỳ kênh push nào cũng có thể làm mất hoặc trì hoãn sự kiện. Mô hình đáng tin cậy là webhook kích hoạt việc lấy ngay thông tin đơn hàng, kết hợp với một tác vụ polling đối soát theo lịch để truy vấn mọi dữ liệu thay đổi kể từ lần đồng bộ thành công gần nhất. Nếu polling không bao giờ tìm thấy sự kiện mà webhook bỏ sót, bạn có bằng chứng thiết kế đang hoạt động; nếu có, bạn đã phát hiện lỗ hổng trước khi khách hàng nhận ra.

Đảm bảo mọi thao tác ghi đều idempotent

Retry chắc chắn sẽ xảy ra do timeout, triển khai phiên bản mới hoặc webhook được gửi trùng. Trong cơ sở dữ liệu, hãy định danh mỗi đơn bằng mã đơn hàng của SHEIN và đặt ràng buộc duy nhất; đồng thời để thao tác xử lý đơn và cập nhật tồn kho là thao tác gán giá trị thay vì tăng giảm tương đối. Retry thao tác “giảm 1” có thể gây bán vượt tồn, còn retry thao tác “đặt thành 14” thì không gây hại.

Coi cặp token là trạng thái riêng của từng người bán

Lưu openKeyId, secretKey đã giải mã và supplierId theo từng người bán, đồng thời ghi nhận ngày ủy quyền. Nếu người bán thu hồi quyền truy cập, request tiếp theo sẽ thất bại. Hãy hiển thị trạng thái “kết nối lại SHEIN” trong sản phẩm thay vì để quá trình đồng bộ âm thầm bị dừng.

Kiểm soát đồng hồ hệ thống

Chữ ký có timestamp tính bằng mili giây, vì vậy server bị lệch giờ sẽ tạo ra các request trông có vẻ hợp lệ nhưng bị từ chối. Hãy chạy NTP trên mọi máy chủ thực hiện ký request.

Tự xây dựng, dùng SDK hay thuê đội ngũ tích hợp SHEIN?

Phần ký và xác thực có thể hoàn thành trong một cuối tuần. Phần công việc kéo dài về sau (ánh xạ trường giữa danh mục của bạn và thuộc tính ngành hàng của SHEIN, xử lý lỗi, giám sát và hướng dẫn người bán kết nối) mới là thứ tiêu tốn nhiều tuần. Hãy lựa chọn dựa trên số lượng người bán bạn phục vụ và việc SHEIN có phải kênh duy nhất hay không.

Lựa chọn Phù hợp khi Chi phí chính
Xây dựng trực tiếp trên API Bạn chỉ bán sản phẩm của mình trên SHEIN và có lập trình viên nội bộ Thời gian kỹ thuật, cộng với chi phí bảo trì khi SHEIN thay đổi API
Dùng Java SDK chính thức Hệ thống của bạn dựa trên JVM và bạn muốn SDK xử lý phần ký cùng mã hóa Phụ thuộc vào Java; bạn vẫn phải tự xử lý logic ánh xạ và đồng bộ
Trình kết nối đa kênh có sẵn Bạn cần luồng sản phẩm đến đơn hàng tiêu chuẩn và chấp nhận mô hình dữ liệu của công cụ Phí hàng tháng và các giới hạn khi quy trình của bạn có yêu cầu đặc thù
Tích hợp tùy chỉnh bởi đội ngũ chuyên môn Bạn cần đưa SHEIN vào ERP, danh mục tùy chỉnh hoặc kết nối nhiều kênh cùng lúc Chi phí dự án ban đầu, tính theo phạm vi công việc

Nếu bạn cần kết nối SHEIN cùng Amazon, eBay, Walmart hoặc Etsy trong một hệ thống, đây là trường hợp nên xây dựng mô hình dữ liệu nội bộ dùng chung thay vì viết script riêng cho từng kênh. Netalith triển khai các hệ thống như vậy trong dịch vụ tích hợp marketplace, và các nguyên tắc thiết kế trên vẫn áp dụng bất kể ai là người viết mã.

Checklist trước khi đưa tích hợp API người bán SHEIN vào vận hành

Hạng mục kiểm tra Vì sao quan trọng
Callback xác thực state với giá trị do bạn phát hành Ngăn thông tin xác thực bị gắn nhầm cho khách hàng khác
tempToken được trao đổi trong thời hạn 10 phút Token hết hạn buộc người bán phải ủy quyền lại
secretKey được lưu dưới dạng mã hóa và không bao giờ ghi vào log Khóa này ký mọi request mà tài khoản người bán có thể thực hiện
Chữ ký được kiểm thử với đường dẫn và timestamp đã biết Phát hiện sớm lỗi Base64 giữa hex và byte
Thao tác ghi đơn hàng dùng mã đơn SHEIN kèm ràng buộc duy nhất Webhook trùng không thể tạo các đơn hàng trùng
Cập nhật tồn kho đặt số lượng tuyệt đối Retry không thể gây bán vượt tồn
Tác vụ polling đối soát chạy theo lịch Phát hiện các sự kiện webhook đã bỏ sót
Cảnh báo khi một người bán liên tục xác thực thất bại Biến việc thu hồi quyền thành trạng thái hiển thị rõ ràng thay vì dừng đồng bộ âm thầm

Đối với câu hỏi về quyền truy cập developer platform, SHEIN cung cấp email liên hệ [email protected]. Nếu muốn được tư vấn phạm vi và xây dựng tích hợp, hãy gửi thông tin qua biểu mẫu nhận báo giá miễn phí của Netalith.

CÂU HỎI THƯỜNG GẶP

Câu hỏi thường gặp

SHEIN có API dành cho người bán không?

Có. SHEIN cung cấp SHEIN Developer Platform (Open Platform), với các API cho quy trình sản phẩm, đơn hàng, đổi trả và thu mua. Ứng dụng của bạn đăng ký trên nền tảng, sau đó từng người bán ủy quyền để ứng dụng thao tác trên tài khoản của họ.

Làm cách nào để lấy thông tin xác thực API SHEIN?

Ứng dụng của bạn nhận appid và app secret từ developer platform. Sau đó, người bán ủy quyền cho ứng dụng; SHEIN gửi tempToken đến callback của bạn và bạn đổi token này lấy openKeyId cùng secretKey đã mã hóa của người bán. Nếu có câu hỏi về quyền truy cập nền tảng, SHEIN cung cấp email liên hệ [email protected].

tempToken của SHEIN có hiệu lực trong bao lâu?

Theo tài liệu tích hợp, token có hiệu lực trong 10 phút. Hãy đổi token ngay trong trình xử lý callback; nếu token hết hạn, người bán phải thực hiện ủy quyền lại.

Request API SHEIN được ký như thế nào?

Chuỗi openKeyId&timestamp&path được ký bằng HMAC-SHA256, sử dụng secretKey nối với một chuỗi ngẫu nhiên gồm 5 ký tự làm khóa. Digest dạng hex được mã hóa Base64, sau đó đặt chuỗi ngẫu nhiên ở đầu. Kết quả được gửi trong header x-lt-signature cùng timestamp mili giây trong x-lt-timestamp. Hãy kiểm tra tên header và quy tắc hiện hành trong tài liệu SHEIN.

SHEIN có SDK API chính thức không?

SHEIN phát hành Java SDK chính thức (sheinsight/open-sdk-java), hỗ trợ xác thực, ký request và mã hóa hoặc giải mã. SDK có chế độ APPID cho trao đổi token và chế độ OPEN_KEY_ID cho các API thông thường. Với ngôn ngữ khác, bạn cần tự triển khai phần ký.

Nên dùng webhook hay polling cho đơn hàng SHEIN?

Nên dùng cả hai. Webhook giúp giảm độ trễ, nhưng mọi kênh push đều có thể làm mất sự kiện, vì vậy hãy thêm polling đối soát theo lịch cho các đơn thay đổi kể từ lần đồng bộ thành công gần nhất. Thao tác ghi đơn hàng cần idempotent để các sự kiện trùng không gây hậu quả.

Cập nhật cùng Netalith

Nhận kiến thức công nghệ, cập nhật sản phẩm và ưu đãi đặc biệt qua email.