Flutter集成Montypay时Hash生成无效问题排查
解决Montypay Hash生成失败问题 & Postman脚本迁移思路
一、Hash无效的排查与修复步骤
1. 严格核对拼接规则
Montypay的Hash生成对字段顺序、格式、大小写有强制要求,先对照官方文档确认:
- 字段顺序是否完全匹配要求:比如是否漏填
merchantId这类必填字段,或拼接顺序与文档不符 - 金额格式:是否要求固定小数位数(如必须保留2位,
0.2需写成0.20) - 大小写规范:比如货币代码是否要求大写(
USD而非usd) - 空字段处理:若某个字段为空,是保留空字符串参与拼接还是直接跳过
2. 验证MD5编码逻辑
你的MD5实现本身没问题,但可以通过以下方式校验:
- 手动拼接输入字符串,用本地MD5工具生成大写Hex值,与代码输出对比
- 测试
bytesToHex函数:用已知输入(如utf8.encode("test"))验证,正确MD5结果应为098F6BCD4621D373CADE4E832627B4F6
3. 确认密钥正确性
检查merchantPass是否为Montypay后台分配的对应环境密钥,注意区分测试环境与生产环境密钥,避免混用
二、Postman预请求脚本迁移到Flutter的思路
Postman预请求脚本是JavaScript逻辑,迁移核心是逐行对应转换为Dart代码,步骤如下:
- 导出Postman预请求脚本,提取核心逻辑:
- 参与拼接的字段列表、顺序
- 字段格式化规则(如金额取2位小数、字符串大小写转换)
- 加密算法(Postman常用
CryptoJS.MD5,对应你当前用的Dartmd5库) - 结果处理方式(如转大写、Hex编码)
- 逐段转换为Dart代码:
- 比如Postman的
(amount).toFixed(2)对应Dart的amount.toStringAsFixed(2) - 脚本中的条件判断(如空字段处理)直接用Dart的
if语句实现
- 比如Postman的
- 一致性验证:用相同输入分别在Postman和Flutter中生成Hash,确保结果完全一致
示例修正(假设官方要求包含merchantId)
若文档要求拼接顺序含merchantId,代码需调整如下:
String merchantId = "your-merchant-id"; String orderNumber = "order-1234"; String orderAmount = double.parse("0.19").toStringAsFixed(2); // 强制2位小数 String orderCurrency = "usd".toUpperCase(); String orderDescription = "Important gift"; String merchantPass = "merchantPass"; // 按官方指定顺序拼接 final inputString = '$merchantId$orderNumber$orderAmount$orderCurrency$orderDescription$merchantPass'; final utf8Bytes = utf8.encode(inputString); final hash = md5.convert(utf8Bytes); final hashString = bytesToHex(hash.bytes).toUpperCase(); String bytesToHex(List<int> bytes) { const hexDigits = '0123456789ABCDEF'; return bytes .map((byte) => hexDigits[(byte & 0xff) >> 4] + hexDigits[byte & 0x0f]) .join(''); }
内容的提问来源于stack exchange,提问作者Moustafa Mahmoud
相关产品推荐
相关产品推荐

