You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,对应你当前用的Dart md5库)
    • 结果处理方式(如转大写、Hex编码)
  • 逐段转换为Dart代码:
    • 比如Postman的(amount).toFixed(2)对应Dart的amount.toStringAsFixed(2)
    • 脚本中的条件判断(如空字段处理)直接用Dart的if语句实现
  • 一致性验证:用相同输入分别在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:25:11