所有文章

将 MoMo 集成到 Website 2026 的说明 |陈发数码

technologyFebruary 24, 2026·#Technology

探索专家 Tan Phat Digital 的 MoMo 生态系统集成路线图。该报告提供了有关AiO统一API架构、安全机制和标准UAT流程的实用知识,以帮助企业优化现金流并覆盖5000万用户。

将 MoMo 集成到 Website 2026 的说明 |陈发数码

越南从现金经济向数字经济的强劲转变建立了一个新的背景,电子钱包不再仅仅是支付工具,而是成为在消费者行为中发挥核心作用的超级应用程序(Super App)。 MoMo作为领先的平台,构建了复杂但统一的技术生态系统,为企业提供从在线支付、场外支付到智能营销和企业财务管理模式的解决方案。将MoMo支付系统集成到业务运营中不仅仅是一项技术要求,更是一项战略决策,旨在覆盖超过5000万用户的网络并平均每天处理超过100万笔交易。根据Tan Phat Digital专家的分析,本报告从法律层面、系统架构到安全协议以及集成后的操作流程,对MoMo的整合过程进行了深入、全面、实用的阐述。

第一章:MoMo在金融科技生态系统中的总体架构和战略地位

MoMo的地位得益于强大的技术能力和对市场变化的高度适应能力。 MoMo的系统旨在确保业务连续性和出色的系统容量。 MoMo的解决方案不仅限于在线支付,还扩展到物联网设备、AIoT以及不需要深度集成(Non-Integration)的解决方案,满足从微型企业到跨国企业的各类企业的需求。

1.1.增长指标和网络实力

稳定的增长数据体现了合作伙伴对 MoMo 的信任。在强劲增长的网络中分享市场份额对于企业来说是一个优化收入并最大限度地减少客户支付障​​碍的机会。

  • 活跃用户数量:超过 50,000,000 人。含义:能够进入巨大的潜在市场。

  • 平均交易数量:每天超过1,000,000笔交易。含义:系统运行稳定可靠。

  • 在线合作伙伴(在线商户):1000多家商家。含义:广泛的连接网络。

  • 支付受理点(线下网点):超过50,000个点。含义:覆盖实体销售渠道的能力。

  • 代理商及合作伙伴体系:超过91万代理商,62.6万合作伙伴。含义:支持存款/取款和密集金融服务的基础设施。

1.2。核心集成解决方案分类

MoMo提供丰富的产品,让企业可以选择适合自己资源和商业模式的方法。 Tan Phat Digital 将这种灵活性视为在每个接触点优化客户体验 (UX) 的关键。

  • 支付网关 (Payment Gateway): 一体化 (AiO) 解决方案允许通过单一连接流程集成多种支付方式,例如 MoMo 钱包、国内 ATM 卡、国际卡 (VISA/Master/JCB) 和后付费资金来源

  • 自动支付:支持一键支付,一次性认证,适合循环订阅服务。

  • SDK增强(MDK - MoMo定制SDK):软件开发套件经过优化,可深度集成到合作伙伴移动应用中,提供高性能和流畅的体验。

  • 物联网和AIoT解决方案:适用于自动售货机、Kiosk、SmartTV或双屏POS等智能设备的解决方案,同时支持面部识别和二维码扫描。

  • 非集成解决方案:适合没有强大技术团队的企业,包括静态二维码和Bar Link支付链接,通过短信或社交网络发送。

第二章:企业资料注册和身份验证策略(M4B)

要在 MoMo 生态系统中建立正式存在,企业必须通过 MoMo for Business (M4B) 管理门户。这不仅仅是一个行政程序,而是建立技术识别参数和随后管理现金流的基本步骤。

2.1。 M4B账户注册流程

该流程从business.momo.vn开始。企业需要填写完整的账户信息,包括登录名(用于查找信息)和高安全性密码(8至18个字符)。对于使用过Haravan、Sapo或CukCuk等管理平台的商家来说,注册M4B账户是获取API连接参数的必经步骤。

