sign.dart 1.57 KB
import 'dart:convert';
import 'package:crypto/crypto.dart';

class SignUtil {
  /// 签名方法
  static String sign(Map<String, String> sPara, String appecret) {
    String prestr = createLinkString(paraFilter(sPara)); // 把数组所有元素,
    String mysign = md5Sign(prestr, appecret, "utf-8");
    return mysign;
  }

  /// 除去数组中的空值和签名参数
  static Map<String, String> paraFilter(Map<String, String> sArray) {
    Map<String, String> result = {};
    if (sArray == null || sArray.isEmpty) {
      return result;
    }
    sArray.forEach((key, value) {
      if (value == null || value.isEmpty || key.toLowerCase() == "sign" || key.toLowerCase() == "sign_type") {
        return;
      }
      result[key] = value;
    });
    return result;
  }

  /// 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
  static String createLinkString(Map<String, String> params) {
    List<String> keys = params.keys.toList();
    keys.sort();
    String prestr = "";
    for (int i = 0; i < keys.length; i++) {
      String key = keys[i];
      String value = params[key]!;
      if (i == keys.length - 1) {
        // 拼接时,不包括最后一个&字符
        prestr = "$prestr$key=$value";
      } else {
        prestr = "$prestr$key=$value&";
      }
    }
    return prestr;
  }

  /// MD5签名
  static String md5Sign(String prestr, String secret, String encoding) {
    String toSign = prestr + secret;
    var bytes = utf8.encode(toSign);
    var digest = md5.convert(bytes);
    return digest.toString();
  }
}