- vừa được xem lúc

Payment with MoMo

0 0 49

Người đăng: Le Tan Thanh

Theo Viblo Asia

1. Giới thiệu MoMo:

  • MoMo Payment Platform API là giải pháp thanh toán cho các đơn vị kinh doanh, cho phép khách hàng sử dụng tài khoản Ví MoMo để thanh toán các dịch vụ trên nhiều nền tảng khác nhau: Desktop Website, Mobile Website, Mobile Application, POS, Pay In Bill, Web In App MoMo.

2. Các phương thức thanh toán của:

  • Cổng thanh toán MoMo (All In One): Áp dụng cho đối tác có thanh toán trên nền tảng Website, Mobile, Smart TV, ...
  • Thanh toán App-In-App: Áp dụng cho đối tác có ứng dụng di động (Android/iOS) muốn mở trực tiếp ứng dụng MoMo để thanh toán.
  • Thanh toán POS: Áp dụng cho đối tác có hệ thống bán hàng bằng máy POSS. Thu ngân dùng máy scan đẻ quét "MÃ THANH TOÁN" trên app MoMo để thanh toán.
  • Thanh toán QR Code: Đối tác tạo QR code để theo định dạng MoMo cung cấp, khách hàng chỉ cần dùng app MoMo để quét mã và thanh toán.

Trong bài viết này mình sẽ sử dụng cổng thanh toán MoMo All In One.

3. Quy trình tích hợp:

  • Thực hiện đăng ký business account tại https://business.momo.vn/.

  • Sau khi đăng ký account, môi trường mặc định của account là môi trường Test.

  • Bạn cần thực hiện đăng ký đầy đủ thông tin để đưa account lên môi trường Production.

  • Đối với từng loại môi trường, MoMo API cung cấp cho bạn các thông tin sau để cấu hình và sử dụng MoMo API

    1. Partner Code: Thông tin để định danh tài khoản doanh nghiệp.
    2. Access Key: Cấp quyền truy cập vào hệ thống MoMo.
    3. Secret Key: Dùng để tạo chữ ký điện tử signature.
    4. Public Key: Sử dụng để tạo mã hóa dữ liệu bằng thuật toán RSA.
  • Khi gọi Sử dụng MoMo API ta sẽ gọi tới 2 end point sau tùy theo môi trường:

    1. Môi trường test: https://test-payment.momo.vn
    2. Môi trường production: https://payment.momo.vn

4. Security:

  • MoMo sử dụng chữ ký điện tử và mã hóa dữ liệu để xác thực dữ liệu đầu vào và ra trên mỗi yêu cấu HTTP Request và HTTP Response.
  • Tham khảo source code tại GitHub của MoMo.

a. Chữ ký điện tử:

  • signature là chuỗi ký tự được tạo ra từ một thuật toán cho trước, sử dụng để kiểm tra tính đúng đắn của dữ liệu trên đường truyền giữa hai hệ thống.
  • Ví dụ
    digest = OpenSSL::Digest.new('sha256')
    signature = OpenSSL::HMAC.hexdigest(digest, serectkey, rawSignature)
    
  • MoMo sử dụng thuật toán SHA256 để tạo singature cho data của mỗi request.
  • serectkeySECRET_KEY của business account đã đăng ký với MoMo.
  • rawSignature là chuỗi được tạo từ data của order cần được thanh toán bởi MoMo theo cặp key=value và được nối lại với nahu bằng &, ví dụ: key1=value1&key2=value2.

b. Mã hóa RSA:

  • Mã hóa RSA là thuật toán mã hóa công khai để bảo vệ thông tin trên đường truyền.
  • Đối tác sử dựng PUBLIC_KEY của business account đã đăng ký với MoM để mã hóa data của order cần được thanh toán bởi MoMo.
  • MoMo sử dụng PRIVATE_KEY ứng với PUBLIC_KEY để giải mã và kiểm tra dữ liệu đã được mã hóa.

5. Cổng thanh toán MoMo (All In One):

a. Giới thiệu:

  • MoMo AIP Payment là giải pháp thanh toán của MoMo áp dụng trên nhiều nền tảng khác nhau chỉ trong 1 API duy nhất.
  • Đối với môi trường TEST bạn có thể download app MoMo TEST và thực hiện thanh toán hoặc sử dụng account test do MoMo cung cấp sẵn.
    Thành công Hạn mức 20.000.000 Hạn mức 5.000.000 Không thành công
    0917003003 0919100100 0918002000 0916005000
    0917030000 0919100010 0918002020 0916005050
    0917030003 0919100001 0918002200 0916005500
    0917030030 0919010100 - -
    0917030300 0919010010 - -
    0917300300 0919100101 - -
  • Mật khẩu: 000000.
  • Mã xác thực: 000000.
  • Thông tin chi tiết xem tại Thông tin Testing của MoMo.