Tan Phat Digital通过严格的步骤总结了从注册到正式运营(上线)的标准化路线图:

  1. 注册商家资料(Merchant Profile)。

  2. 技术测试环境(沙盒)集成。

  3. 测试环境完成SIT(系统集成测试)测试。

  4. 通过法律文件进行企业账户认证。

  5. 请求实际环境(生产)的身份信息(Credentials)。

  6. 生产环境进行测试用户验收(UAT)并最终批准必需。

  7. 批准并正式部署服务。

2.2。法律文件和认证要求

提供准确的文件决定了MoMo QA 和法律团队审批的速度。文件要求包括:

  • 企业:商业登记证原件或公证副本,图像清晰。

  • 个体工商户:代表人身份证/CCCD(正反面照片,不得模糊、偷工减料)。

  • 单位没有。营业执照:身份证/CCCD和店主信息(适用于小型车型,无完全合法身份)。

  • 附加文件:品牌标志(100x100像素格式)、纳税纸、授权书。

M4B系统的一个重要功能是支持签署电子合同,有助于加快入职流程,无需见面

第三章:一体机(AiO)统一API解决方案的技术架构

MoMo的AiO统一API解决方案代表了支付连接的标准化。合作伙伴无需为不同的卡类型和资金维护多个连接流程,只需部署一个 API。

3.1.连接标识符参数(凭据)

在集成环境中,合作伙伴将使用一组安全密钥。测试环境和生产环境的区别在于这些键值和服务器地址(域)。

  • 合作伙伴代码:MoMo 系统中业务的唯一标识符。

  • 访问密钥:用于授予访问 MoMo API 系统的密钥。

  • 秘密密钥:用于创建电子文件的秘密密钥签名 每个 HTTP 请求的签名。这是确保数据完整性的最重要组成部分。

  • 公钥:用于需要更高安全性的解决方案的 RSA 数据加密算法。

3.2。基础设施和网络配置(IP白名单)

MoMo系统要求合作伙伴配置防火墙,以允许特定IP地址范围与合作伙伴服务器通信:

  • 沙盒环境(测试):test- payment.momo.vn。传入 IP:210.245.113.71。传出IP:118.69.210.244118.68.171.198

  • 生产环境:域名 payment.momo.vn。传入 IP:118.69.212.158。传出IP:118.69.210.244116.103.110.134(2024年9月11日更新)。

第四章:安全机制和数字签名协议

交易信息安全是金融科技系统的重中之重。 MoMo 使用数字签名来验证数据,确保信息不被第三方更改。

4.1. HMAC-SHA256算法

MoMo使用HMAC-SHA256哈希算法来创建签名。这是一种对称算法,使用相同的Secret Key进行计算。公式:

签名 = HMAC_SHA256(SecretKey, RawString)

4.2.创建原始字符串的规则

  • 参数排序:字段名称(键名称)必须按a-z的字母顺序排列。

  • 字符串格式:key=value对连接在一起,用&字符分隔。

  • 数据哈希:使用Secret Key对新创建的字符串进行哈希。结果是 64 个字符的十六进制字符串。

Tan Phat Digital 注意:绝对不要在客户端源代码(前端)中泄露密钥。签名创建必须始终在服务器端完成。

第 5 章:一次性支付技术集成流程(captureWallet API)

这是最常见的支付流程,包括交易发起、用户导航和结果处理。

5.1.发起付款

合作伙伴服务器向 MoMo 端点发送 HTTP POST 请求,参数包括:partnerCoderequestIdamount(最低 1,000 VND)、orderIdorderInforedirectUrlipnUrlrequestType (captureWallet) 和 extraData

5.2。导航和用户体验

成功调用 API 后,MoMo 返回 JSON,其中包含:

  • 深层链接:直接打开 MoMo 应用(应用到应用优化)。

  • payUrl: 浏览器上的支付页面 URL(桌面/移动 Web)

  • qrCodeUrl:数据数据,用于创建当场显示的二维码。

第六章:即时付款通知(IPN)机制

IPN 是一种重要的机制,可以确保通过服务器到服务器通信的同步,即使用户在付款后失去连接。

  • 原理: MoMo 发送 HTTP POST 到 ipnUrl。负载包含 resultCodetransIdamountsignature

  • 服务器处理: 需要签名验证、orderId/amount 检查,并在 15 天内使用 HTTP 代码 204(无内容)进行响应

