Tìm hiểu về cổng thanh toán GMO

Giới thiệu

GMO là một cổng dịch vụ thanh toán số 1 của Nhật, Nó hỗ trợ nhiều hình thức thanh toán (credit card, multipayment như pay-easy convenience-store ...). Nó cung cấp đầy đủ các phương thức thanh toán chính của Nhật (theo như trên doc của nó 😄) Hiện tại GMO Payment Gateway, Inc có hơn 59.000 dịch vụ sử dụng để thanh toán. Dịch vụ đã được áp dụng không chỉ bởi các cửa hàng và doanh nghiệp trực tuyến của EC, mà cả các khoản thanh toán thẻ tín dụng định kỳ, thuế quốc gia, hóa đơn sử dụng và như vậy. Khối lượng giao dịch đã đạt được 1,7 nghìn tỷ Yên Nhật vào tháng 9 năm 2015. Và điều quan trọng nhất là nó cung cấp hỗ trợ cho các lập trình viên các API và môi trường test để tích hợp vào ứng dụng. Bên cạnh đó khó khăn khi mới bắt đầu tiếp cận API này là hầu hết tài liệu của nó đều bằng tiếng Nhật (GMO chỉ cho phép thanh toán bằng Yên Nhật) nên có rất ít bài viết về cổng thanh toán này trên Google.

Cơ chế làm việc

Để hiểu rõ về cơ chế mình xin lấy VD cụ thể từ hệ thống Book Tour du lịch mà hệ thống dự án mình đang tham gia:

  • EndUser book 1 Tour với số tiền cần thanh toán là 1tr Yên, request được Web server Merchant gửi đến PaymentGMO thông qua API của GMO.
  • PaymentGMO gửi yêu cầu xác nhận thông tin giao dịch đến ngân hàng.
  • Ngân hàng nhận được yêu cầu giao dịch 1tr Yên, kiểm tra tính hợp lệ của tài khoản EndUser, nếu hợp lệ => tiến hành chuyển tiền đến tài khoản merchant và trả thông tin về cho PaymentGMO, nếu không hủy bỏ giao dịch, báo message reject.
  • PaymentGMO trả kết quả về cho web Merchant.
  • web merchant trả kết quả về cho EndUser.

Một số thuật ngữ

  1. Merchant: Là cá nhân hoặc công ty bán sản phẩm hoặc dịch vụ, là nơi cung cấp các dịch vụ đến người dùng, ở đây là web của chúng ta.
  2. Credit Card - Thẻ tín dụng được sử dụng để mua sản phẩm hoặc dịch vụ thông qua tài khoản tín dụng. Thẻ này có số thẻ gồm 16 số.
  3. Pay-Easy: là hình thức đăng kí mua sản phẩm rồi tiến hành trả tiền qua các ATM, Internet Banking, ...
  4. convenience-store: là hình thức đăng kí mua sản phẩm rồi tiến hành trả tiền qua các Convenience Store
  5. Transaction - Giao dịch: là thực hiện 1 là thanh toán, kết thúc quá trình nếu thành công thì merchant nhận được tiền, endUser nhận được service
  6. Site: là một trang quản lý các shop và member
  7. Shop là nơi quản lý các transaction
  8. OrderID: là giá trị để merchant nhận biết về giao dịch, là duy nhất
  9. ShopID, ShopPass, SiteID, SitePass là các giá trị do GMO cung cấp khi đăng kí.
  10. AccessID, AccessPass là các giá trị được GMO trả về khi thực hiện 1 entry Transaction.
  11. còn nhiều khái niệm mà khi thực hiện implement GMO thì bạn sẽ phải tìm hiểu.

Đăng ký môi trường test

Để đăng ký sử dụng GMO cho môi trường test bạn làm theo hướng dẫn của bài Article https://viblo.asia/p/learn-about-gmo-payment-gateways-p1-3P0lPvgvKox, mình không viết lại nữa @@

Các Service gắn với nghiệp vụ của GMO

