hatang.dev

Bán phần mềm, gói thuê bao và mua trong ứng dụng

Đặt loại sản phẩm, chu kỳ và giá riêng cho web, App Store và Google Play, rồi đưa gói và giao dịch mua của từng khách lên hồ sơ, từ cửa hàng hoặc từ hệ thống của bạn, để nhân viên và trợ lý AI trả lời đúng.

Cập nhật ngày

Trong bài này

Nếu bạn bán ứng dụng hoặc phần mềm, một gói thường có ba giá: trên web, trên App Store và trên Google Play, mỗi cửa hàng có mã sản phẩm riêng. Hạ Tầng giữ cả ba trên cùng một sản phẩm: khách nhắn từ ứng dụng iOS thấy giá App Store, từ ứng dụng Android thấy giá Google Play, trên web thấy giá web. Gói của từng khách (đang dùng, dùng thử, đã tắt gia hạn, hết hạn, hoàn tiền) và các giao dịch mua một lần sẽ hiện trên hồ sơ của họ.

Có hai cách đưa giao dịch vào Hạ Tầng, dùng cả hai cùng lúc cũng được:

  • Kết nối App Store và Google Play. Hạ Tầng tự kiểm tra từng giao dịch với Apple hoặc Google, và nhận mọi lần gia hạn, huỷ, hoàn tiền từ cửa hàng. Ứng dụng truyền mã tài khoản của khách khi mua. Hợp với ứng dụng mà server chưa tự kiểm tra giao dịch trong cửa hàng.
  • Gửi từ hệ thống của bạn. Server của bạn, vốn đã kiểm tra giao dịch với cửa hàng hoặc thu tiền trên website, gửi từng gói và giao dịch sang Hạ Tầng. Không cần kết nối gì trong cửa hàng. Hợp với ứng dụng đã có backend xử lý mua trong ứng dụng, và mọi thứ bạn bán trên web.

Cùng một giao dịch gửi theo cả hai cách vẫn chỉ là một bản ghi.

Cần quyền Làm việc với module Sản phẩm để sửa sản phẩm, và quyền Quản lý với Hỗ trợ khách hàng để kết nối cửa hàng.

Tạo một gói thuê bao

  1. Vào Sản phẩm → Danh mục, bấm Thêm sản phẩm (hoặc mở một sản phẩm có sẵn).
  2. Ở Loại, chọn:
    • Gói thuê bao cho gói trả theo kỳ; rồi chọn Chu kỳ (hằng tuần, hằng tháng, 3 tháng, 6 tháng, hằng năm) và Dùng thử (ngày) nếu có;
    • Mua trong ứng dụng, dùng nhiều lần cho thứ dùng hết rồi mua lại (xu, lượt);
    • Mua trong ứng dụng, mua một lần cho thứ mua một lần dùng mãi (mở khoá tính năng);
    • Sản phẩm số cho phần mềm bán một lần trên web.
  3. Giá trên web (₫) và URL trang sản phẩm là giá và trang thanh toán cho khách trên web.
  4. Mở Giá trên App Store và Google Play và điền cho từng cửa hàng:
    • Mã sản phẩm bạn đã tạo trong App Store Connect hoặc Play Console;
    • Giá và Tiền tệ bạn đặt ở cửa hàng đó, ví dụ 4.99 USD trên App Store và 219000 VND trên Google Play;
    • với gói thuê bao trên Google Play: Base plan ID và Offer ID (nếu có ưu đãi như dùng thử).
  5. Nếu gói có biến thể với mã riêng (ví dụ gói Năm), điền ở Giá riêng theo biến thể, mỗi dòng một biến thể: ios | Năm | 49.99 | USD | com.app.pro.yearly.
  6. Điền SKU là mã riêng của bạn cho gói (ví dụ PRO-1M). Giao dịch do hệ thống của bạn gửi sang, nhất là giao dịch trên website vốn không có mã cửa hàng, tìm sản phẩm theo SKU này, nên hồ sơ khách hiện đúng tên gói.
  7. Bấm Lưu.

Nhập nhiều gói cùng lúc bằng file CSV với các cột kind, billing_period, trial_days, ios_product_id, ios_price, ios_currency, android_product_id, android_price, android_currency, android_base_plan_id (xem Danh mục sản phẩm).

