베트남에서 현금 경제에서 디지털 경제로의 강력한 전환은 전자 지갑이 더 이상 단순한 결제 도구가 아니라 소비자 행동에서 중심 역할을 하는 슈퍼 애플리케이션(슈퍼 앱)이 되는 새로운 맥락을 확립했습니다. 선도적인 플랫폼인 MoMo는 복잡하지만 통합된 기술 생태계를 구축하여 기업에 온라인 결제, 장외 결제, 스마트 마케팅 및 기업 재무 관리 모델에 이르는 솔루션을 제공합니다. MoMo 결제 시스템을 비즈니스 운영에 통합하는 것은 단순한 기술 요구 사항이 아니라 5천만 명 이상의 사용자 네트워크에 도달하고 하루 평균 100만 건 이상의 거래를 처리하기 위한 전략적 결정입니다. Tan Phat Digital 전문가의 분석에 따르면, 이 보고서는 법적 측면, 시스템 아키텍처부터 보안 프로토콜 및 통합 후 운영 절차에 이르기까지 MoMo 통합 프로세스에 대한 심층적이고 포괄적이며 실용적인 관점을 제공합니다.
1장: 핀테크 생태계에서 MoMo의 아키텍처 및 전략적 위치 개요
MoMo의 위치는 강력한 기술적 역량과 시장 변화에 대한 높은 적응력으로 강화됩니다. MoMo의 시스템은 비즈니스 연속성과 뛰어난 시스템 용량을 보장하도록 설계되었습니다. MoMo의 솔루션은 온라인 결제에 국한되지 않고 IoT 디바이스, AIoT 및 심층 통합(비통합)이 필요 없는 솔루션으로 확장되어 소규모 기업부터 다국적 기업까지 모든 유형의 비즈니스 요구를 충족합니다.
1.1. 성장 지표 및 네트워크 강점
MoMo에 대한 파트너의 신뢰는 안정적인 성장 수치를 통해 입증됩니다. 강력하게 성장하는 네트워크에서 시장 점유율을 공유하는 것은 기업이 수익을 최적화하고 고객의 결제 장벽을 최소화할 수 있는 기회입니다.
활성 사용자 수: 50,000,000명이 넘습니다. 의미: 거대한 잠재 시장에 접근할 수 있는 능력.
평균 거래 수: 하루 1,000,000건 이상의 거래. 의미: 시스템이 안정적이고 안정적으로 운영됩니다.
온라인 파트너(온라인 판매자): 1,000개 이상의 기업. 의미: 넓은 연결 네트워크.
결제 허용 포인트(오프라인 매장): 50,000 포인트 이상. 의미: 실제 판매 채널을 포괄하는 능력.
에이전트 및 파트너 시스템: 910,000명 이상의 에이전트와 626,000명의 파트너. 의미: 입출금 및 밀집된 금융 서비스를 지원하는 인프라.
1.2. 핵심 통합 솔루션 분류
MoMo는 기업이 리소스와 비즈니스 모델에 적합한 방법을 선택할 수 있도록 다양한 제품을 제공합니다. Tan Phat Digital은 이러한 유연성을 모든 터치 포인트에서 고객 경험(UX)을 최적화하는 열쇠로 식별합니다.
결제 게이트웨이(결제 게이트웨이): 올인원(AiO) 솔루션을 사용하면 단 하나의 연결 프로세스를 통해 MoMo 지갑, 국내 ATM 카드, 해외 카드(VISA/Master/JCB) 및 후불 결제 수단과 같은 다양한 결제 수단을 통합할 수 있습니다.
자동 결제: 일회성 인증으로 원클릭 결제를 지원하며 반복 구독 서비스에 적합합니다.
SDK For Enhancements(MDK - MoMo Customized SDK): 파트너 모바일 애플리케이션과의 긴밀한 통합에 최적화된 소프트웨어 개발 키트, 우수한 품질과 원활한 경험 제공.
IoT & AIoT 솔루션: 자판기, 키오스크, SmartTV 또는 듀얼 스크린 POS와 같은 스마트 장치용 솔루션으로 얼굴 인식과 QR 코드 스캐닝을 모두 지원합니다.
비통합 솔루션: 정적 QR 코드, SMS 또는 소셜 네트워크를 통해 전송할 수 있는 Bar Link 결제 링크 등 강력한 기술 팀이 없는 기업용.
2장: 비즈니스 프로필 등록 및 인증 전략 (M4B)
MoMo 생태계에서 공식적인 입지를 구축하려면 기업은 M4B(MoMo for Business) 관리 포털을 거쳐야 합니다. 이는 단순한 행정적 절차가 아니라 기술적 식별 매개변수를 설정하고 향후 현금 흐름을 관리하기 위한 기본 단계입니다.
2.1. M4B 계정 등록 과정
프로세스는 business.momo.vn에서 시작됩니다. 기업은 로그인 이름(정보 조회에 사용) 및 보안 수준이 높은 비밀번호(8~18자)를 포함한 전체 계정 정보를 입력해야 합니다. Haravan, Sapo 또는 CukCuk와 같은 관리 플랫폼을 사용한 기업의 경우 M4B 계정 등록은 API 연결 매개변수를 얻기 위한 필수 단계입니다.
등록부터 공식 운영(Go-live)까지 표준화된 로드맵은 Tan Phat Digital에서 엄격한 단계를 통해 요약합니다.
판매자 프로필 등록(판매자) Profile).
테스트 환경(Sandbox)에 대한 기술 통합.
테스트 환경에 대한 완전한 SIT(System Integration Testing) 테스트.
법률 문서를 통해 비즈니스 계정 인증을 수행합니다.
실제 환경에 대한 식별 정보(Credentials)를 요청합니다. (프로덕션).
프로덕션 환경에서 사용자 승인(UAT) 테스트를 수행하고 최종 승인이 필요합니다.
서비스를 승인하고 공식적으로 배포했습니다.
2.2. 법률 문서 및 인증 요구 사항
정확한 문서 제공이 MoMo QA 및 법무팀의 승인 속도를 결정합니다. 문서 요구 사항은 다음과 같습니다:
기업의 경우: 사업자등록증 원본(GPKD) 또는 공증된 사본, 선명한 이미지.
개인 사업 가구의 경우: 대표자의 ID 카드/CCCD(흐리거나 잘린 모서리가 아닌 전면 및 후면 사진).
단위에는 해당 항목이 없습니다. 사업자 등록증: ID 카드/CCCD 및 매장 소유자 정보(소규모 모델에 적용 가능, 완전한 법적 신분이 없음).
추가 문서: 브랜드 로고(100x100픽셀 형식), 납세 서류, 위임장.
M4B 시스템의 중요한 기능은 전자 계약서 서명을 지원하여 얼굴을 마주할 필요 없이 온보딩 프로세스 속도를 높이는 데 도움이 됩니다.
3장: 올인원(AiO) 통합 API 솔루션의 기술 아키텍처
MoMo의 AiO 통합 API 솔루션은 결제 연결의 표준화를 나타냅니다. 다양한 카드 유형 및 자금에 대해 여러 연결 흐름을 유지 관리할 필요 없이 파트너는 단일 API만 배포하면 됩니다.
3.1. 연결 식별자 매개변수(자격 증명)
통합 환경에서 파트너는 일련의 보안 키를 사용하여 작업합니다. 테스트 환경과 프로덕션 환경의 차이는 이러한 키 값과 서버 주소(도메인)에 있습니다.
파트너 코드: MoMo 시스템에서 비즈니스의 고유 식별자.
액세스 키: MoMo의 API 시스템에 대한 액세스 권한을 부여하는 데 사용되는 키
비밀 키: 전자 생성에 사용되는 비밀 키 서명 각 HTTP 요청에 대한 서명입니다. 이는 데이터 무결성을 보장하는 데 가장 중요한 구성 요소입니다.
공개 키: 더 높은 보안이 필요한 솔루션을 위해 RSA 데이터 암호화 알고리즘에 사용됩니다.
3.2. 인프라 및 네트워크 구성(IP 화이트리스트)
MoMo 시스템에서는 파트너가 특정 IP 주소 범위가 파트너 서버와 통신할 수 있도록 방화벽을 구성해야 합니다.
샌드박스 환경(테스트): 도메인
test-pay.momo.vn. 수신 IP:210.245.113.71. 발신 IP:118.69.210.244,118.68.171.198.프로덕션 환경: 도메인
결제.momo.vn. 수신 IP:118.69.212.158. 발신 IP:118.69.210.244,116.103.110.134(2024년 9월 11일 업데이트).
4장: 보안 메커니즘 및 디지털 서명 프로토콜
핀테크 시스템에서는 거래 정보 보안이 최우선 사항입니다. MoMo는 디지털 서명을 사용하여 데이터를 인증함으로써 정보가 제3자에 의해 변경되지 않도록 보장합니다.
4.1. HMAC-SHA256 알고리즘
MoMo는 HMAC-SHA256 해시 알고리즘을 사용하여 서명을 생성합니다. 이는 계산에 동일한 비밀 키를 사용하는 대칭 알고리즘입니다. 수식:
서명 = HMAC_SHA256(SecretKey, RawString)
4.2. 원시 문자열 생성 규칙
매개변수 정렬: 필드 이름(키 이름)은
a-z의 알파벳순으로 정렬되어야 합니다.문자열 형식:
&문자로 구분하여key=value쌍을 함께 연결합니다.데이터 해싱: 새로 생성된 문자열을 해시하려면 비밀 키를 사용합니다. 결과는 64자의 16진수 문자열입니다.
Tan Phat Digital 참고: 절대로 클라이언트측 소스 코드(프런트엔드)에서 비밀 키를 공개하지 마십시오. 서명 생성은 항상 서버 측에서 이루어져야 합니다.
5장: 일회성 결제 기술 통합 프로세스(captureWallet API)
이것은 거래 시작, 사용자 탐색 및 결과 처리를 포함한 가장 일반적인 결제 흐름입니다.
5.1. 결제 시작
파트너 서버는 partnerCode, requestId, amount(최소 1,000VND), orderId, orderInfo, redirectUrl, ipnUrl 매개변수와 함께 MoMo 엔드포인트에 HTTP POST 요청을 보냅니다. requestType(captureWallet) 및 extraData.
5.2. 탐색 및 사용자 경험
API 호출이 성공하면 MoMo는 다음이 포함된 JSON을 반환합니다.
deeplink: MoMo 앱을 직접 엽니다(앱 간 최적화).
payUrl: 브라우저의 결제 페이지 URL(데스크톱/모바일 웹) 최적화).
qrCodeUrl: 현장에 표시되는 QR 코드를 생성하기 위한 데이터 데이터입니다.
6장: 즉시 결제 알림(IPN) 메커니즘
IPN은 이후 사용자가 연결이 끊어지더라도 서버 간 통신을 통해 동기화를 보장하는 중요한 메커니즘입니다. 지불합니다.
원칙: MoMo는 HTTP POST를
ipnUrl로 보냅니다. 페이로드에는resultCode>,transId,amount및signature가 포함됩니다.서버 처리: 서명 확인,
orderId/amount확인 및 15 이내의 HTTP 코드 204(콘텐츠 없음)로 응답이 필요합니다. 초.
7장: 상태 관리 및 후불 작업
상태 확인: 30초 후에도 IPN 또는 탐색 결과가 수신되지 않을 때 사용됩니다.
환불: 성공적인 거래에 적용됩니다.
orderId환불은 새 코드여야 합니다.거래 취소(역): 거래가 보류 중이거나 파트너 측에 기술적 오류가 있는 경우 즉시 지불합니다.
8장: MoMo Mini 앱 생태계 - "App-in-App" 전략
MoMo Mini 앱을 사용하면 기업에서 웹 기반 애플리케이션을 배포할 수 있습니다. MoMo 플랫폼에서 바로 스토어의 독립 애플리케이션에 투자하지 않고도 대규모 사용자 기반에 접근할 수 있습니다.
9장: 오프라인 결제 솔루션 및 POS 장치
MoMo는 다음을 통해 결제 기능을 물리적 공간으로 확장합니다.
QR 정적 코드(정적 QR): 가장 간단한 방법은 고객이 코드를 스캔하고 금액을 입력하는 것입니다.
동적 QR 코드: POS는 각 송장에 대해 고유한 QR 코드를 생성하며, 고객은 스캔하고 확인하기만 하면 됩니다.
10장: 중복 제어 및 불변성(멱등성)
MoMo는 requestId 필드(UUID V4를 사용해야 함)를 사용하여 31에 대한 중복을 제어합니다. 일. 동일한 requestId가 수신되면 시스템은 돈을 다시 차감하는 대신 이전 결과를 반환합니다.
11장: 오류 코드 시스템 및 예외 처리 전략
2xx: 성공적으로 처리되었습니다.
4xx: 상대방 오류(잘못된 서명, 누락된 매개변수) 번호).
5xx: MoMo 시스템 오류.
코드 0: 성공.
코드 1001: 자금 부족.
코드 1006: 사용자 취소됩니다.
12장: 테스트 프로세스 SIT 및 UAT
이 단계에서는 샌드박스 환경과 MoMo 테스트 앱을 사용합니다. 기본 테스트 지갑 계정의 비밀번호/OTP는 000000입니다. 성공적인 흐름, 오류 흐름(돈 부족, QR 만료) 및 보안 흐름(변경 금액)을 테스트해야 합니다.
13장: 참조 샘플 소스 코드(코드 샘플)
다음은 파트너가 빠르게 배포할 수 있도록 Tan Phat Digital에서 컴파일한 실행 가능한 샘플 소스 코드입니다.
13.1. Node.js
JavaScript
// 매개변수
var PartnerCode = "MOMO";
var accessKey = "F8BBA842ECF85";
var secretkey = "K951B6PE1waDMi640xX08PD3vg6EkVlz";
var requestId = PartnerCode + new Date().getTime();
var orderId = 요청 ID;
var orderInfo = "MoMo로 결제";
var 리디렉션Url = "https://momo.vn/return";
var ipnUrl = "https://callback.url/notify";
var 금액 = "50000";
var requestType = "captureWallet"
var extraData = "";
// 원시 서명 구성
var rawSignature = "accessKey="+accessKey+"&amount=" + amount+"&extraData=" + extraData+"&ipnUrl=" + ipnUrl+"&orderId=" + orderId+"&orderInfo=" + orderInfo+"&partnerCode=" + PartnerCode +"&redirectUrl=" + 리디렉션Url+"&requestId=" + requestId+"&requestType=" + requestType
const crypto = require('암호화');
var 서명 = crypto.createHmac('sha256', secretkey)
.update(rawSignature)
.digest('16진수');
const requestBody = JSON.stringify({
파트너코드 : 파트너코드,
accessKey : 액세스키,
요청 ID : 요청 ID,
금액 : 금액,
주문 ID : 주문 ID,
주문정보 : 주문정보,
redirectUrl:redirectUrl,
ipnUrl : ipnUrl,
extraData : 엑스트라데이터,
요청 유형 : 요청 유형,
서명 : 서명,
언어: 'en'
});
const https = require('https');
const 옵션 = {
호스트 이름: 'test-pay.momo.vn',
포트: 443,
경로: '/v2/gateway/api/create',
메소드: 'POST',
헤더: {
'콘텐츠 유형': '응용 프로그램/json',
'콘텐츠 길이': Buffer.byteLength(requestBody)
}
}
const req = https.request(options, res => {
res.setEncoding('utf8');
res.on('데이터', (본문) => {
console.log('payUrl: ' + JSON.parse(body).payUrl);
});
})
req.write(requestBody);
req.end();
13.2. Go(Golang)
Go
패키지 메인
수입 (
"바이트"
"암호화폐/hmac"
"암호화폐/sha256"
"인코딩/16진수"
"인코딩/json"
"fmt"
"넷/http"
"strconv"
"github.com/sony/sonyflake"
)
페이로드 구조체 유형 {
PartnerCode 문자열 `json:"partnerCode"`
AccessKey 문자열 `json:"accessKey"`
RequestID 문자열 `json:"requestId"`
금액 문자열 `json:"amount"`
OrderID 문자열 `json:"orderId"`
OrderInfo 문자열 `json:"orderInfo"`
RedirectUrl 문자열 `json:"redirectUrl"`
IpnUrl 문자열 `json:"ipnUrl"`
ExtraData 문자열 `json:"extraData"`
RequestType 문자열 `json:"requestType"`
서명 문자열 `json:"signature"`
}
기능 메인() {
flake := sonyflake.NewSonyflake(sonyflake.Settings{})
a, _ := flake.NextID()
b, _ := flake.NextID()
var orderId = strconv.FormatUint(a, 16)
var requestId = strconv.FormatUint(b, 16)
var 엔드포인트 = "https://test-pay.momo.vn/v2/gateway/api/create"
var secretKey = "PPuDXq1KowPT1ftR8DvlQTHhC03aul17"
var 페이로드 = 페이로드{
파트너코드: "MOMOIQA420180417",
액세스키: "SvDmj2cOTYZmQQ3H",
요청 ID: 요청 ID,
금액: "1000",
주문 ID: 주문 ID,
OrderInfo: "모모 올인원",
리디렉션 URL: "https://webhook.site/...",
IpnUrl: "https://webhook.site/...",
추가데이터: "",
요청 유형: "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(페이로드)
resp, _ := http.Post(endpoint, "application/json", bytes.NewBuffer(jsonPayload))
var 결과 맵[문자열]인터페이스{}
json.NewDecoder(resp.Body).Decode(&결과)
fmt.Println("PayUrl is: ", result["payUrl"])
}
13.3. 파이썬
파이썬
json 가져오기
uuid 가져오기
수입요청
hmac 가져오기
hashlib 가져오기
끝점 = "https://test-pay.momo.vn/v2/gateway/api/create"
파트너코드 = "MOMO"
accessKey = "F8BBA842ECF85"
secretKey = "K951B6PE1waDMi640xX08PD3vg6EkVlz"
orderInfo = "MoMo로 결제"
리디렉션Url = "https://webhook.site/..."
ipnUrl = "https://webhook.site/..."
금액 = "50000"
orderId = str(uuid.uuid4())
requestId = str(uuid.uuid4())
requestType = "captureWallet"
extraData = ""
rawSignature = "accessKey=" + accessKey + "&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)
서명 = h.hexdigest()
데이터 = {
'파트너코드': 파트너코드,
'requestId': 요청 ID,
'금액': 금액,
'주문 ID': 주문 ID,
'주문정보': 주문정보,
'redirectUrl': 리디렉션Url,
'ipnUrl': ipnUrl,
'lang': "vi",
'extraData': 엑스트라데이터,
'요청 유형': 요청 유형,
'서명': 서명
}
데이터 = json.dumps(데이터)
응답 = 요청.포스트(엔드포인트, 데이터=데이터, 헤더={'Content-Type': 'application/json'})
print(response.json()['payUrl'])
13.4. Ruby
Ruby
'net/https'가 필요합니다.
'uri'가 필요합니다
'json'이 필요합니다
'openssl'이 필요합니다
'보안 무작위'가 필요합니다
끝점 = "https://test-pay.momo.vn/v2/gateway/api/create"
파트너코드 = "MOMO"
accessKey = "F8BBA842ECF85"
secretKey = "K951B6PE1waDMi640xX08PD3vg6EkVlz"
금액 = "50000"
orderId = SecureRandom.uuid
requestId = SecureRandom.uuid
rawSignature = "accessKey="+accessKey+"&amount="+amount+"&extraData=&ipnUrl=...&orderId="+orderId+"&orderInfo=...&partnerCode="+partnerCode+"&redirectUrl=...&requestId="+requestId+"&requestType=captureWallet"
서명 = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secretKey, rawSignature)
json요청 = {
:partnerCode => 파트너코드,
:requestId => 요청ID,
:금액 => 금액,
:orderId => 주문ID,
:서명 => 서명,
:requestType => "captureWallet"
}
uri = URI.parse(엔드포인트)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = 사실
request = Net::HTTP::Post.new(uri.path, {'Content-Type' => 'application/json'})
request.body = jsonRequest.to_json
응답 = http.request(요청)
JSON.parse(response.body)["payUrl"]를 넣습니다.
13.5. PHP(초기화 및 IPN)
PHP
// 결제 시작
$partnerCode, 'requestId' => $requestId, 'amount' => $amount, 'orderId' => $orderId, 'orderInfo' => $orderInfo, 'redirectUrl' => $redirectUrl, 'ipnUrl' => $ipnUrl, 'extraData' => $extraData, 'requestType' => $requestType, '서명' => $서명);
$result = excutePostRequest($endpoint, json_encode($data));
$jsonResult = json_decode($result, true);
header('위치: '.$jsonResult['payUrl']);
?>
// IPN 처리
13.6. C#(.NET)
C#
// MoMoSecurity.cs
System.Security.Cryptography를 사용합니다.
System.Text 사용;
네임스페이스 MoMo {
클래스 MoMoSecurity {
공개 문자열 signSHA256(문자열 메시지, 문자열 키) {
byte keyByte = Encoding.UTF8.GetBytes(key);
bytes messageBytes = Encoding.UTF8.GetBytes(message);
(var hmacsha256 = new HMACSHA256(keyByte)) 사용 {
바이트 해시 메시지 = hmacsha256.ComputeHash(messageBytes);
string hex = BitConverter.ToString(hashmessage);
return hex.Replace("-", "").ToLower();
}
}
}
}
// MoMoForm.cs
문자열 끝점 = "https://test-pay.momo.vn/v2/gateway/api/create";
문자열 PartnerCode = "MOMO5RGX20191128";
문자열 accessKey = "SvDmj2cOTYZmQQ3H";
string secretkey = "PPuDXq1KowPT1ftR8DvlQTHhC03aul17";
string orderId = Guid.NewGuid().ToString();
string requestId = Guid.NewGuid().ToString();
문자열 금액 = "50000";
// rawHash를 알파벳순으로 빌드합니다...
MoMoSecurity 암호화 = 새로운 MoMoSecurity();
문자열 서명 = crypto.signSHA256(rawHash, secretkey);
// HTTP Post 요청 보내기...
MoMo 통합은 단순히 결제 수단을 설치하는 것이 아니라 포괄적인 디지털 혁신 여정입니다. 서명, IPN, 핵심보안에 대한 기술표준을 준수함으로써 기업은 안정적인 결제 시스템을 구축할 수 있을 뿐만 아니라 오늘날의 디지털 시대에 고객과 확고한 신뢰를 구축할 수 있습니다. 통합의 성공은 Tan Phat Digital
과 같은 유명 기업의 비즈니스 운영 전략에 있어 기술적 정확성과 유연성의 결합에 달려 있습니다.공유