Ở phần này mình xin giải thích bằng cách áp dụng trực tiếp follow dự án mình đang làm vào cho trực quan: Note: Tên các service do hệ thống mình tự định nghĩa

  1. EndUser đăng ký card (add_card_service.rb): Để có thể thanh toán, endUser phải đăng ký card(VD: visa credit) trên hệ thống. Khi đăng ký, GMO sẽ quản lý User và Card trên Site và Shop của GMO, hay hiểu đơn giản hơn là để có thể sử dụng đc GMO bạn phải có user và có list card tương ứng vs User đó trên GMO.
class Payment::AddCardService < Payment::BaseService
  def initialize
    @client = GMO::Payment::SiteAPI.new({site_id: Settings.site_id,
      site_pass: Settings.site_pass, host: Settings.host})
    @error_info = nil
    @results = nil
  end

  def execute_request(options)
    register_member(options[:member_id])
    @client.save_card(
      member_id: options[:member_id],
      default_flag: options[:default_flag],
      seq_mode: options[:seq_mode],
      token: options[:token])
  end

  private
  def register_member(member_id)
    Payment::MemberRegisterService.new.perform({member_id: member_id})
  end
end

Trên đây là 1 VD để sử dụng API GMO đăng ký card và user. Trong hàm execute_request chúng ta thực hiện 2 thao tác: register_member rồi lưu card cho user đó. 2. Khi user Book 1 tour và cần thanh toán: Quá trình thanh toán diễn ra theo 3 bước:

  • Khởi tạo 1 transaction(transaction_entry_service.rb):
Payment::TransactionEntryService.new.perform({
    order_id: @order_id,
    job_cd: Settings.gmo.authenticate,
    amount: @reservation.total_price
 })
  • @order_id: số thự tự của Transaction, tự định nghĩa, là thuộc tính uniq
  • job_cd: trạng thái "AUTH"
  • amount: số tiền cần thanh toán của giao dịch cần AUTH Nếu thành công kết quả trả về là: Note: AccessID và AccessPass là đại diện cho 1 transaction, nó được sinh ra từ khi khởi tạo đến khi giao dịch kêt thúc
  • Tạo giao dịch tạm thời:
@client.exec_tran(
    member_id: options[:member_id],
    order_id: options[:order_id],
    card_seq: options[:card_seq],
    seq_mode: PHYSICAL_MODE,
    method: METHOD,
    access_id: options[:access_id],
    access_pass: options[:access_pass]
)

Đây là bước thứ hai để thanh toán. Sau khi gọi api AUTH, chúng ta sẽ nhận được AccessID và AccessPass để sử dụng để xác định giao dịch. Api này sẽ tạo ra việc thanh toán tạm thời với số tiền trong api AUTH đã gửi lên, chỉ định member_id và chỉ định card_seq của User đó.

  • Thực hiện giao dịch thực:
@client.alter_tran(
  job_cd: options[:job_cd],
  amount: options[:amount],
  access_id: options[:access_id],
  access_pass: options[:access_pass]
)

Đây là bước cuối cùng của 1 giao dịch thanh toán. Ở bước này giao dịch được xác nhận và hoàn tất.

  • Bonus: Đến bước 2, số tiền của User đã được trừ trong tài khoản và GMO là trung gian đang nắm giữ nó. Mặc định sau 90 ngày giao dịch không được xác nhận thì số tiền mới được back về cho User. Giả sử sau khi Book 1 tour nhưng không ưng ý, User có thể Cancel transaction đó và được trả lại tiền ngay lập tức(dĩ nhiên có mất phí) bằng service khác của GMO:
@client.alter_tran(
 job_cd: VOID,
 access_id: options[:access_id],
 access_pass: options[:access_pass]
)

Ngoài ra GMO vẫn còn rất nhiều các Service:

  • List card: Khi user muốn hiển thị danh sách các card có thể dùng.
  • Search User, card: Khi admin muốn tìm kiếm Card hoặc User.
  • Delete User: Khi withdraw 1 User cần xóa User đó trên GMO.

Nguồn tham khảo: https://viblo.asia/p/learn-about-gmo-payment-gateways-with-gem-gmo-p2-Qbq5QgLRZD8