Khách và trợ lý AI thấy gì

  • Thẻ sản phẩm gửi cho khách mang giá của nền tảng khách đang dùng, kèm chu kỳ và ngày dùng thử. Trong ứng dụng, thẻ chỉ mang mã của cửa hàng đó, để nút Mua mở đúng giao dịch của Apple hoặc Google; trên web, thẻ mang trang thanh toán.
  • Trợ lý AI báo đúng giá theo nền tảng ("4,99 USD/tháng trên App Store, dùng thử 7 ngày"). Với gói mua trong ứng dụng, trợ lý không bao giờ đưa mã chuyển khoản hay tạo đơn nháp, vì Apple và Google bắt buộc thanh toán qua cửa hàng.
  • Nhân viên gửi thẻ từ ô soạn tin (Sản phẩm) cũng được giá theo nền tảng của khách.

Kết nối App Store và Google Play

Kết nối để mọi lần mua, gia hạn, huỷ và hoàn tiền từ cửa hàng tự về Hạ Tầng. Lập trình viên cần thêm một bước trong ứng dụng: truyền mã tài khoản của khách khi mua (xem hướng dẫn SDK), để mỗi giao dịch về đúng hồ sơ khách.

Nếu server của bạn đã nhận thông báo từ cửa hàng thì không cần làm phần này: Apple chỉ cho một URL nhận thông báo cho mỗi môi trường, nên hãy giữ URL đó ở server của bạn và gửi giao dịch từ hệ thống của bạn.

App Store

  1. Vào Hỗ trợ khách hàng → Kênh, mở ứng dụng iOS của bạn.
  2. Ở Thuê bao từ App Store và Google Play, điền Bundle ID của ứng dụng rồi bấm Kết nối.
  3. Sao chép URL nhận thông báo.
  4. Trong App Store Connect, mở ứng dụng → App Information → App Store Server Notifications, dán URL vào Production và Sandbox, chọn Version 2.
  5. Bấm Request a Test Notification. Trang ứng dụng trong Hạ Tầng hiện "Nhận thông báo gần nhất" kèm thời gian.

Khoá App Store Server API (tuỳ chọn). Có khoá này, Hạ Tầng hỏi lại Apple bất cứ lúc nào thay vì chỉ chờ thông báo: nút Làm mới trên từng gói, kiểm tra hằng ngày các gói tới kỳ gia hạn (phòng khi một thông báo bị lạc), và nhập khách đã mua từ trước khi bạn kết nối.

  1. Trong App Store Connect → Users and Access → Integrations → In-App Purchase, tạo một khoá. Ghi lại Issuer ID và Key ID, tải tệp .p8 (Apple chỉ cho tải một lần).
  2. Trong Hạ Tầng, mở Khoá App Store Server API ở cùng thẻ, điền hai mã, chọn tệp .p8 và bấm Lưu.

Google Play

  1. Trong Google Cloud, tạo một service account, rồi trong Play Console → Users and permissions mời email của nó với quyền View financial data và Manage orders and subscriptions (để Hạ Tầng xác nhận giao dịch với Google). Tải về khoá JSON của service account.
  2. Trong Hạ Tầng, mở ứng dụng Android ở Kênh, điền Package name, tải lên khoá JSON và bấm Kết nối.
  3. Sao chép URL đẩy.
  4. Trong Google Cloud, tạo một topic Pub/Sub, cấp quyền Publisher cho [email protected], rồi tạo một subscription kiểu Push với URL vừa sao chép.
  5. Trong Play Console → Monetization setup, điền tên topic và bấm Send test notification.

Nếu một thông báo bị từ chối (sai bundle ID, sai package, khoá hết quyền), trang ứng dụng hiện Lỗi gần nhất với lý do.

Gói của khách trên hồ sơ

Phần Gói đang dùng hiện ở khung bên phải của hội thoại và trên trang khách hàng: tên gói, cửa hàng, trạng thái và ngày gia hạn hoặc hết hạn.

Trạng thái Nghĩa là
Dùng thử Đang trong thời gian dùng thử
Đang dùng Đã trả tiền, sẽ tự gia hạn
Đang gia hạn lại Lần trả tiền gần nhất lỗi, cửa hàng đang thử lại; khách vẫn dùng được
Tạm giữ (lỗi thanh toán) Cửa hàng ngừng cấp quyền tới khi khách cập nhật cách thanh toán
Tạm dừng Khách tạm dừng gói (Google Play)
Đã tắt gia hạn Khách đã huỷ; vẫn dùng tới hết kỳ
Hết hạn Kỳ cuối đã kết thúc
Đã hoàn tiền / Đã thu hồi Cửa hàng hoàn tiền hoặc thu hồi giao dịch