b. Sơ đồ xử lý:

  • Thực hiện thanh toán với MoMo thông qua cổng thanh toán AIO trên web theo các bước sau:

    1. User click buttton thanh toán trên màn hình Web.
    2. Server gửi request lên MoMo.
    3. Momo trả HTTP Response về Server.
    4. Nếu request chứa data hợp lệ thì MoMo trả HTTP Response có errorCode là 0 là payUrl.
    5. Server thực hiện redirect đến payUrl của MoMo để user thực hiện thanh toán.
    6. Kết quả thanh toán được MoMo gửi đến returnUrrlnotifyUrl của server.
    7. Server nhận kết quả thanh toán và update order.
    8. Nếu request của bước 2 chứa data không hợp lệ thì tại bước 3 MoMo trả HTTP Response có errorCode khác 0 và message chứa nội dung lỗi.
  • Để thực hiện thanh toán với cổng thanh toán AIO, gửi request lên end point của MoMo.

    POST /gw_payment/transactionProcessor
    

c. Data request lên MoMo:

  • Các data cần gửi lên MoMo để thực hiện thanh toán thông qua cổng thanh toán AIO bao gồm.
    Attribute Description
    partnerCode PARTNER_CODE lấy từ business account đăng ký với MoMo
    accessKey ACCESS_KEY lấy từ business account đăng ký với MoMo
    requestId Định danh mỗi yêu cầu
    amount Số tiền cần thanh toán
    orderId Mã đơn hàng cần thanh toán (cần đảm bảo tính duy nhất)
    returnUrl Trang web mà MoMo sẽ redirect về sau khi user thực hiện thanh toán xong
    cần cung cấp cả domain và path của Url (ví dụ: https://example.com/orders/1)
    notifyUrl Trang web mà MoMo sẽ gửi data về thông qua IPN sau khi user thực hiện thanh toán xong
    cần cung cấp cả domain và path của Url (ví dụ: https://example.com/orders/1)
    requestType captureMoMoWallet
    signature Chữ ký điện tử để kiểm tra thông tin
    extraData Thông tin bổ sung cho order theo định dạng <key>=<value>;<key>=<value>
    mặc định là ""
  • Tham khảo tài liệu của MoMo để biết thêm chi tiết.
  • Tham khảo Momo::ApplicationSerrvice để xem ví dụ với Rails.
  • Mình sử dụng Momo::RequestSignatureService để tạo signature.

d. returnUrl và notifyUrl:

  • Là 2 url của Server mà MoMo sẽ gửi HTTP Response chứa kết quả thông tin thanh toán.
  • Với returnUrl MoMo sẽ gửi qua method GET, redirect từ MoMo về returnUrl sau khi user thực hiện thanh toán xong.
  • Với notifyUrl MoMo sẽ gửi qua method POST, MoMo thực hiện IPN để gửi data về notifyUrl sau khi user thực hiện thanh toán xong.
  • Với returnUrlnotifyUrl thực hiện kiểm tra data nhận về từ MoMo có khớp với data gửi lên MoMo hay không và update orders thông qua Momo::ConfirmOrrderServiceMomo::UpdateOrrderService.
  • Tránh trường hợp user tự gõ url để update order mà không thông qua thanh toán MoMo.
  • Trong code mẫu returnUrl ứng với MoMo::PaymentsController#shownotifyUrl ứng với MoMo::PaymentsController#update
  • MoMo::PaymentsController#create thực hiện gọi MoMo AIO API thông qua Momo::SendRequestService và redirect về payUrl để thực hiện thanh toán trên MoMo.
  • Ta cần sử dụng cả returnUrlnotifyUrl để tránh trường hợp MoMo không redirect về returnUrl (do timeout, user tắt trình duyệt) thì server vẫn nhận được data thông qua notifyUrl.

e. Data mà MoMo trả về:

  • Các data cần gửi lên MoMo để thực hiện thanh toán thông qua cổng thanh toán AIO bao gồm.
    Attribute Description
    partnerCode PARTNER_CODE lấy từ business account đăng ký với MoMo
    accessKey ACCESS_KEY lấy từ business account đăng ký với MoMo
    requestId Định danh mỗi yêu cầu
    amount Số tiền cần thanh toán
    orderId Mã đơn hàng cần thanh toán (cần đảm bảo tính duy nhất)
    returnUrl Trang web mà MoMo sẽ redirect về sau khi user thực hiện thanh toán xong
    cần cung cấp cả domain và path của Url (ví dụ: https://example.com/orders/1)
    notifyUrl Trang web mà MoMo sẽ gửi data về thông qua IPN sau khi user thực hiện thanh toán xong
    cần cung cấp cả domain và path của Url (ví dụ: https://example.com/orders/1)
    requestType captureMoMoWallet
    signature Chữ ký điện tử để kiểm tra thông tin
    extraData Thông tin bổ sung cho order theo định dạng <key>=<value>;<key>=<value>
    mặc định là ""

6. Màn hình demo:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 500

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 701

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 335

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 421

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414