PayWxUtil.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package com.happy.Until.weixin;
  2. import org.apache.commons.codec.digest.DigestUtils;
  3. import java.security.MessageDigest;
  4. import java.text.DateFormat;
  5. import java.text.SimpleDateFormat;
  6. import java.util.*;
  7. /**
  8. * Created by Song on 2016/11/8. mail: 1147649695@qq.com 微信支付相关工具类
  9. */
  10. public class PayWxUtil {
  11. // 上一次订单请求日期
  12. private static Date preDay = new Date();
  13. // 当前订单日期
  14. private static Date curDay = new Date();
  15. // 用于记录已产生的订单号
  16. private static Set<Long> numPoul = new HashSet<Long>();
  17. /**
  18. * 获得签名
  19. *
  20. * @param params
  21. * 待编码参数,参数值为空不传入
  22. * @param key
  23. * key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
  24. * @return
  25. */
  26. public static String getSign(Map<String, String> params, String key)
  27. throws Exception {
  28. List<String> list = new ArrayList<String>(params.keySet());
  29. Collections.sort(list, new DictionaryCompare());
  30. StringBuffer sb = new StringBuffer();
  31. for (String keyVal : list) {
  32. if (params.get(keyVal) != null) {
  33. sb.append(keyVal + "=" + params.get(keyVal) + "&");
  34. }
  35. }
  36. sb.append("key=" + key);
  37. return DigestUtils
  38. .md5Hex(new String(sb.toString().getBytes(), "utf-8"))
  39. .toUpperCase();
  40. }
  41. /**
  42. * 获得随机字符串
  43. *
  44. * @return
  45. */
  46. public static String getNonceStr() {
  47. Random random = new Random();
  48. long val = random.nextLong();
  49. String res = DigestUtils.md5Hex(val + "yzx").toUpperCase();
  50. if (32 < res.length())
  51. return res.substring(0, 32);
  52. else
  53. return res;
  54. }
  55. /**
  56. * 获取订单号 商户订单号(每个订单号必须唯一) 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。
  57. *
  58. * @param mchId
  59. * @return
  60. */
  61. public static String getMchBillno(String mchId) {
  62. Random random = new Random();
  63. long val = random.nextLong() % 10000000000L;// 获得0-9999999999内的数字
  64. curDay = new Date();
  65. // 隔天清空
  66. if (curDay.after(preDay))
  67. numPoul.clear();
  68. while (numPoul.contains(val)) {
  69. val = random.nextLong() % 10000000000L;
  70. }
  71. numPoul.add(val);
  72. preDay = curDay;
  73. // 按要求,日期格式化输出
  74. DateFormat df = new SimpleDateFormat("yyyymmdd");
  75. return mchId + df.format(curDay) + format(val + "", 10);
  76. }
  77. /**
  78. * 将字符串str按长度在前面添0补齐
  79. *
  80. * @param str
  81. * @param length
  82. * @return
  83. */
  84. private static String format(String str, int length) {
  85. String pre = "0000000000";
  86. int len = str.length();
  87. if (10 <= len)
  88. return str.substring(0, 10);
  89. else
  90. return pre.substring(0, 10 - len).concat(str);
  91. }
  92. // SHA1加密方法,jssdk签名算法
  93. public static String getSha1(String str) {
  94. if (str == null || str.length() == 0) {
  95. return null;
  96. }
  97. char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  98. 'a', 'b', 'c', 'd', 'e', 'f' };
  99. try {
  100. MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
  101. mdTemp.update(str.getBytes("UTF-8"));
  102. byte[] md = mdTemp.digest();
  103. int j = md.length;
  104. char buf[] = new char[j * 2];
  105. int k = 0;
  106. for (int i = 0; i < j; i++) {
  107. byte byte0 = md[i];
  108. buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
  109. buf[k++] = hexDigits[byte0 & 0xf];
  110. }
  111. return new String(buf);
  112. } catch (Exception e) {
  113. // TODO: handle exception
  114. return null;
  115. }
  116. }
  117. }