第七章:状态管理和支付后操作

  • 检查状态:30秒后未收到IPN或导航结果时使用。

  • 退款:适用于交易成功。请注意,orderId退款必须是新代码。

  • 取消交易(反向):当交易待处理或合作伙伴出现技术错误时立即付款。

第八章:MoMo Mini App生态系统-“App-in-App”策略

MoMo Mini App允许企业正确部署基于Web的应用程序

第 9 章:线下支付解决方案和 POS 设备

MoMo 通过以下方式将支付功能扩展到物理空间:

  • 二维码静态码(Static QR): 最简单的,客户扫描代码并输入金额

  • 动态二维码:POS为每张发票生成唯一的二维码,客户只需扫描确认即可。

第十章:重复控制和不变性(幂等性)

MoMo使用requestId字段(应使用UUID V4)控制31个重复天。如果收到相同的requestId,则返回旧结果,不再扣款。

第十一章:错误码系统及异常处理策略

  • 2xx:处理成功。

  • 4xx:交易对手错误(签名错误、参数缺失)编号)。

  • 5xx: MoMo 系统错误。

  • 代码 0: 成功。

  • 代码 1001: 资金不足。

  • 代码 1006: 用户取消。

第 12 章:测试流程 SIT 和 UAT

此阶段使用沙盒环境和 MoMo 测试应用。默认测试钱包帐户的密码/OTP 为 000000。需要测试成功流程、错误流程(钱不够、二维码过期)和安全流程(找零金额)。

第十三章:参考示例源码(Code Samples)

下面是Tan Phat Digital编译的可执行示例源代码,以帮助合作伙伴快速部署。

13.1. Node.js

JavaScript

//参数
var 合作伙伴代码 = "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 额外数据 = ""; 

// 原始签名构造
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 签名 = crypto.createHmac('sha256', Secretkey)
   .更新(原始签名)
   .digest('十六进制');

const requestBody = JSON.stringify({
    合作伙伴代码 : 合作伙伴代码,
    访问密钥:访问密钥,
    请求 ID : 请求 ID,
    金额:金额,
    订单 ID : 订单 ID,
    订单信息:订单信息,
    重定向网址:重定向网址,
    ipnUrl : ipnUrl,
    额外数据:额外数据,
    请求类型:请求类型,
    签名: 签名,
    郎: '恩'
});

const https = require('https');
常量选项 = {
    主机名:'test- payment.momo.vn',
    端口:443,
    路径:'/v2/gateway/api/create',
    方法:'POST',
    标题:{
        '内容类型':'应用程序/json',
        '内容长度': Buffer.byteLength(requestBody)
    }
}
const req = https.request(选项, res => {
    res.setEncoding('utf8');
    res.on('数据', (body) => {
        console.log('payUrl: ' + JSON.parse(body).payUrl);
    });
})
req.write(requestBody);
请求结束();

13.2。 Go(Golang)

Go

package main
导入(
	“字节”
	“加密货币/HMAC”
	“加密货币/sha256”
	“编码/十六进制”
	“编码/json”
	“FMMT”
	“网络/http”
	“strcon”
	“github.com/sony/sonyflake”
)

