Sự dịch chuyển mạnh mẽ từ nền kinh tế tiền mặt sang nền kinh tế số tại Việt Nam đã thiết lập một bối cảnh mới, nơi các ví điện tử không còn đơn thuần là công cụ thanh toán mà trở thành một siêu ứng dụng (Super App) đóng vai trò trung tâm trong hành vi tiêu dùng. MoMo, với vị thế là nền tảng dẫn đầu, đã xây dựng một hệ sinh thái kỹ thuật phức hợp nhưng đồng nhất, cung cấp cho doanh nghiệp các giải pháp từ thanh toán trực tuyến, thanh toán tại quầy đến các mô hình quản lý tài chính doanh nghiệp và tiếp thị thông minh. Việc tích hợp hệ thống thanh toán MoMo vào vận hành doanh nghiệp không chỉ là một yêu cầu kỹ thuật mà là một quyết định chiến lược nhằm tiếp cận mạng lưới hơn 50 triệu người dùng và xử lý trung bình hơn một triệu giao dịch mỗi ngày. Theo phân tích từ chuyên gia tại Tấn Phát Digital, báo cáo này cung cấp một cái nhìn sâu sắc, toàn diện và thực tiễn về quy trình tích hợp MoMo, từ khía cạnh pháp lý, kiến trúc hệ thống đến các giao thức bảo mật và quy trình vận hành hậu tích hợp.
Chương 1: Kiến trúc tổng quan và vị thế chiến lược của MoMo trong hệ sinh thái Fintech
Vị thế của MoMo được củng cố bởi năng lực công nghệ mạnh mẽ và khả năng thích ứng cao với sự thay đổi của thị trường. Hệ thống của MoMo được thiết kế để đảm bảo tính liên tục của doanh nghiệp (Business Continuity) và khả năng mở rộng quy mô (System Capacity) vượt trội. Các giải pháp của MoMo không chỉ giới hạn ở thanh toán trực tuyến mà còn mở rộng sang các thiết bị IoT, AIoT và các giải pháp không cần tích hợp sâu (Non-Integration), đáp ứng nhu cầu của mọi loại hình doanh nghiệp từ siêu nhỏ đến các tập đoàn đa quốc gia.
1.1. Các chỉ số tăng trưởng và sức mạnh mạng lưới
Sự tin tưởng của các đối tác vào MoMo được minh chứng qua các con số tăng trưởng ổn định. Việc chia sẻ thị phần trong một mạng lưới đang phát triển mạnh mẽ là cơ hội để doanh nghiệp tối ưu hóa doanh thu và giảm thiểu rào cản thanh toán cho khách hàng.
Số lượng người dùng hoạt động: Trên 50.000.000 người. Ý nghĩa: Khả năng tiếp cận thị trường tiềm năng khổng lồ.
Số lượng giao dịch trung bình: Hơn 1.000.000 giao dịch/ngày. Ý nghĩa: Hệ thống vận hành ổn định và tin cậy.
Đối tác trực tuyến (Online Merchants): Hơn 1.000 doanh nghiệp. Ý nghĩa: Mạng lưới kết nối rộng khắp.
Điểm chấp nhận thanh toán (Offline Outlets): Hơn 50.000 điểm. Ý nghĩa: Khả năng bao phủ kênh bán hàng vật lý.
Hệ thống đại lý và đối tác: Hơn 910.000 đại lý và 626.000 đối tác. Ý nghĩa: Hạ tầng hỗ trợ nạp/rút và dịch vụ tài chính dày đặc.
1.2. Phân loại các giải pháp tích hợp cốt lõi
MoMo cung cấp một dải sản phẩm rộng, cho phép doanh nghiệp lựa chọn phương thức phù hợp với nguồn lực và mô hình kinh doanh. Tấn Phát Digital nhận định sự linh hoạt này là chìa khóa để tối ưu hóa trải nghiệm khách hàng (UX) trên mọi điểm chạm.
Payment Gateway (Cổng thanh toán): Giải pháp All-in-One (AiO) cho phép tích hợp đa dạng phương thức thanh toán như ví MoMo, thẻ ATM nội địa, thẻ quốc tế (VISA/Master/JCB) và các nguồn tiền trả sau chỉ qua một quy trình kết nối duy nhất.
Automated Payments (Thanh toán tự động): Hỗ trợ cơ chế thanh toán một chạm (One-Click Payment) với xác thực một lần, phù hợp cho các dịch vụ đăng ký định kỳ.
SDK For Enhancements (MDK - MoMo Customized SDK): Bộ công cụ phát triển phần mềm được tối ưu hóa để tích hợp sâu vào ứng dụng di động của đối tác, mang lại hiệu năng cao và trải nghiệm mượt mà.
IoT & AIoT Solutions: Các giải pháp dành cho thiết bị thông minh như máy bán hàng tự động, Kiosk, SmartTV hoặc máy POS màn hình kép, hỗ trợ cả nhận diện khuôn mặt và quét mã QR.
Non-Integration Solutions: Dành cho doanh nghiệp không có đội ngũ kỹ thuật mạnh, bao gồm QR Code tĩnh (Static QR) và Liên kết thanh toán (Payment Link) để gửi qua SMS hoặc mạng xã hội.
Chương 2: Chiến lược đăng ký và xác thực hồ sơ doanh nghiệp (M4B)
Để thiết lập sự hiện diện chính thức trong hệ sinh thái MoMo, doanh nghiệp phải đi qua cổng quản trị MoMo for Business (M4B). Đây không chỉ là một thủ tục hành chính mà là bước nền tảng để thiết lập các thông số định danh kỹ thuật và quản lý dòng tiền sau này.
2.1. Quy trình đăng ký tài khoản M4B
Quy trình bắt đầu tại địa chỉ business.momo.vn. Doanh nghiệp cần điền đầy đủ thông tin tài khoản bao gồm tên đăng nhập (dùng để tra cứu thông tin) và mật khẩu bảo mật cao (từ 8 đến 18 ký tự). Đối với các doanh nghiệp đã sử dụng các nền tảng quản lý như Haravan, Sapo hay CukCuk, việc đăng ký tài khoản M4B là bước bắt buộc để lấy các thông số kết nối API.
Lộ trình chuẩn hóa từ lúc đăng ký đến lúc chính thức vận hành (Go-live) được Tấn Phát Digital tóm lược qua các bước nghiêm ngặt:
Đăng ký hồ sơ thương nhân (Merchant Profile).
Tích hợp kỹ thuật trên môi trường Test (Sandbox).
Hoàn tất kiểm thử SIT (System Integration Testing) trên môi trường Test.
Thực hiện xác thực tài khoản doanh nghiệp thông qua hồ sơ pháp lý.
Yêu cầu thông tin định danh (Credentials) cho môi trường thực tế (Production).
Thực hiện kiểm thử chấp nhận người dùng (UAT) trên môi trường Production và yêu cầu xét duyệt cuối cùng.
Được phê duyệt và chính thức triển khai dịch vụ.
2.2. Hồ sơ pháp lý và yêu cầu xác thực
Việc cung cấp hồ sơ chính xác quyết định tốc độ phê duyệt của đội ngũ QA và Pháp lý của MoMo. Các yêu cầu về hồ sơ bao gồm:
Đối với Doanh nghiệp: Giấy phép đăng ký kinh doanh (GPKD) bản gốc hoặc bản sao có công chứng, hình ảnh rõ nét.
Đối với Hộ kinh doanh cá thể: CMND/CCCD của người đại diện (ảnh mặt trước và mặt sau, không bị mờ hoặc cắt góc).
Đơn vị không có GPKD: CMND/CCCD và thông tin chủ cửa hàng (áp dụng cho các mô hình nhỏ, không có tư cách pháp nhân đầy đủ).
Hồ sơ bổ sung: Logo thương hiệu (định dạng 100x100 pixel), Giấy nộp thuế, Giấy ủy quyền.
Một đặc điểm quan trọng của hệ thống M4B là việc hỗ trợ ký hợp đồng điện tử, giúp đẩy nhanh quá trình onboarding mà không cần gặp mặt trực tiếp.
Chương 3: Kiến trúc kỹ thuật của giải pháp All-in-One (AiO) Unified API
Giải pháp AiO Unified API của MoMo đại diện cho sự chuẩn hóa trong kết nối thanh toán. Thay vì phải duy trì nhiều luồng kết nối cho các loại thẻ và nguồn tiền khác nhau, đối tác chỉ cần triển khai một API duy nhất.
3.1. Các tham số định danh kết nối (Credentials)
Trong môi trường tích hợp, đối tác sẽ làm việc với một bộ khóa bảo mật. Sự khác biệt giữa môi trường Test và Production nằm ở các giá trị khóa này và địa chỉ máy chủ (Domain).
Partner Code: Mã định danh duy nhất cho doanh nghiệp trong hệ thống MoMo.
Access Key: Khóa dùng để cấp quyền truy cập vào hệ thống API của MoMo.
Secret Key: Khóa bí mật dùng để tạo chữ ký điện tử (Signature) cho mỗi yêu cầu HTTP. Đây là thành phần quan trọng nhất trong việc đảm bảo tính toàn vẹn dữ liệu.
Public Key: Được sử dụng trong các thuật toán mã hóa dữ liệu RSA cho các giải pháp yêu cầu tính bảo mật cao hơn.
3.2. Cấu hình hạ tầng và mạng lưới (IP Whitelisting)
Hệ thống MoMo yêu cầu các đối tác cấu hình tường lửa để cho phép các dải địa chỉ IP cụ thể giao tiếp với máy chủ đối tác:
Môi trường Sandbox (Test): Domain
test-payment.momo.vn. IP Đến:210.245.113.71. IP Đi:118.69.210.244,118.68.171.198.Môi trường Production: Domain
payment.momo.vn. IP Đến:118.69.212.158. IP Đi:118.69.210.244,116.103.110.134(Cập nhật 11/09/2024).
Chương 4: Cơ chế bảo mật và giao thức chữ ký số (Digital Signature)
Bảo mật thông tin giao dịch là ưu tiên hàng đầu trong các hệ thống Fintech. MoMo sử dụng chữ ký số để xác thực dữ liệu, đảm bảo rằng thông tin không bị thay đổi bởi bên thứ ba.
4.1. Thuật toán HMAC-SHA256
MoMo sử dụng thuật toán băm HMAC-SHA256 để tạo chữ ký. Đây là một thuật toán đối xứng, sử dụng chung một Secret Key để tính toán. Công thức:
Signature = HMAC_SHA256(SecretKey, RawString)
4.2. Quy tắc tạo chuỗi dữ liệu gốc (Raw String)
Sắp xếp tham số: Các tên trường (key name) phải được sắp xếp theo thứ tự bảng chữ cái từ
a-z.Định dạng chuỗi: Nối các cặp
key=valuelại với nhau, phân cách bằng ký tự&.Băm dữ liệu: Sử dụng Secret Key để băm chuỗi vừa tạo. Kết quả là một chuỗi thập lục phân gồm 64 ký tự.
Tấn Phát Digital lưu ý: Tuyệt đối không bao giờ được lộ Secret Key trong mã nguồn phía Client (Frontend). Việc tạo signature phải luôn được thực hiện ở Server-side.
Chương 5: Quy trình tích hợp kỹ thuật One-Time Payments (captureWallet API)
Đây là luồng thanh toán phổ biến nhất, bao gồm khởi tạo giao dịch, điều hướng người dùng và xử lý kết quả.
5.1. Khởi tạo giao dịch (Initiate Payment)
Máy chủ đối tác gửi yêu cầu HTTP POST đến endpoint MoMo với các tham số: partnerCode, requestId, amount (Min 1.000 VND), orderId, orderInfo, redirectUrl, ipnUrl, requestType (captureWallet), và extraData.
5.2. Điều hướng và Trải nghiệm người dùng
Sau khi gọi API thành công, MoMo trả về JSON chứa:
deeplink: Mở trực tiếp app MoMo (tối ưu App-to-App).
payUrl: URL trang thanh toán trên trình duyệt (tối ưu Desktop/Mobile Web).
qrCodeUrl: Dữ liệu để tạo mã QR hiển thị tại chỗ.
Chương 6: Cơ chế thông báo kết quả tức thời (IPN - Instant Payment Notification)
IPN là cơ chế quan trọng đảm bảo tính đồng bộ thông qua giao tiếp server-to-server, ngay cả khi người dùng mất kết nối sau khi trả tiền.
Nguyên lý: MoMo gửi HTTP POST đến
ipnUrl. Payload chứaresultCode,transId,amount, vàsignature.Xử lý tại máy chủ: Bắt buộc xác thực chữ ký, đối soát
orderId/amountvà phản hồi mã HTTP 204 (No Content) trong vòng 15 giây.
Chương 7: Quản lý trạng thái và các nghiệp vụ sau thanh toán
Kiểm tra trạng thái (Check Status): Sử dụng khi không nhận được IPN hoặc kết quả điều hướng sau 30 giây.
Hoàn tiền (Refund): Áp dụng cho giao dịch thành công. Lưu ý
orderIdhoàn tiền phải là mã mới.Hủy giao dịch (Reverse): Trả tiền ngay khi giao dịch đang chờ hoặc có lỗi kỹ thuật phía đối tác.
Chương 8: Hệ sinh thái MoMo Mini App - Chiến lược "App-in-App"
MoMo Mini App cho phép doanh nghiệp triển khai ứng dụng web-based ngay trên nền platform MoMo, giúp tiếp cận tập người dùng khổng lồ mà không cần đầu tư ứng dụng độc lập trên Store.
Chương 9: Giải pháp thanh toán Offline và thiết bị POS
MoMo mở rộng khả năng thanh toán vào không gian vật lý qua:
QR Code tĩnh (Static QR): Đơn giản nhất, khách quét mã và tự nhập số tiền.
QR Code động: POS sinh mã QR duy nhất cho từng hóa đơn, khách chỉ cần quét và xác nhận.
Chương 10: Kiểm soát trùng lặp và tính không thay đổi (Idempotency)
MoMo sử dụng trường requestId (nên dùng UUID V4) để kiểm soát trùng lặp trong 31 ngày. Nếu nhận cùng requestId, hệ thống trả về kết quả cũ thay vì trừ tiền lần nữa.
Chương 11: Hệ thống mã lỗi và chiến lược xử lý ngoại lệ
2xx: Xử lý thành công.
4xx: Lỗi phía đối tác (sai chữ ký, thiếu tham số).
5xx: Lỗi hệ thống MoMo.
Mã 0: Thành công.
Mã 1001: Không đủ tiền.
Mã 1006: Người dùng hủy.
Chương 12: Quy trình kiểm thử SIT và UAT
Giai đoạn này sử dụng môi trường Sandbox và ứng dụng MoMo Test App. Tài khoản ví thử nghiệm mặc định có mật khẩu/OTP là 000000. Cần kiểm thử các luồng thành công, luồng lỗi (không đủ tiền, hết hạn QR) và luồng bảo mật (thay đổi số tiền).
Chương 13: Mã nguồn mẫu tham khảo (Code Samples)
Dưới đây là mã nguồn mẫu thực thi do Tấn Phát Digital tổng hợp giúp đối tác triển khai nhanh chóng.
13.1. Node.js
JavaScript
// parameters
var partnerCode = "MOMO";
var accessKey = "F8BBA842ECF85";
var secretkey = "K951B6PE1waDMi640xX08PD3vg6EkVlz";
var requestId = partnerCode + new Date().getTime();
var orderId = requestId;
var orderInfo = "pay with MoMo";
var redirectUrl = "https://momo.vn/return";
var ipnUrl = "https://callback.url/notify";
var amount = "50000";
var requestType = "captureWallet"
var extraData = "";
// raw signature construction
var rawSignature = "accessKey="+accessKey+"&amount=" + amount+"&extraData=" + extraData+"&ipnUrl=" + ipnUrl+"&orderId=" + orderId+"&orderInfo=" + orderInfo+"&partnerCode=" + partnerCode +"&redirectUrl=" + redirectUrl+"&requestId=" + requestId+"&requestType=" + requestType
const crypto = require('crypto');
var signature = crypto.createHmac('sha256', secretkey)
.update(rawSignature)
.digest('hex');
const requestBody = JSON.stringify({
partnerCode : partnerCode,
accessKey : accessKey,
requestId : requestId,
amount : amount,
orderId : orderId,
orderInfo : orderInfo,
redirectUrl : redirectUrl,
ipnUrl : ipnUrl,
extraData : extraData,
requestType : requestType,
signature : signature,
lang: 'en'
});
const https = require('https');
const options = {
hostname: 'test-payment.momo.vn',
port: 443,
path: '/v2/gateway/api/create',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(requestBody)
}
}
const req = https.request(options, res => {
res.setEncoding('utf8');
res.on('data', (body) => {
console.log('payUrl: ' + JSON.parse(body).payUrl);
});
})
req.write(requestBody);
req.end();
13.2. Go (Golang)
Go
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"strconv"
"github.com/sony/sonyflake"
)
type Payload struct {
PartnerCode string `json:"partnerCode"`
AccessKey string `json:"accessKey"`
RequestID string `json:"requestId"`
Amount string `json:"amount"`
OrderID string `json:"orderId"`
OrderInfo string `json:"orderInfo"`
RedirectUrl string `json:"redirectUrl"`
IpnUrl string `json:"ipnUrl"`
ExtraData string `json:"extraData"`
RequestType string `json:"requestType"`
Signature string `json:"signature"`
}
func main() {
flake := sonyflake.NewSonyflake(sonyflake.Settings{})
a, _ := flake.NextID()
b, _ := flake.NextID()
var orderId = strconv.FormatUint(a, 16)
var requestId = strconv.FormatUint(b, 16)
var endpoint = "https://test-payment.momo.vn/v2/gateway/api/create"
var secretKey = "PPuDXq1KowPT1ftR8DvlQTHhC03aul17"
var payload = Payload{
PartnerCode: "MOMOIQA420180417",
AccessKey: "SvDmj2cOTYZmQQ3H",
RequestID: requestId,
Amount: "1000",
OrderID: orderId,
OrderInfo: "momo all-in-one",
RedirectUrl: "https://webhook.site/...",
IpnUrl: "https://webhook.site/...",
ExtraData: "",
RequestType: "captureWallet",
}
var rawSignature bytes.Buffer
rawSignature.WriteString("accessKey=" + payload.AccessKey + "&amount=" + payload.Amount + "&extraData=" + payload.ExtraData + "&ipnUrl=" + payload.IpnUrl + "&orderId=" + payload.OrderID + "&orderInfo=" + payload.OrderInfo + "&partnerCode=" + payload.PartnerCode + "&redirectUrl=" + payload.RedirectUrl + "&requestId=" + payload.RequestID + "&requestType=" + payload.RequestType)
h := hmac.New(sha256.New,byte(secretKey))
h.Write(rawSignature.Bytes())
payload.Signature = hex.EncodeToString(h.Sum(nil))
jsonPayload, _ := json.Marshal(payload)
resp, _ := http.Post(endpoint, "application/json", bytes.NewBuffer(jsonPayload))
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println("PayUrl is: ", result["payUrl"])
}
13.3. Python
Python
import json
import uuid
import requests
import hmac
import hashlib
endpoint = "https://test-payment.momo.vn/v2/gateway/api/create"
partnerCode = "MOMO"
accessKey = "F8BBA842ECF85"
secretKey = "K951B6PE1waDMi640xX08PD3vg6EkVlz"
orderInfo = "pay with MoMo"
redirectUrl = "https://webhook.site/..."
ipnUrl = "https://webhook.site/..."
amount = "50000"
orderId = str(uuid.uuid4())
requestId = str(uuid.uuid4())
requestType = "captureWallet"
extraData = ""
rawSignature = "accessKey=" + accessKey + "&amount=" + amount + "&extraData=" + extraData + "&ipnUrl=" + ipnUrl + "&orderId=" + orderId + "&orderInfo=" + orderInfo + "&partnerCode=" + partnerCode + "&redirectUrl=" + redirectUrl + "&requestId=" + requestId + "&requestType=" + requestType
h = hmac.new(bytes(secretKey, 'ascii'), bytes(rawSignature, 'ascii'), hashlib.sha256)
signature = h.hexdigest()
data = {
'partnerCode': partnerCode,
'requestId': requestId,
'amount': amount,
'orderId': orderId,
'orderInfo': orderInfo,
'redirectUrl': redirectUrl,
'ipnUrl': ipnUrl,
'lang': "vi",
'extraData': extraData,
'requestType': requestType,
'signature': signature
}
data = json.dumps(data)
response = requests.post(endpoint, data=data, headers={'Content-Type': 'application/json'})
print(response.json()['payUrl'])
13.4. Ruby
Ruby
require 'net/https'
require 'uri'
require 'json'
require 'openssl'
require 'securerandom'
endpoint = "https://test-payment.momo.vn/v2/gateway/api/create"
partnerCode = "MOMO"
accessKey = "F8BBA842ECF85"
secretKey = "K951B6PE1waDMi640xX08PD3vg6EkVlz"
amount = "50000"
orderId = SecureRandom.uuid
requestId = SecureRandom.uuid
rawSignature = "accessKey="+accessKey+"&amount="+amount+"&extraData=&ipnUrl=...&orderId="+orderId+"&orderInfo=...&partnerCode="+partnerCode+"&redirectUrl=...&requestId="+requestId+"&requestType=captureWallet"
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secretKey, rawSignature)
jsonRequest = {
:partnerCode => partnerCode,
:requestId => requestId,
:amount => amount,
:orderId => orderId,
:signature => signature,
:requestType => "captureWallet"
}
uri = URI.parse(endpoint)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/json'})
request.body = jsonRequest.to_json
response = http.request(request)
puts JSON.parse(response.body)["payUrl"]
13.5. PHP (Khởi tạo & IPN)
PHP
// Initiate Payment
<?php
header('Content-type: text/html; charset=utf-8');
function execPostRequest($url, $data) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: '. strlen($data)));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$endpoint = "https://test-payment.momo.vn/v2/gateway/api/create";
$partnerCode = 'MOMOBKUN20180529';
$accessKey = 'klm0567shj9qRrA';
$secretKey = 'at67qH6mk8w5Y1nAyMoYKMWACiEi2bsa';
$orderId = time(). "";
$requestId = time(). "";
$amount = "50000";
$orderInfo = "Thanh toán qua ví MoMo";
$redirectUrl = "https://yourdomain.com/return.php";
$ipnUrl = "https://yourdomain.com/ipn.php";
$requestType = "captureWallet";
$extraData = "";
$rawHash = "accessKey=". $accessKey. "&amount=". $amount. "&extraData=". $extraData. "&ipnUrl=". $ipnUrl. "&orderId=". $orderId. "&orderInfo=". $orderInfo. "&partnerCode=". $partnerCode. "&redirectUrl=". $redirectUrl. "&requestId=". $requestId. "&requestType=". $requestType;
$signature = hash_hmac("sha256", $rawHash, $secretKey);
$data = array('partnerCode' => $partnerCode, 'requestId' => $requestId, 'amount' => $amount, 'orderId' => $orderId, 'orderInfo' => $orderInfo, 'redirectUrl' => $redirectUrl, 'ipnUrl' => $ipnUrl, 'extraData' => $extraData, 'requestType' => $requestType, 'signature' => $signature);
$result = execPostRequest($endpoint, json_encode($data));
$jsonResult = json_decode($result, true);
header('Location: '. $jsonResult['payUrl']);
?>
// IPN Handling
<?php
header("content-type: application/json; charset=UTF-8");
$http_response_code = 204;
if (!empty($_POST)) {
$rawHash = "accessKey=".$accessKey."&amount=".$_POST["amount"]."&extraData=".$_POST."&message=".$_POST["message"]."&orderId=".$_POST["orderId"]."&orderInfo=".$_POST["orderInfo"]."&orderType=".$_POST."&partnerCode=".$_POST["partnerCode"]."&payType=".$_POST."&requestId=".$_POST["requestId"]."&responseTime=".$_POST."&resultCode=".$_POST["resultCode"]."&transId=".$_POST["transId"];
$partnerSignature = hash_hmac("sha256", $rawHash, $secretKey);
if ($_POST["signature"] == $partnerSignature) {
if ($_POST["resultCode"] == '0') {
// Success logic
}
}
http_response_code(204);
}
?>
13.6. C# (.NET)
C#
// MoMoSecurity.cs
using System.Security.Cryptography;
using System.Text;
namespace MoMo {
class MoMoSecurity {
public string signSHA256(string message, string key) {
byte keyByte = Encoding.UTF8.GetBytes(key);
byte messageBytes = Encoding.UTF8.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte)) {
byte hashmessage = hmacsha256.ComputeHash(messageBytes);
string hex = BitConverter.ToString(hashmessage);
return hex.Replace("-", "").ToLower();
}
}
}
}
// MoMoForm.cs
string endpoint = "https://test-payment.momo.vn/v2/gateway/api/create";
string partnerCode = "MOMO5RGX20191128";
string accessKey = "SvDmj2cOTYZmQQ3H";
string secretkey = "PPuDXq1KowPT1ftR8DvlQTHhC03aul17";
string orderId = Guid.NewGuid().ToString();
string requestId = Guid.NewGuid().ToString();
string amount = "50000";
// Build rawHash in alphabetical order...
MoMoSecurity crypto = new MoMoSecurity();
string signature = crypto.signSHA256(rawHash, secretkey);
// Send HTTP Post request...
Việc tích hợp MoMo không chỉ đơn thuần là việc cài đặt một phương thức thanh toán, mà là một hành trình chuyển đổi số toàn diện. Bằng cách tuân thủ các chuẩn mực kỹ thuật về signature, IPN, và bảo mật khóa, doanh nghiệp không chỉ xây dựng được một hệ thống thanh toán tin cậy mà còn tạo dựng niềm tin vững chắc nơi khách hàng trong kỷ nguyên số hóa hiện nay. Thành công của việc tích hợp nằm ở sự kết hợp giữa sự chính xác trong kỹ thuật và sự linh hoạt trong chiến lược vận hành kinh doanh từ các đơn vị uy tín như Tấn Phát Digital.









