code: public static String genPaySign(Map<String, Object> map, String key, String signType) {
          String[] nms = map.keySet().toArray(new String[map.size()]);
          Arrays.sort(nms);
          StringBuilder sb = new StringBuilder();
          signType = signType == null ? "MD5" : signType.toUpperCase();
          boolean isMD5 = "MD5".equals(signType);
          for (String nm : nms) {
              Object v = map.get(nm);
              if (null == v)
                  continue;
              // JSSDK 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。
              // 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
              if (isMD5 && "timestamp".equals(nm)) {
                  nm = "timeStamp";
              }
              String s = v.toString();
              if (Strings.isBlank(s))
                  continue;
              sb.append(nm).append('=').append(s).append('&');
          }
          sb.append("key=").append(key);
          return Lang.digest(signType, sb).toUpperCase();
      }
docs: 根据提交参数，生成签名
  
  @param map
  要签名的集合
  @param key
  商户秘钥
  @return 签名
  
  @see <a href=
  "https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3">
  微信商户平台签名算法</a>