类型有效负载结构{
	PartnerCode 字符串 `json:"partnerCode"`
	AccessKey 字符串 `json:"accessKey"`
	请求 ID 字符串 `json:"requestId"`
	金额字符串 `json:"金额"`
	OrderID 字符串 `json:"orderId"`
	订单信息字符串 `json:"orderInfo"`
	RedirectUrl 字符串 `json:"redirectUrl"`
	IpnUrl 字符串 `json:"ipnUrl"`
	ExtraData 字符串 `json:"extraData"`
	请求类型字符串 `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- payment.momo.vn/v2/gateway/api/create”
	var SecretKey =“PPuDXq1KowPT1ftR8DvlQTHhC03aul17”

	var 有效负载 = 有效负载{
		合作伙伴代码:“MOMOIQA420180417”,
		访问密钥:“SvDmj2cOTYZmQQ3H”,
		请求ID:请求ID,
		金额:“1000”,
		订单ID:订单ID,
		OrderInfo: "momo 一体机",
		RedirectUrl: "https://webhook.site/...",
		IpnUrl: "https://webhook.site/...",
		额外数据:“”,
		请求类型:“捕获钱包”,
	}

	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=" +负载.RequestID + "&requestType=" + 负载.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 结果映射[字符串]接口{}
	json.NewDecoder(resp.Body).Decode(&结果)
	fmt.Println("PayUrl 是:", result["payUrl"])
}

13.3。 Python

Python

导入json
导入uuid
导入请求
导入hmac
导入哈希库

端点 =“https://test- payment.momo.vn/v2/gateway/api/create”
合作伙伴代码 = "MOMO"
访问密钥 =“F8BBA842ECF85”
密钥=“K951B6PE1waDMi640xX08PD3vg6EkVlz”
orderInfo =“使用 MoMo 付款”
redirectUrl = "https://webhook.site/..."
ipnUrl =“https://webhook.site/...”
金额=“50000”
orderId = str(uuid.uuid4())
requestId = str(uuid.uuid4())
请求类型=“捕获钱包”
额外数据=“”

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':redirectUrl,
    'ipnUrl': ipnUrl,
    '郎':'vi',
    '额外数据':额外数据,
    '请求类型':请求类型,
    ‘签名’:签名
}

数据 = json.dumps(数据)
响应 = requests.post(endpoint, data=data, headers={'Content-Type': 'application/json'})
打印(response.json()['payUrl'])

13.4。 Ruby

Ruby

需要“net/https”
需要“uri”
需要“json”
需要“openssl”
需要“安全随机”

端点 =“https://test- payment.momo.vn/v2/gateway/api/create”
合作伙伴代码 = "MOMO"
访问密钥 =“F8BBA842ECF85”
密钥=“K951B6PE1waDMi640xX08PD3vg6EkVlz”
金额=“50000”
orderId = SecureRandom.uuid
请求 ID = 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请求 = {
    :合作伙伴代码 => 合作伙伴代码,
    :requestId => requestId,
    :金额 => 金额,
    :orderId => orderId,
    :签名=>签名,
    :requestType => "captureWallet"
}

uri = URI.parse(端点)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
请求 = 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, '签名' => $signature);
$结果=executePostRequest($endpoint, json_encode($data));
$jsonResult = json_decode($result, true);
header('位置:'.$jsonResult['payUrl']);
?>

// IPN 处理

13.6。 C# (.NET)

C#

// MoMoSecurity.cs
使用系统.安全.密码学;
使用系统文本;

命名空间 MoMo {
    类 MoMoSecurity {
        公共字符串signSHA256(字符串消息,字符串密钥){
            字节 keyByte = Encoding.UTF8.GetBytes(key);
            字节 messageBytes = Encoding.UTF8.GetBytes(message);
            使用 (var hmacsha256 = new HMACSHA256(keyByte)) {
                字节 hashmessage = hmacsha256.ComputeHash(messageBytes);
                字符串十六进制 = BitConverter.ToString(hashmessage);
                return hex.Replace("-", "").ToLower();
            }
        }
    }
}

// MoMoForm.cs
字符串端点 =“https://test- payment.momo.vn/v2/gateway/api/create”;
字符串partnerCode =“MOMO5RGX20191128”;
字符串 accessKey = "SvDmj2cOTYZmQQ3H";
字符串密钥 =“PPuDXq1KowPT1ftR8DvlQTHhC03aul17”;
字符串 orderId = Guid.NewGuid().ToString();
字符串 requestId = Guid.NewGuid().ToString();
字符串金额=“50000”;
// 按字母顺序构建 rawHash...
MoMoSecurity 加密 = new MoMoSecurity();
字符串签名= crypto.signSHA256(rawHash,secretkey);
// 发送 HTTP Post 请求...

集成MoMo不仅仅是安装一种支付方式,而是一次全面的数字化转型之旅。通过遵守签名、IPN和密钥安全等技术标准,企业不仅可以构建可靠的支付系统,而且可以在当今的数字时代与客户建立牢固的信任。整合的成功取决于Tan Phat Digital等信誉良好的单位将技术精度与业务运营策略的灵活性相结合。

分享

评论

0.0 / 5(0 条评分)

请登录后发表评论。

暂无评论,成为第一个分享想法的人吧。