Atone là cổng thanh toán trả-sau (BNPL) của Nhật. Loverec cần tích hợp Atone song song với các cổng thẻ tín dụng hiện tại, áp dụng cho mua coin/retail video và gói sub gia hạn (VIP, FullHD, Members Plan).
Phạm vi triển khai
Mua 1 lần: Coin, Point, Retail Video — Atone tính phí một lần ngay sau khi xét duyệt thành công
Sub gia hạn hàng tháng: VIP, FullHD, Members Plan — Atone xử lý gia hạn tự động dựa trên token xác thực đã lưu
Hai loại dịch vụ Atone:
翌月後払い (Service Type 01): Thanh toán sau vào tháng kế tiếp — chuyển khoản / ATM / conbini
つど後払い (Service Type 04 — Atone Lite): Thanh toán sau theo từng lần
Switch giữa Atone và thẻ tín dụng: User được tự do đổi qua lại bất cứ lúc nào, kể cả khi đang có sub đang chạy
Bối cảnh quan trọng
Hiện tại đã có 1 phiên bản tích hợp Atone (PR đã merge vào branch phát triển), nhưng phía Atone yêu cầu thay đổi flow gia hạn sub. Solution này tập trung mô tả flow đúng cuối cùng sau khi đã trao đổi với Atone — bao gồm điểm khác biệt so với cổng thẻ tín dụng hiện có và những đặc thù Atone bắt buộc Loverec phải tuân theo.
3
User-facing flows mới
4
Màn hình thay đổi
8
User stories
2-3
Tuần dự kiến
2 Hiện trạng hệ thống Loverec
Trước khi bổ sung Atone, hệ thống hiện đang vận hành các flow thanh toán sau:
2.1 Các phương thức thanh toán đang có
Loverec hiện đang hỗ trợ nhiều cổng thanh toán thẻ tín dụng, mỗi cổng phục vụ một số dòng thẻ:
Cổng A: VISA, Mastercard
Cổng B: JCB, AMEX
Mỗi cổng có cơ chế riêng để lấy token xác thực thẻ (3DS) khi user thêm thẻ
Tất cả các thẻ user đã thêm được lưu lại để dùng cho các giao dịch sau. User có thể có nhiều thẻ, nhưng chỉ có 1 thẻ được set làm mặc định tại 1 thời điểm.
2.2 Cách thẻ mặc định hoạt động
Quy tắc hiện tại trên hệ thống:
Mỗi giao dịch người dùng thực hiện, phương thức đang được chọn sẽ trở thành phương thức mặc định cho tất cả giao dịch tự động sau đó (kể cả gia hạn sub).
Không phân biệt sản phẩm: mua coin lần này bằng thẻ B → kỳ gia hạn VIP sub kế tiếp cũng tự động dùng thẻ B (dù trước đó VIP sub đang gia hạn bằng thẻ A).
User cũng có thể vào trang "Phương thức thanh toán" trong Account để chủ động đổi thẻ mặc định.
2.3 Flow mua sub & gia hạn hiện tại (với thẻ tín dụng)
UserChọn gói sub và phương thức thanh toán
Trên trang gói VIP / FullHD / Plan, user chọn gói + chọn thẻ đã có (hoặc thêm thẻ mới).
LRCXử lý thanh toán lần đầu
Hệ thống gọi cổng thanh toán tương ứng để charge tiền. Nếu thành công, cấp quyền sub cho user, ghi lịch sử giao dịch, lưu thẻ này làm mặc định.
Cron gia hạnGia hạn tự động hàng tháng
Cron job chạy vào ngày trước hạn (n-1) và ngày hạn (0h ngày n). Lấy thẻ mặc định của user → charge tiền → nếu thành công, kéo dài sub thêm 1 chu kỳ.
LRCXử lý gia hạn fail
Nếu gia hạn fail (hết hạn mức, thẻ expired, …), hệ thống ghi log fail, gửi mail + noti cho user, hiển thị popup retry trong app để user đổi thẻ và thử lại thủ công.
2.4 Trang quản lý thẻ & switch payment method
User có trang Account → Phương thức thanh toán để:
Xem danh sách thẻ đã đăng ký
Đánh dấu thẻ nào là mặc định (radio button)
Thêm thẻ mới
Xóa thẻ
Khi đổi thẻ mặc định, hệ thống hiển thị confirm popup: 支払いカードを変更しますか。 ("Đổi thẻ thanh toán?") trước khi áp dụng.
2.5 Cách hệ thống xử lý lỗi thanh toán hiện tại
Các lỗi thanh toán thẻ được phân nhóm:
Lỗi thẻ: thẻ hết hạn, không đủ hạn mức, thẻ bị block → noti user đổi thẻ
Lỗi hệ thống: timeout, cổng thanh toán không phản hồi → retry tự động
Lỗi tạm thời: nhóm các lỗi có thể retry sau (network, gateway busy)
Mỗi nhóm lỗi có thông điệp riêng cho user, có/không retry tự động, có/không gửi mail/noti.
3 Atone là gì? Khác thẻ tín dụng thế nào?
Phần này giải thích đặc thù của Atone để hiểu vì sao flow phải khác card.
3.1 Atone là cổng "trả sau"
User không cần thẻ tín dụng để thanh toán bằng Atone. Atone tạm ứng tiền cho merchant ngay khi xét duyệt OK; user trả tiền cho Atone qua chuyển khoản/ATM/conbini sau (hằng tháng hoặc theo từng lần).
Atone định danh user bằng số điện thoại + OTP, không phải số thẻ.
Một user chỉ cần xác thực 1 lần (nhập SĐT + OTP), nhận về token xác thực, dùng cho tất cả các giao dịch sau.
3.2 Khác biệt chính so với thẻ tín dụng trên Loverec
Khía cạnh
Thẻ tín dụng hiện tại
Atone
Định danh user
Số thẻ + tên chủ thẻ + 4 số cuối hiển thị được
Chỉ có token; không có thông tin hiển thị nào để phân biệt nhiều Atone token
Lần đầu thanh toán
User nhập thông tin thẻ + xác thực 3DS
User nhập SĐT + nhận OTP qua tin nhắn → nhập OTP để xác thực
Gia hạn sub
Charge bằng token thẻ đã lưu, mỗi giao dịch độc lập
Bắt buộc đánh dấu giao dịch là "định kỳ" và gửi kèm ID giao dịch lần đầu trong tất cả các lần gia hạn sau
Switch payment method
Đổi trực tiếp giữa các thẻ đã có
Phải xác thực lại bằng module riêng mỗi khi quay lại Atone (khác module thanh toán)
Webhook/Callback
Callback đồng bộ, có webhook backup
Callback trả về ngay sau giao dịch; webhook trễ 30-60 giây (cố ý, dùng để reconcile)
Refund & hủy
Gọi API hủy hoặc refund trực tiếp
Atone không cần hủy khi user switch sang cổng khác; refund qua API riêng
Xét duyệt
3DS instant approve/reject
Có khả năng Screening NG (xét duyệt không đạt) ngay cả ở gia hạn tự động — Atone từ chối charge với lý do tín dụng
3.3 Hai loại dịch vụ Atone
翌月後払い — Service Type "01"
Tổng hợp tất cả giao dịch trong tháng, gửi 1 hóa đơn vào tháng sau. User trả qua chuyển khoản / ATM / conbini / direct debit.
Phù hợp: User mua thường xuyên, muốn gom thanh toán.
つど後払い — Service Type "04" (Lite)
Mỗi giao dịch sinh 1 hóa đơn riêng, user trả từng lần. Atone bản nhẹ.
Phù hợp: User mua thưa, muốn trả ngay từng đơn.
User chọn loại service type lần đầu khi đăng ký Atone. Loại đã chọn sẽ được lưu và dùng cho các giao dịch sau, trừ khi user chủ động đổi.
3.4 Quy tắc đặc thù gia hạn sub của Atone
Quy tắc bắt buộc từ Atone
Để gia hạn sub bằng Atone tự động lâu dài (mà không bị lỗi token hết hạn khi user đổi mật khẩu Atone), mọi giao dịch sub bắt buộc:
Đánh dấu là "định kỳ" (transaction_options = "01")
Từ lần thứ 2 trở đi, gửi kèm ID của giao dịch sub lần đầu (first_transaction_id)
Nếu không tuân theo, Atone có thể trả lỗi token expired (EATN0104) khi user đổi mật khẩu Atone account, khiến gia hạn fail.
3.5 Module Atone — 2 chế độ
Atone cung cấp 1 module JavaScript chạy trên trang Loverec, có 2 chế độ:
Chế độ thanh toán (modal_mode=01): dùng cho mua hàng / sub lần đầu. User xác thực + đồng ý charge ngay.
Chế độ xác thực thành viên (modal_mode=02): dùng khi user muốn đăng ký Atone (hoặc đăng ký lại) mà không phát sinh giao dịch. Chỉ cấp token xác thực.
Khi user switch payment method từ thẻ sang Atone (mà sub đang chạy), Loverec phải dùng chế độ xác thực (02) vì giao dịch sub lần đầu đã xảy ra bằng thẻ, không cần charge mới.
4 User stories
Mô tả mong muốn của từng vai khi dùng tính năng Atone.
US-01
Mua coin / point / retail video bằng Atone (one-time)
Là một user Nhật chưa có thẻ tín dụng, tôi muốn mua coin hoặc xem video trả phí bằng Atone, để tôi có thể trả tiền sau qua conbini/chuyển khoản mà không cần thẻ.
Acceptance criteria
Trên trang chọn phương thức thanh toán, có thêm option "Atone (翌月後払い / つど後払い)" cạnh các thẻ tín dụng
Khi chọn Atone, hệ thống mở module Atone, user nhập SĐT + OTP để xác thực
Sau khi xác thực + xét duyệt OK, hệ thống cấp ngay coin/quyền xem video, lưu token Atone vào danh sách phương thức thanh toán
Nếu xét duyệt fail (NG), hiển thị thông báo lý do và gợi ý đổi sang phương thức khác
US-02
Mua gói sub (VIP/FullHD/Plan) bằng Atone lần đầu
Là một user đã chọn dùng Atone, tôi muốn mua gói sub VIP/FullHD/Plan và để gia hạn tự động bằng Atone hằng tháng, để tôi không cần thao tác mỗi kỳ gia hạn.
Acceptance criteria
Trên trang mua sub, Atone hiển thị là option cạnh các thẻ
User chọn Atone → nếu user đang có cổng thanh toán mặc định khác, hiển thị popup hỏi "Đặt Atone làm mặc định mới" hay "chỉ dùng cho lần này"
Sau khi xác thực Atone + xét duyệt OK, sub được kích hoạt
Hệ thống lưu ID giao dịch lần đầu để dùng cho các kỳ gia hạn sau
Kỳ gia hạn kế tiếp diễn ra tự động vào ngày đúng hạn, không yêu cầu user thao tác lại
US-03
Switch giữa Atone và thẻ tín dụng khi đang có sub
Là một user đang có sub gia hạn bằng thẻ, tôi muốn chuyển sang gia hạn bằng Atone (hoặc ngược lại), để tôi có thể đổi phương thức trả tiền linh hoạt theo nhu cầu.
Acceptance criteria
Trên trang "Phương thức thanh toán" trong Account, user có thể thêm Atone vào danh sách mà không cần phát sinh giao dịch
Khi user click "Thêm Atone", hệ thống mở Atone Member Authentication Module (modal_mode=02), user xác thực SĐT + OTP, không charge tiền
Sau khi xác thực, Atone hiển thị trong danh sách phương thức thanh toán, user có thể chọn làm mặc định
Kỳ gia hạn sub kế tiếp sẽ tự động dùng Atone (giữ ID giao dịch lần đầu, dù trước đó sub được tạo bằng thẻ)
Ngược lại, khi đổi từ Atone sang thẻ, hệ thống không cần hủy giao dịch Atone
US-04
Retry thủ công khi gia hạn Atone fail
Là một user mà gia hạn sub bằng Atone vừa fail, tôi muốn retry thủ công bằng cách giữ Atone hoặc đổi sang thẻ, để sub của tôi không bị mất.
Acceptance criteria
Khi gia hạn fail, user nhận mail + noti có nội dung mô tả lý do và CTA
Vào app, popup retry thanh toán hiển thị tự động (giống flow hiện tại với thẻ)
Trong popup retry, user thấy danh sách phương thức (Atone + các thẻ đã có) và có thể chọn 1 trong số đó để thử lại
Nếu chọn Atone lại và xét duyệt OK → kích hoạt lại sub; nếu fail tiếp → noti và cho phép thử tiếp
US-05
Xem trạng thái Atone trong danh sách phương thức thanh toán
Là một user đã đăng ký Atone, tôi muốn thấy Atone trong danh sách phương thức thanh toán của tôi, để biết đã đăng ký và có thể chọn lại khi cần.
Acceptance criteria
Trên trang quản lý phương thức thanh toán, hiển thị item Atone với icon + label "atone 翌月後払い" hoặc "atone つど後払い" (tùy service type)
Vì Atone không có số thẻ, không hiển thị "**** 1234"; chỉ icon + label dịch vụ
User có thể chọn Atone làm mặc định hoặc xóa (sẽ phải xác thực lại nếu dùng lại sau)
US-06
Nhận noti / mail khi giao dịch Atone diễn ra
Là một user dùng Atone, tôi muốn nhận thông báo cho từng sự kiện thanh toán Atone, để theo dõi và xử lý kịp thời.
Acceptance criteria
Khi thanh toán Atone thành công (mua hoặc gia hạn): nhận mail xác nhận + noti
Khi gia hạn fail: mail + noti có nội dung lý do và link vào app retry
Khi xét duyệt Atone không đạt (Screening NG): mail + noti hướng dẫn liên hệ Atone hoặc đổi phương thức
Khi switch payment method thành công: mail xác nhận
US-07
Admin xem & quản lý giao dịch Atone
Là một admin Loverec, tôi muốn xem danh sách giao dịch Atone, log lỗi, và thực hiện retry/refund thủ công, để support khách hàng và monitor hoạt động của Atone.
Acceptance criteria
Trong CMS, có trang riêng "Atone Transactions" với filter theo: user, ngày, status, service type, mã lỗi
Admin click vào 1 giao dịch → xem chi tiết: payload gửi/nhận, log, trạng thái Atone
Admin có thể trigger refund / retry / mark-as-handled cho các giao dịch fail
Admin có thể xem nhóm lỗi Atone (riêng, không trộn vào nhóm lỗi card)
US-08
Hệ thống tự động đối soát callback vs webhook
Là hệ thống Loverec, tôi muốn tự động phát hiện mismatch giữa callback (đến ngay) và webhook (đến sau 30-60s), để đảm bảo trạng thái giao dịch luôn nhất quán với Atone.
Acceptance criteria
Khi callback và webhook có kết quả khác nhau, hệ thống tự động gọi API "Transaction Reference" của Atone để check trạng thái thực
Nếu Atone báo giao dịch không thành công, hệ thống tự rollback (thu hồi quyền sub, hoàn coin, …) và noti user
Mọi event mismatch được ghi log để admin review
5 Flow xử lý mới (chi tiết)
3 flow chính: (a) mua sub Atone lần đầu, (b) gia hạn sub tự động, (c) switch payment method.
5.1 — Flow A: Mua sub bằng Atone lần đầu
UserChọn gói sub + chọn Atone
Trên trang chọn gói VIP/FullHD/Plan, user chọn 1 gói, sau đó chọn Atone trong danh sách phương thức thanh toán. Nếu chưa có Atone token (lần đầu), user chọn 1 trong 2 service type: 翌月後払い hoặc つど後払い.
LRC FEHiển thị popup "Default vs One-time"
Nếu user đã có cổng thanh toán mặc định khác (thẻ), hiển thị popup 2 lựa chọn:
• Đặt Atone làm mặc định mới — các sub khác đang chạy sẽ cũng chuyển sang gia hạn bằng Atone từ kỳ kế tiếp
• Chỉ áp dụng cho lần này — sub mới dùng Atone, sub cũ vẫn dùng thẻ
Atone ModuleUser xác thực + xét duyệt
Module thanh toán Atone (modal_mode=01) mở trên trang. User nhập SĐT, nhận OTP qua tin nhắn, nhập OTP. Atone xét duyệt tín dụng.
AtoneCallback kết quả về LRC
Sau khi xét duyệt OK, Atone gọi callback "authenticated" → cấp token cho user. Tiếp đó gọi callback "succeeded" → trả về ID giao dịch.
LRC BELưu token + ID giao dịch lần đầu
Lưu token xác thực + service type vào hồ sơ phương thức thanh toán của user. Lưu ID giao dịch (first_transaction_id) gắn với sub vừa mua — dùng cho các kỳ gia hạn sau.
LRC BEKích hoạt sub + gửi mail/noti
Cấp quyền VIP/FullHD/Plan cho user, ghi vào lịch sử giao dịch, gửi mail xác nhận, gửi noti in-app.
LRC FEHiển thị màn success
User thấy popup "Thanh toán thành công" + thông tin sub mới được kích hoạt + ngày gia hạn tiếp theo.
Atone (sau 30-60s)Webhook đến để reconcile
Webhook của Atone gửi event với cùng dữ liệu callback. Hệ thống check consistency, nếu mismatch → trigger reconciliation (xem flow D).
5.2 — Flow B: Gia hạn sub Atone tự động (không có user)
Cron jobQuét sub sắp hết hạn
Worker chạy theo lịch: ngày n-1 và 0h ngày n. Lọc các sub có phương thức thanh toán = Atone.
LRC BEBuild payload gọi Atone API
Với mỗi sub cần gia hạn, build payload có: token xác thực (đã lưu), service type, đánh dấu "định kỳ" (transaction_options=01), ID giao dịch lần đầu (first_transaction_id đã lưu), thông tin sản phẩm, tổng tiền.
AtoneCharge tiền + trả response
Atone xử lý request:
• Success: trả OK + transaction_id mới
• Screening NG: trả status 200 nhưng kết quả xét duyệt = không đạt
• Lỗi hệ thống: trả HTTP error
LRC BEXử lý kết quả
• Nếu success: kéo dài sub thêm 1 chu kỳ, ghi lịch sử giao dịch, gửi mail xác nhận
• Nếu Screening NG hoặc lỗi: ghi log fail, gửi mail + noti user, hiển thị popup retry trong app
Atone webhookWebhook reconcile (sau 30-60s)
Webhook gửi event tương ứng. Hệ thống check khớp với callback đã xử lý.
5.3 — Flow C: Switch payment method (thẻ ↔ Atone) khi đang có sub
UserVào trang phương thức thanh toán
User vào Account → Phương thức thanh toán, thấy danh sách thẻ đã có, có nút "Thêm Atone".
UserClick "Thêm Atone" hoặc đăng ký lại
Nếu chưa có Atone token → mở module xác thực; nếu đã có nhưng muốn đăng ký account Atone khác → cũng mở module xác thực.
Atone Auth ModuleUser xác thực (KHÔNG charge)
Module Atone mở ở chế độ xác thực thành viên (modal_mode=02) — khác chế độ thanh toán. User nhập SĐT + OTP. Atone chỉ cấp token, không phát sinh giao dịch.
LRC BELưu token mới (không tạo sub mới)
Lưu token Atone vào danh sách phương thức thanh toán của user. Không động chạm các sub đang chạy.
UserSet Atone làm mặc định
User chọn Atone trong danh sách phương thức thanh toán và đánh dấu mặc định. Confirm popup hiển thị: "Đổi phương thức thanh toán?". User xác nhận.
Cron gia hạn kế tiếp
Gia hạn sub bằng Atone
Worker chạy theo lịch, thấy sub đang được set Atone làm phương thức → gọi Atone API với token mới + first_transaction_id đã lưu từ lần đầu của sub đó. Atone cho phép gia hạn dù token mới (vì đánh dấu định kỳ).
5.4 — Flow D: Reconciliation khi mismatch callback vs webhook
LRC BEDetect mismatch
Khi webhook đến (30-60s sau callback), so sánh kết quả webhook với kết quả đã xử lý từ callback. Nếu khác → trigger reconcile.
LRC BEGọi Atone Transaction Reference API
Lấy trạng thái thực của giao dịch từ Atone (single source of truth).
LRC BERollback hoặc apply theo Atone
Nếu LRC đã cấp quyền sub mà Atone báo fail → thu hồi quyền, gửi mail xin lỗi user, ghi log incident. Nếu ngược lại → cấp lại quyền.
LRC BEAlert admin
Ghi log + send alert tới admin channel để theo dõi.
6 Thay đổi giao diện
4 màn hình thay đổi + 2 popup mới.
6.1 — Trang chọn gói & phương thức thanh toán (Charge / Rank / Subscription)
Hiện trạng: Hiển thị danh sách các thẻ tín dụng đã đăng ký + nút "Thêm thẻ mới".
Thay đổi:
Thêm option "Atone" trong danh sách phương thức thanh toán
Nếu user chưa có Atone token, chọn Atone sẽ mở dropdown/modal chọn service type (翌月後払い / つど後払い)
Nếu đã có Atone token, hiển thị icon Atone + label dịch vụ (không có 4 số cuối như thẻ)
6.3 — Trang quản lý phương thức thanh toán (Account)
Hiện trạng: Danh sách thẻ + nút "Thêm thẻ mới" (chỉ dẫn đến trang thêm thẻ tín dụng).
Thay đổi:
Thêm option "Thêm Atone" trong menu thêm phương thức thanh toán
Khi click "Thêm Atone" → mở Atone Authentication Module (modal_mode=02), không qua trang nhập thẻ thông thường
Atone hiển thị trong danh sách với format khác thẻ: chỉ icon + label dịch vụ (không có "**** 1234")
6.4 — Confirm popup khi đổi sang Atone
Hiện trạng: Confirm 支払いカードを変更しますか。 ("Đổi thẻ thanh toán?") khi đổi giữa 2 thẻ.
Thay đổi: Nội dung popup khi đổi sang Atone (hoặc đổi từ Atone) cần khác hơn:
Khi user đổi sang Atone lần đầu, thêm dòng giải thích về service type sẽ dùng
Khi user đổi từ Atone sang thẻ, không cần giải thích thêm
6.5 — Popup retry payment (khi gia hạn fail)
Hiện trạng: Khi gia hạn fail, popup hiển thị danh sách thẻ để user retry.
Thay đổi: Trong danh sách retry, hiển thị thêm Atone (nếu user đã đăng ký) với icon + label. Khi user chọn Atone để retry, gọi Atone gia hạn lại.
6.6 — Mail / Notification template (mới cho Atone)
Cần thiết kế template JP cho các sự kiện:
Atone thanh toán thành công (one-time hoặc sub lần đầu)
Atone gia hạn sub thành công
Atone gia hạn sub fail (với lý do tương ứng)
Atone xét duyệt không đạt (Screening NG)
Đổi phương thức thanh toán sang Atone thành công
Đổi phương thức thanh toán từ Atone sang thẻ thành công
Webhook reconciliation phát hiện inconsistency (chỉ gửi admin)
7 Việc cần làm — Frontend
Việc FE cần làm xoay quanh UI flow mới + tích hợp module Atone + xử lý popup/mail UX.
FE-W1: Phân biệt 2 chế độ module Atone (thanh toán vs xác thực)
Module Atone trên FE phải biết khi nào dùng chế độ thanh toán (cho mua coin/retail/sub lần đầu) và khi nào dùng chế độ xác thực (cho switch payment method khi đang có sub).
Khi user vào flow mua/sub lần đầu → mở chế độ thanh toán
Khi user vào trang thêm phương thức Atone → mở chế độ xác thực
2 chế độ có callback khác nhau (chế độ xác thực không có callback "succeeded" vì không charge)
FE-W2: Đánh dấu giao dịch "định kỳ" khi mua sub
Khi gọi Atone module cho gói sub, payload phải đánh dấu là "định kỳ". Khi gọi cho mua coin/retail video, không đánh dấu định kỳ.
Logic phân biệt sub vs purchase ở bước tạo payload
Đảm bảo không gửi nhầm flag định kỳ cho purchase one-time
FE-W3: Popup "Default vs One-time"
Component mới hiển thị TRƯỚC khi mở Atone module trong flow mua sub, để user chọn có set Atone làm mặc định hay chỉ áp dụng lần này.
Chỉ hiển thị khi user đang có cổng thanh toán mặc định khác Atone
Lựa chọn của user phải truyền xuống BE để lưu lại
Text JP chuẩn theo Atone spec
FE-W4: UI hiển thị Atone trong danh sách phương thức
Atone không có 4 số cuối hay tên thẻ, chỉ có icon Atone + label dịch vụ (翌月後払い hoặc つど後払い).
Update component card list trong các trang: chọn phương thức (Charge/Rank/Subscription), quản lý phương thức (Account), retry payment
Icon Atone (lấy từ tài liệu Atone)
Label dịch vụ JP
FE-W5: Trang thêm Atone vào danh sách phương thức thanh toán
User vào trang quản lý phương thức → có thêm option "Thêm Atone" cạnh option "Thêm thẻ". Click "Thêm Atone" mở module Atone ở chế độ xác thực (không charge).
Update menu thêm phương thức trong trang Account
Sau khi xác thực thành công, refresh danh sách phương thức
Nếu xác thực fail, hiển thị thông báo lỗi tương ứng
FE-W6: Confirm popup khi đổi sang/từ Atone
Update nội dung confirm popup hiện tại để phù hợp với Atone (vì Atone không phải "thẻ", text "支払いカード" không hợp).
Khi đổi sang Atone: text khác (vd: "支払い方法を atone に変更しますか。")
Khi đổi từ Atone sang thẻ: text khác (vd: "支払い方法をクレジットカードに変更しますか。")
Khi đổi giữa 2 thẻ: giữ nguyên text cũ
FE-W7: Atone trong popup retry payment khi gia hạn fail
Popup retry hiện tại liệt kê các thẻ user có. Cần thêm Atone vào danh sách này (nếu user đã đăng ký Atone).
User chọn Atone trong popup retry → gọi gia hạn lại bằng Atone
Hiển thị loading state khi retry
Hiển thị success/fail message tương ứng
FE-W8: Mapping mã lỗi Atone → message UI
Mỗi mã lỗi Atone hiển thị message phù hợp cho user (xem chi tiết §10).
Phân biệt nhóm lỗi: lỗi xét duyệt (Screening NG), lỗi hệ thống, lỗi token, lỗi tạm thời
Mỗi nhóm có message + CTA khác nhau (retry / change method / contact support)
Atone không được gom vào nhóm "lỗi thẻ" — phải có nhóm riêng
8 Việc cần làm — Backend
BE đảm nhận: lưu trữ data, gọi API Atone (không gọi từ FE vì CORS), webhook handler, cron gia hạn, reconciliation, mail/noti.
BE-W1: Lưu trữ "ID giao dịch lần đầu" cho mỗi sub
Khi user mua sub Atone lần đầu, lưu ID giao dịch (first_transaction_id) gắn với sub đó. Từ kỳ gia hạn thứ 2 trở đi, gửi kèm ID này trong request gọi Atone.
Mỗi sub có riêng first_transaction_id của mình
Khi user switch payment method giữa Atone và thẻ, first_transaction_id giữ nguyên, không xóa
Khi user đăng ký Atone account khác (đổi SĐT), cần xem lại flow — có thể first_transaction_id của Atone cũ không thuộc Atone mới (mở Q&A §12)
BE-W2: Đánh dấu "định kỳ" trong tất cả request gia hạn sub Atone
Mọi request gia hạn sub bằng Atone phải gửi cờ "định kỳ" (transaction_options=01). Nếu thiếu, Atone có thể trả lỗi token expired khi user đổi mật khẩu Atone.
Phân biệt rõ giữa request mua 1 lần (không cần cờ) và request sub (cần cờ)
Áp dụng cho cả request mua sub lần đầu và gia hạn
BE-W3: Endpoint nhận callback từ Atone Authentication Module (chế độ xác thực)
Khi user vào trang thêm phương thức và xác thực Atone (không charge), Atone gọi callback về LRC. BE nhận callback này, lưu token mới mà không tạo giao dịch mới.
Phân biệt callback từ chế độ thanh toán vs chế độ xác thực
Chế độ xác thực chỉ lưu token, không tạo PaymentPending
Validate checksum để chống fake request
BE-W4: Lưu lựa chọn "default vs one-time" của user
FE truyền lựa chọn của user trong popup default xuống BE. BE dựa vào đó quyết định có set Atone làm mặc định hay không sau khi giao dịch thành công.
Nếu user chọn "Đặt làm mặc định": cập nhật mặc định = Atone, các thẻ khác không còn mặc định
Nếu user chọn "Chỉ áp dụng lần này": Atone được lưu vào danh sách nhưng không phải mặc định; sub khác vẫn dùng phương thức cũ
BE-W5: Webhook handler cho Atone (đã có nhưng cần cập nhật)
Webhook Atone đến sau callback 30-60 giây. Handler cần check consistency với callback và trigger reconciliation nếu mismatch.
So sánh kết quả webhook vs trạng thái đã xử lý từ callback
Nếu khác → gọi Atone Transaction Reference API để check trạng thái thực
Rollback hoặc apply theo dữ liệu từ Atone
Log + alert admin
BE-W6: Cron gia hạn sub Atone (mới)
Cron job hiện tại đang gia hạn sub bằng thẻ. Cần mở rộng để xử lý sub Atone với payload riêng (có cờ định kỳ + first_transaction_id).
Phân loại sub theo phương thức thanh toán đang dùng
Với sub Atone: build payload riêng, gọi Atone API
Xử lý response: success → kéo dài sub; fail → log + noti user retry
BE-W7: Retry tự động khi gia hạn Atone gặp lỗi tạm thời
Một số lỗi Atone có thể retry tự động (timeout, gateway busy). Phân loại và retry theo policy.
Retry tối đa 3 lần với cooldown tăng dần (5 phút, 30 phút, 2 giờ)
Sau khi retry max vẫn fail → gửi mail + noti user, hiển thị popup retry trong app
Các lỗi không retry được (NG xét duyệt, store ID sai, …) → noti user ngay
BE-W8: Mail + Notification cho các sự kiện Atone
Tạo template + logic gửi mail/noti cho từng sự kiện (xem §6.6).
Template JP cho từng event
Push notification + inbox notification (in-app)
Đảm bảo gửi sau khi giao dịch đã settle (không gửi sớm khi còn pending reconcile)
BE-W9: Xử lý môi trường test giả lập lỗi
Atone không hỗ trợ test các case fail trong môi trường sandbox. BE cần có cơ chế giả lập lỗi trong môi trường test/staging để QA test được full case.
Env flag để force giả lập lỗi (vd: lỗi xét duyệt, lỗi timeout, mismatch webhook)
Đảm bảo flag tắt mặc định trên prod
Document cách dùng cho QA
9 Việc cần làm — Admin CMS
Admin cần công cụ để xem và xử lý giao dịch Atone, đặc biệt là các case fail/screening NG cần can thiệp thủ công.
ADMIN-W1: Trang danh sách giao dịch Atone
List view các giao dịch Atone với filter và search.
Filter: user, ngày, status (success/fail/pending/screening NG), service type (01/04), mã lỗi
Column: user, ngày, số tiền, status, mã lỗi (nếu có)
Pagination + export CSV
ADMIN-W2: Detail page 1 giao dịch Atone
Xem chi tiết 1 giao dịch: payload gửi, response từ Atone, log webhook, log reconcile, mail/noti đã gửi.
Show full payload + response (JSON viewer)
Timeline các event của giao dịch
Action buttons: Refund, Mark as Handled, Retry, View User
ADMIN-W3: Manual refund / retry / mark-as-handled
Admin có thể can thiệp thủ công cho các giao dịch fail/screening NG.
Refund: gọi Atone refund API, ghi log
Retry: thử lại với cùng payload
Mark as handled: đánh dấu đã xử lý ngoài hệ thống (vd: refund qua kênh khác), không gọi Atone
Mọi action phải có audit log + lý do nhập tay
ADMIN-W4: Dashboard tổng quan Atone
Dashboard cho admin theo dõi sức khỏe Atone integration.
Tổng số giao dịch theo ngày/tuần/tháng
Tỷ lệ success vs fail
Top mã lỗi xuất hiện nhiều
Số lượng webhook mismatch
Alert khi tỷ lệ fail vượt ngưỡng
10 Xử lý mã lỗi Atone & thông báo cho user
Phân loại mã lỗi để định behavior + message phù hợp. KH yêu cầu: Atone không được gom vào nhóm "lỗi thẻ" vì Atone không dùng thẻ.
10.1 — Phân nhóm mã lỗi
Nhóm
Mã lỗi tiêu biểu
Behavior
Message UI
Xét duyệt không đạt (Screening NG)
auth_result=20, NG001 (vượt hạn mức), NG002 (thông tin thiếu), NG999
Không retry tự động. Noti user.
"Atone xét duyệt không đạt. Vui lòng đổi phương thức khác hoặc liên hệ Atone."
Token / xác thực
EATN0103 (token không tồn tại), EATN0303 (token hết hạn)
Yêu cầu user xác thực lại Atone.
"Phiên Atone đã hết hạn. Vui lòng xác thực lại."
Lỗi cấu hình / hệ thống Atone
EATN0306 (store ID), HTTP 500 từ Atone
Alert admin. Retry sau.
"Hệ thống thanh toán đang gặp sự cố. Vui lòng thử lại sau."
Lỗi tạm thời (mạng)
Timeout, HTTP 503
Retry tự động (3 lần).
Không hiển thị ngay, chờ retry; nếu fail max thì noti.
Generic "Có lỗi xảy ra, vui lòng liên hệ support."
Cần Q&A thêm
EATN0105 (half-width amount), EATN1118, EATN1119
Tạm map vào lỗi hệ thống, monitor log.
Generic message, đợi clarify từ Atone
SKIP (theo trao đổi Atone)
EATN0104 (token expired)
Không xảy ra vì luôn đánh dấu "định kỳ" cho sub.
—
10.2 — Mail / Notification mapping
Sự kiện
Mail
Push noti
Inbox noti
Mua coin/retail/sub lần đầu thành công
✓
—
✓
Gia hạn sub thành công
✓
—
✓
Gia hạn sub fail (system error)
✓ (lý do + link retry)
✓
✓
Xét duyệt NG (NG001/002/999)
✓ (hướng dẫn)
✓
✓
Token / cần xác thực lại
✓
✓
✓
Đổi phương thức thanh toán sang Atone
✓ (xác nhận)
—
✓
Đổi từ Atone sang phương thức khác
✓ (xác nhận)
—
✓
Webhook reconciliation phát hiện mismatch
Chỉ admin
—
—
11 Test scenarios
Test case chính theo hành vi user (do Lê Thị Huyền đề xuất + bổ sung).
11.1 — Test case core (4 TC do Lê Thị Huyền)
TC
Scenario
Expected outcome
TC1
User mua sub lần đầu bằng Atone account A → gia hạn lần 1 OK → user đổi sang Atone account B → gia hạn lần 2
Hệ thống giữ first_transaction_id từ Atone A, gia hạn bằng token Atone B. Cần Atone confirm flow này hợp lệ (đang chờ rep cho Comment #89).
TC2
User mua sub bằng Atone A → gia hạn lần 1 Atone A → đổi sang thẻ → gia hạn lần 2 bằng thẻ
Gia hạn lần 2 dùng thẻ, không gửi first_transaction_id (vì là gia hạn thẻ, không phải Atone).
TC3
User mua sub bằng Atone A → đổi sang thẻ → gia hạn lần 1 thẻ → đổi lại sang Atone B → gia hạn lần 2 Atone B
Khi quay lại Atone, hệ thống dùng first_transaction_id gốc (từ Atone A), kết hợp token Atone B. Atone xác nhận flow này.
TC4
User mua sub bằng thẻ → gia hạn lần 1 thẻ → đổi sang Atone → gia hạn lần 2 Atone
Vấn đề: chưa có first_transaction_id của Atone (vì sub mua bằng thẻ). Cần làm rõ: user phải đi qua flow mua mới lần đầu Atone? Hay tạo first_transaction_id từ giao dịch gia hạn Atone đầu tiên?
TC4 còn vướng — cần làm rõ trước khi implement
Theo flow trao đổi với Atone, khi user mua sub bằng thẻ rồi đổi sang Atone, lần gia hạn Atone đầu tiên cần phải đi qua module thanh toán Atone (modal_mode=01) để tạo first_transaction_id, KHÔNG phải dùng module xác thực (modal_mode=02). Cần thống nhất với KH + Atone về UX của TC này trước khi code.
11.2 — Test case bổ sung
TC5: Atone xét duyệt NG (Screening NG) lần đầu mua → hiển thị thông báo, gợi ý đổi phương thức
TC6: Gia hạn Atone fail với lỗi tạm thời (timeout) → hệ thống retry 3 lần, lần 3 fail → noti user
TC7: Callback Atone success nhưng webhook báo fail → reconciliation → rollback sub, noti user
TC8: User mua sub Atone với option "Default" → tất cả sub khác sang dùng Atone từ kỳ kế
TC9: User mua sub Atone với option "One-time" → sub khác vẫn dùng thẻ cũ
TC10: User chọn service type 01 (翌月後払い), giao dịch sau tự động dùng cùng service type
TC11: Regression — đảm bảo 3 cổng thẻ hiện tại không bị break
TC12: Mua coin one-time bằng Atone, KHÔNG được đánh dấu "định kỳ" (transaction_options không gửi)
11.3 — Môi trường test
Atone sandbox dev/staging đã có (xem §13 Tham chiếu)
Atone production: chưa cấp (block release) — phải request gấp
BE phải support env flag để giả lập các case fail (vì Atone sandbox không reproduce được error scenarios)
12 Vấn đề còn mở
Các điểm chưa rõ, cần Q&A với Atone hoặc thống nhất với KH trước khi triển khai.
Vấn đề
Mức độ
Hướng giải quyết
Atone chưa cấp môi trường Production. Hiện chỉ có sandbox.
Critical — block release
Request gấp từ KH liên hệ Atone. Phải có prod env trước thời điểm deploy.
TC4 chưa rõ flow: User mua sub bằng thẻ, sau đó switch sang Atone, kỳ gia hạn Atone đầu tiên đi qua module nào?
High
Họp với KH + Atone, vẽ diagram flow, chốt UX. Nhiều khả năng phải đi qua module thanh toán Atone (modal_mode=01) thay vì module xác thực.
TC từ Comment #89: Đổi Atone account 1 → 2, first_transaction_id từ TK1 không thuộc TK2 → có fail không?
Medium
Q&A với Atone. Nếu fail, design lại flow: khi đổi Atone account, reset first_transaction_id.
Mã lỗi EATN0105, EATN1118, EATN1119 chưa clarify từ Atone
Medium
Q&A với Atone. Tạm map vào lỗi hệ thống, monitor log, update sau.
Atone không hỗ trợ test case fail trong sandbox
Medium
BE phải có env flag giả lập các case fail. Document cách dùng cho QA. Đảm bảo flag tắt trên prod.
Atone yêu cầu sales_settled=false (Comment #49) — flow 2 bước: đăng ký giao dịch → call Sales Settlement API confirm
Medium
Cân nhắc refactor flow theo Atone recommendation. Hoặc thống nhất với Atone giữ sales_settled=true cho digital service.
Token Atone không có thông tin định danh (không có 4 số cuối hay tên), nếu user đăng ký nhiều Atone account thì UI khó phân biệt
Low
Hiển thị icon + service type label + ngày đăng ký. Nếu Atone có giải pháp, cập nhật sau.
KH claim đội dev hiểu sai specs (Comment #82)
Medium
Vẽ diagram flow (đã có drive link Comment #76), confirm với KH + Atone trên diagram trước implement. Họp MTG trực tiếp để tránh hiểu nhầm.
13 Estimate & lộ trình
13.1 — Estimate tổng (đã chốt với KH — Comment #78, #87)