diff --git a/lib/utils/app_sign.dart b/lib/utils/app_sign.dart index 78fb45172..518c671b0 100644 --- a/lib/utils/app_sign.dart +++ b/lib/utils/app_sign.dart @@ -10,15 +10,41 @@ abstract class AppSign { String appsec = Constants.appSec, }) { params['appkey'] = appkey; - var searchParams = Uri( - queryParameters: params.map( - (key, value) => MapEntry(key, value.toString()), - ), - ).query; - var sortedQueryString = (searchParams.split('&')..sort()).join('&'); - + final sorted = Map.fromEntries( + params.entries.toList()..sort((a, b) => a.key.compareTo(b.key)), + ); params['sign'] = md5 - .convert(utf8.encode(sortedQueryString + appsec)) + .convert(utf8.encode(_makeQueryFromParametersDefault(sorted) + appsec)) .toString(); // 获取MD5哈希值 } + + /// from [Uri] + static String _makeQueryFromParametersDefault( + Map*/> queryParameters, + ) { + var result = StringBuffer(); + var separator = ''; + + void writeParameter(String key, String? value) { + result.write(separator); + separator = '&'; + result.write(Uri.encodeQueryComponent(key)); + if (value != null && value.isNotEmpty) { + result + ..write('=') + ..write(Uri.encodeQueryComponent(value)); + } + } + + queryParameters.forEach((key, value) { + if (value case Iterable values) { + for (final String value in values) { + writeParameter(key, value); + } + } else { + writeParameter(key, value?.toString()); + } + }); + return result.toString(); + } }