Trợ lý AI cũng đọc phần này, nên trả lời được "tôi đang dùng gói gì", "khi nào gia hạn". Với gói mua qua App Store hoặc Google Play, trợ lý hướng khách tới Apple hoặc Google cho việc hoàn tiền và đổi cách thanh toán, và không bao giờ hứa hoàn tiền.

Khi đã kết nối cửa hàng, ngay sau mỗi lần mua, ứng dụng gửi bằng chứng giao dịch của cửa hàng (SDK reportPurchase). Hạ Tầng kiểm tra nó với Apple hoặc Google rồi mới ghi gói vào hồ sơ; giao dịch giả bị từ chối. Với Google Play, Hạ Tầng cũng xác nhận (acknowledge) giao dịch, nên Google không tự hoàn tiền sau ba ngày. Hội thoại đang mở có thêm một ghi chú nội bộ ("Khách báo đã mua … trên App Store. App Store đã xác nhận giao dịch.").

Khách mua trước khi đăng nhập trong ứng dụng cũng không mất gói: khi ứng dụng định danh khách, các giao dịch trên máy đó chuyển về hồ sơ của khách.

Mua một lần

Các giao dịch mua một lần (gói xu, mở khoá vĩnh viễn, gói không tự gia hạn, khoá học) hiện ngay dưới các gói thuê bao, với loại (Mua dùng dần, Mua một lần, Gói không tự gia hạn), nơi mua (App Store, Google Play hoặc Web) và ngày mua. Khi cửa hàng hoặc hệ thống của bạn báo hoàn tiền, dòng đó hiện Đã hoàn tiền.

Làm mới và nhập khách cũ

  • Làm mới cạnh một gói App Store hoặc Google Play hỏi lại cửa hàng ngay. Chỉ dùng được khi đã kết nối cửa hàng, và cần khoá App Store Server API (iOS) hoặc service account (Android).
  • Để nhập khách đã mua trước khi kết nối, lập trình viên gửi danh sách mã giao dịch Apple hoặc purchase token Google Play qua API (POST /chat/subscriptions/import, tối đa 500 mã mỗi lần).

Gửi gói và giao dịch từ hệ thống của bạn

Lập trình viên gửi sang Hạ Tầng những gì hệ thống của bạn đã biết, ngay sau mỗi thay đổi: một lần mua, gia hạn, hết hạn hay hoàn tiền. Cách này dùng cho:

  • Gói thanh toán trên website (chuyển khoản, cổng thanh toán của bạn);
  • Gói và giao dịch trên App Store, Google Play mà server của bạn đã tự kiểm tra với Apple hoặc Google;
  • Giao dịch mua một lần: gói xu, mở khoá, khoá học, trên web hay trong cửa hàng, kèm hoàn tiền.

Cách hoạt động:

  • Mỗi bản ghi mang mã người dùng mà ứng dụng và website của bạn dùng để định danh khách trong chat, nên về đúng hồ sơ khách. Bản ghi của người chưa từng mở chat sẽ hiện ngay khi họ mở.
  • Gói và giao dịch tìm sản phẩm theo SKU hoặc mã sản phẩm App Store / Google Play, nên hãy điền các mã này cho sản phẩm.
  • Gửi lại cùng một gói hoặc giao dịch chỉ cập nhật bản ghi cũ, nên hệ thống có thể gửi lại toàn bộ sau mỗi thay đổi, và gửi lịch sử một lần để có dữ liệu của khách đã mua từ trước.
  • Lập trình viên dùng SDK Node.js (@hatang/sdk 0.6.0 trở lên), SDK Python (hatang) hoặc REST API, với API key có quyền ghi CRM. Xem Gửi giao dịch từ backend, SDK Node.js và SDK Python.

Bài viết này có giúp ích cho bạn không?

Bài viết liên quan

Chưa tìm thấy điều bạn cần?

Đội ngũ của chúng tôi trả lời qua chat, bằng tiếng Việt hoặc tiếng Anh.

Gửi email cho chúng tôi

Bạn đang tích hợp API hoặc SDK? Xem tài liệu cho lập trình viên →