Thanh Toán Bằng QR Cá Nhân
LUỒNG XỬ LÝ
Sơ đồ hoạt động
Diễn giải sơ đồ
- Bước 1: Người dùng đăng nhập app MoMo, chọn MÃ THANH TOÁN (Payment Code) để tạo mã thanh toán (
paymentCode
). - Bước 2: Thu ngân quét Barcode (hoặc QR code) trên màn hình của người dùng để lấy
paymentCode
. Thông tin sẽ được gửi đến server POS của nhà đối tác. - Bước 3: POS Server đóng gói và gửi thông tin giao dịch đã nhận được đến server MoMo để cấp quyền.
- Bước 4: Server nhà MoMo xử lý yêu cầu và trả kết quả cấp quyền về server POS. Nếu thất bại (không thể cấp quyền), giao dịch kết thúc ở đây. Nếu thành công, Server nhà MoMo sẽ gọi
notifyUrl
nếu có cấu hình (API được gọi bởi đối tác theo định dạng của MoMo, xem chi tiết để thông báo trạng thái đơn hàng của đối tác. - Bước 5: Server POS nhận kết quả trả về từ server của MoMo, xử lý và gửi yêu cầu phản hồi đến Server của MoMo để xác nhận giao dịch (
commit
hoặcrollback
) phụ thuộc vào kết quả xử lý. - Bước 6: Server của MoMo xử lý yêu cầu
confirm
và trả kết quả về server POS.
Xử lý thanh toán
Mô tả dữ liệu mà hệ thống POS gửi thông qua server MoMo để xin cấp quyền.
Thời gian timeout nhỏ nhất khi gọi API này nên là 20s để đảm bảo nhận phản hồi từ server của MoMo.
POST
/pay/pos
HTTP Request
Attribute | Type | Required | Description |
---|---|---|---|
partnerCode | String | Thông tin tích hợp | |
partnerRefId | String | Mã đơn hàng của đối tác Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$ | |
hash | String | RSA (jsonString , publicKey ) | |
version | Double | Version, hiện tại là 2.0 | |
payType | Integer | giá trị 3 | |
description | String | Chi tiết giao dịch | |
extra_data | Json | Json bao gồm thông tin chi tiết nếu có. Định dạng là: {\"key\": \"value\"} Giá trị mặc định là "" Thông tin SKU thêm: {"sku": "sku1, sku2,..."} |
Chi tiết nội dung của jsonString
Attribute | Type | Required | Description |
---|---|---|---|
partnerCode | String | Mã đối tác | |
partnerRefId | String | Mã đơn hàng của đối tác](/docs/payment/onboarding/integration-process#mã-đơn-hàng-của-đối-tác) | |
amount | Long | Số tiền cần thanh toán | |
paymentCode | String | Payment code được tạo từ app MoMo mà được scanned bởi thu ngân | |
storeId | String | Mã cửa hàng (nên truyền tham số để chi tiết hơn nếu được tạo từ của hàng) | |
storeName | String | Tên cửa hàng |
paymentCode
bao gồm 18-20 ký tự (bắt đầu với MM
trong trường hợp có 20 ký tự) và hết hạn sau 1 phút kể từ lúc tạo.
Ví dụ của
jsonString
{
"partnerCode": "MOMOIQA420180417",
"partnerRefId": "Merchant123556666",
"amount": 30000,
"paymentCode": "MM627755248085056826",
"storeId": "001",
"storeName": "Partner store 01"
}
Dữ liệu
hash
được mã hóa bởi thuật toán RSA
VwnYQbw5eg2XGVO6uGgyOETG9dBQXjdOw8OyBptZ5zvsUTPiNxMc4hi1sd7TTRkifG0kaOJVgplrLlyogFxcegyZzQ7LtjDr/4FtN8MfFKWozhxSWW2JYQyJ/klegGVpOTSkXkfUoueGdTSI2IJFS1pe5rxkmBdMWRilbyfOqbTdrWt50gjY2mQbhke7+9puGLgg8mh+NfYCbEZtHDKyDODA0MVNMNh3ATd31KwfNLm0zx6QQ6KXBq5M04cpTA6rIZ9uz3fxEwTvPycuxJtLvtFDpLapNAmUwqA2Rej3mTgOTN1+Jq9isqEueA0Ix3ip++d8GbJXJYkvYfr0XgT3zA==
Mẫu Request
{
"partnerCode": "MOMOIQA420180417",
"partnerRefId": "Merchant123556666",
"description": "Payment by MoMo POS",
"hash": "VwnYQbw5eg2XGVO6uGgyOETG9dBQXjdOw8OyBptZ5zvsUTPiNxMc4hi1sd7TTRkifG0kaOJVgplrLlyogFxcegyZzQ7LtjDr/4FtN8MfFKWozhxSWW2JYQyJ/klegGVpOTSkXkfUoueGdTSI2IJFS1pe5rxkmBdMWRilbyfOqbTdrWt50gjY2mQbhke7+9puGLgg8mh+NfYCbEZtHDKyDODA0MVNMNh3ATd31KwfNLm0zx6QQ6KXBq5M04cpTA6rIZ9uz3fxEwTvPycuxJtLvtFDpLapNAmUwqA2Rej3mTgOTN1+Jq9isqEueA0Ix3ip++d8GbJXJYkvYfr0XgT3zA==",
"version": 2,
"payType": 3
}
HTTP Response
Attribute | Type | Description |
---|---|---|
status | Integer | Trạng thái giao dịch |
message | Json | Json bao gồm nội dung chi tiết |
message.description | String | Mô tả chi tiết |
message.transid | Long | Mã giao dịch của MoMo |
message.amount | Long | Số tiền cần thanh toán |
message.phoneNumber | String | Số điện thoaị khách hàng dùng để đăng ký MoMo (ẩn 3 số) |
message.walletId | String | ID của ví MoMo |
Mẫu Response
{
"status": 0,
"message": {
"transid": 43121679,
"description": "Thành công",
"amount": 30000,
"phoneNumber": "0963***714",
"walletId": "3406ABB1FF64F676F54A397B6B5F31E7FDA9533B"
}
}
Gửi IPN
Sau khi cấp quyền thành công, server của MoMo sẽ tạo dữ liệu và gọi URL được cung cấp bởi đối tác (notifyURL
) để thông báo việc trạng thái của hóa đơn thanh toán với nội dung được mô tả như sau.
Cấu hình notifyUrl
: https://business.momo.vn/merchant/integrate/generalInfo
Notify URL Example
https://www.partner.com/confirm
HTTP Request
- Method:
POST
- Content-type:
application/json
Attribute | Type | Description |
---|---|---|
partnerCode | String | Mã đối tác |
accessKey | String | Access Key information |
amount | Long | Paid amount |
partnerRefId | String | Transaction ID của đối tác |
partnerTransId | String | Thông tin đơn hàng |
transType | String | Giá trị luôn là momo_wallet |
momoTransId | String | Mã giao dịch của MoMo |
status | Integer | Trạng thái giao dịch |
message | String | Mô tả trạng thái giao dịch |
responseTime | Long | Thời gian gọi notifyUrl (theo millisecond) Time zone: GMT +7 |
storeId | String | Mã cửa hàng |
signature | String | Chữ ký để kiểm tra thông tin. Sử dụng thuật toán Hmac_SHA256 với dữ liệu theo đinh dạng sau: accessKey=$accessKey&amount=$amount&message=$message&momoTransId=$momoTransId &partnerCode=$partnerCode&partnerRefId=$partnerRefId&partnerTransId=$partnerTransId &responseTime=$responseTime&status=$status&storeId=$storeId&transType=momo_wallet |
Json body Example
{
"partnerCode": "MOMOIQA420180417",
"accessKey": "TNWFx9JWayevKPiB8LyTgODiCSrjstXN",
"amount": 10000,
"partnerRefId": "B001221",
"partnerTransId": "",
"transType": "momo_wallet",
"momoTransId": "43121679",
"status": 0,
"message": "Thành Công",
"responseTime": 1555472829549,
"signature": "cd0d82ad983098a2fb99b8e49266ed7bd4db85ebf77d13b2db2f755ff0600fa0",
"storeId": "store001"
}
HTTP Response
Server đối tác cần phản hồi lại server MoMo để thông báo trạng thái của đơn hàng đã được lưu trữ, với nội dung mô tả như sau:
- HTTP status:
200
- Body:
application/json
Attribute | Type | Description |
---|---|---|
status | Integer | Trạng thái đơn hàng |
message | String | Mô tả trạng thái |
partnerRefId | String | Transaction ID của đối tác |
momoTransId | String | Mã giao dịch của MoMo |
amount | Long | Số tiền cần thanh toán |
signature | String | Chữ ký để kiểm tra tính toàn vẹn của thông tin request. Sử dụng thuật toán Hmac_SHA256 với dữ liệu theo định dạng sau: amount=$amount&message=$message&momoTransId=$momoTransId&partnerRefId=$partnerRefId &status=$status |
Mẫu Response
{
"status": 0,
"message": "Thành công",
"amount": 10000,
"partnerRefId": "B001221",
"momoTransId": "43121679",
"signature": "0671f38c555629c6b05ee4043c28d9fde59443ee56bc7216b5b953cc4e8bf848"
}
Xác nhận giao dịch
Sau khi MoMo đã treo tiền User thành công (tiền từ ví User được chuyển về ví trung gian), lúc này User sẽ nhận được thông báo thành công (tiền đã được trừ) và giao dịch tương ứng phía MoMo sẽ có trạng thái Chờ xử lý. Đối tác sẽ xử lý các nghiệp vụ nội bộ và gọi API này để hoàn tất giao dịch, gọi là API confirm, bao gồm 2 trạng thái:
- Xác nhận (
commit
): Đối tác xử lý giao dịch thành công, trạng thái này sẽ chuyển tiền từ ví trung gian về ví đối tác tương ứng. Giao dịch tương ứng phía MoMo sẽ hoàn tất với trạng thái Thành công. - Hủy bỏ (
rollback
): Đối tác xử lý giao dịch thất bại, trạng thái này sẽ trả lại tiền đã giữ trước đó từ ví trung gian về ví user. Giao dịch tương ứng phía MoMo sẽ hoàn tất với trạng thái Thất bại.
Thông tin kết nối đến MoMo
POST
/pay/confirm
HTTP Request
Tên field | Kiểu | Bắt buộc | Mô tả |
---|---|---|---|
partnerCode | String | Mã đối tác | |
partnerRefId | String | Mã giao dịch đối tác Định dạng: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$ | |
requestType | String | Loại request, có 2 giá trị: - Xác nhận giao dịch: capture - Hủy bỏ giao dịch: revertAuthorize | |
requestId | String | Id của mỗi request khi gọi qua MoMo | |
momoTransId | String | Mã giao dịch MoMo đã treo tiền | |
signature | String | Chữ ký để kiểm tra thông tin. Sử dụng thuật toán Hmac_SHA256 với data theo định dạng: partnerCode=$partnerCode&partnerRefId=$partnerRefId&requestType=$requestType &requestId=$requestId&momoTransId=$momoTransId | |
customerNumber | String | Số điện thoại khách hàng | |
description | String | Mô tả lý do (sử dụng trong trường hợp rollback ) |
Request mẫu
{
"partnerCode": "MOMOIQA420180417",
"partnerRefId": "Merchant123556666",
"requestType": "capture",
"requestId": "1512529262248",
"momoTransId": "12436514111",
"signature": "bf577f678efebee61705de899984a67c4eeb3439318b5f0bd6e37263cf6e9fb3",
"customerNumber": "0963181714"
}
HTTP Response
Tên field | Kiểu | Mô tả |
---|---|---|
status | Integer | Kết quả của request |
message | String | Mô tả chi tiết |
data | Json | Json chứa nội dung chi tiết (trong trường hợp thành công) |
data.partnerCode | String | Mã đối tác |
data.partnerRefId | String | partnerRefId đã gửi |
data.momoTransId | String | Mã giao dịch MoMo |
data.amount | Long | Số tiền đã treo |
signature | String | Chữ ký để kiểm tra thông tin. Sử dụng thuật toán Hmac_SHA256 với data theo định dạng: amount=$amount&momoTransId=$momoTransId&partnerCode=$partnerCode&partnerRefId=$partnerRefId |
Response mẫu
{
"status": 0,
"message": "Thành công",
"data": {
"partnerCode": "MOMOIQA420180417",
"momoTransId": "12436514111",
"amount": 30000,
"partnerRefId": "Merchant123556666"
},
"signature": "ca2ab5c354ff1bf8af1dd3448a3aa5681e4f329d71082dc1a90347255656f70d"
}