Kết nối store Shopify để nhận order tự động

Mỗi store Shopify cần một app tạo trên Shopify Dev Dashboard (dev.shopify.com) và cài vào store đó. Web chỉ cần 3 thông tin: Shop domain, Client ID, Client secret. Code tự xin Access Token (hạn 24h) bằng Client Credentials, tự làm mới trước khi hết hạn, và dùng chính Client secret để kiểm tra chữ ký webhook. Làm theo 3 bước dưới đây cho mỗi store mới.

Bước 1 — Tạo store trên web này

  1. Vào Settings → Create New Store.
  2. Nhập tên store (ví dụ leafela), chọn Platform = Shopify → Create.
  3. Chọn store vừa tạo ở ô chọn store. Card Shopify sẽ hiện ra.

Bước 2 — Tạo app trên Dev Dashboard và cài vào store

  1. Vào dev.shopify.com → Dashboard → Create app (có thể tạo từ Dashboard, không cần CLI). Đặt tên ví dụ NCE Fulfillment - leafela.
  2. Trong app → Configuration (hoặc Settings → Access scopes): khai báo quyền Admin API:
    Bắt buộc: read_orders, read_products
    Bắt buộc để đẩy tracking lên Shopify (fulfill đơn): read_merchant_managed_fulfillment_orders, write_merchant_managed_fulfillment_orders
    Nên thêm: read_customers (lấy email/tên khách), read_all_orders (sync đơn cũ hơn 60 ngày; Shopify có thể yêu cầu duyệt), read_third_party_fulfillment_orders + write_third_party_fulfillment_orders (chỉ cần nếu đơn được Shopify giao cho location của một app fulfillment bên thứ ba)
    Lưu ý: khi đổi scopes phải Release phiên bản mới của app, sau đó bấm Test Connection lại trên web để token nhận scopes mới.
  3. Cài app vào store: mục Distribution (hoặc nút Install app / Select store) → chọn đúng store (ví dụ leafela) → Install. App dạng này chỉ cài được vào store cùng tổ chức (hoặc dev store), đúng với nhu cầu nội bộ.
  4. Vào Settings của app → mục Client credentials: copy Client ID và Client secret (bấm Reveal). Không cần lấy Access Token thủ công — web sẽ tự xin.

Bước 3 — Nhập vào web và đăng ký webhook

  1. Ô Shop domain: nhập domain dạng tenstore.myshopify.com (xem trên URL Admin: admin.shopify.com/store/tenstore thì domain là tenstore.myshopify.com). Nhập domain riêng (ví dụ leafela.com) cũng được: web tự tra ra domain .myshopify.com thật (lưu ý domain thật có thể là dạng ngẫu nhiên như iikxj0-f9.myshopify.com, không phải leafela.myshopify.com).
  2. Dán Client ID và Client secret → bấm Save Credentials.
  3. Bấm Test Connection. Web sẽ xin token lần đầu rồi gọi thử API. Thấy Connected to "Tên shop" kèm hạn token và scopes là đúng. Ô Access token hiện trạng thái "Active, valid until …, auto-renewed".
  4. Bấm Register Webhooks. Web sẽ tự tạo 3 webhook trên Shopify trỏ về URL hiện ở ô Webhook URL:
    orders/create     → đơn mới vào tab Mapping
    orders/updated    → cập nhật địa chỉ / ghi chú cho đơn còn ở Mapping
    orders/cancelled  → đánh dấu lỗi "Cancelled on Shopify"
    Danh sách webhook đã đăng ký hiện ngay dưới các nút. Dấu ✓ xanh = đúng URL server này.
  5. (Tuỳ chọn) Bấm Sync Orders để kéo các đơn đang mở & chưa fulfill trong 30 ngày gần nhất vào Mapping ngay, không cần chờ đơn mới.

Đơn vào web như thế nào

Đẩy tracking ngược lên Shopify (fulfill đơn)

Kiểm tra & xử lý sự cố

Hiện tượngNguyên nhân / cách xử lý
Test Connection báo Shopify token request failed (400/401)Sai Client ID / Client secret, sai shop domain, hoặc app chưa được cài vào store này. Kiểm tra lại trên Dev Dashboard (mục Distribution / Install) rồi Save và Test lại.
Test OK nhưng Register Webhooks hoặc Sync báo 403Thiếu scope read_orders / read_products. Thêm scope trên Dev Dashboard, Release phiên bản mới, cài lại nếu Shopify yêu cầu, rồi Save Credentials (xoá token cũ) và Test Connection lại.
Push Tracking báo "App thiếu quyền fulfillment" / Access denied for fulfillmentOrdersChưa thêm scope read_merchant_managed_fulfillment_orders + write_merchant_managed_fulfillment_orders, hoặc đã thêm nhưng chưa Release / chưa chấp nhận quyền mới trong Shopify Admin. Làm theo mục "Đẩy tracking ngược lên Shopify" rồi Save Credentials + Test Connection.
Push Tracking báo "Line item not found in an open fulfillment order"Line item trên Shopify đang ON_HOLD (ví dụ chờ thanh toán / fraud review) hoặc đã bị xoá/refund. Mở đơn trên Shopify Admin, release hold rồi bấm Push Tracking lại.
Token hết hạn?Token Client Credentials sống 24h. Web tự xin token mới khi còn dưới 2h, và có job chạy mỗi giờ làm mới trước các token sắp hết hạn trong 3h. Nếu Shopify trả 401 giữa chừng, web tự xin lại 1 lần rồi gọi lại.
Register báo "requires an https webhook URL"Settings → Server Public URL phải là https (hiện tại là https://fulfillment.nceglobal.net).
Đơn mới trên Shopify không vào webBấm Check Webhooks xem còn 3 webhook ✓ không. Xem log server: grep Shopify /root/webff/webhook.log | tail. Nếu thấy HMAC verification FAILED → Client secret nhập sai (phải là secret của đúng app đã cài vào store, không phải của app khác). Nếu bạn vừa Rotate Client secret trên Dev Dashboard thì phải dán secret mới vào web.
Shopify tự xoá webhookShopify huỷ đăng ký nếu server trả lỗi liên tục ~48h. Bấm Register Webhooks để tạo lại.
Muốn ngắt kết nốiBấm Remove Webhooks (xoá webhook trên Shopify), hoặc Uninstall app trong Shopify Admin.

Ghi chú kỹ thuật