diff --git a/talkonlineweb/src/main/java/com/lyms/talkonlineweb/controller/OrderController.java b/talkonlineweb/src/main/java/com/lyms/talkonlineweb/controller/OrderController.java index 960a09e..9245035 100644 --- a/talkonlineweb/src/main/java/com/lyms/talkonlineweb/controller/OrderController.java +++ b/talkonlineweb/src/main/java/com/lyms/talkonlineweb/controller/OrderController.java @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import sun.security.provider.MD5; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -181,10 +182,20 @@ public class OrderController { String success = "SUCCESS"; if (retMap != null && retMap.size() > 0 && success.equals(retMap.get("return_code")) && success.equals(retMap.get("result_code"))) { - data.put("payId",retMap.get("prepay_id")); - data.put("nonce_str",retMap.get("nonce_str")); - data.put("paySign",retMap.get("sign")); - data.put("timestamp",System.currentTimeMillis()/1000+""); + SortedMap map=new TreeMap<>(); + String nonceStr=NumberUtil.getRandomString(16); + String timeStamp=System.currentTimeMillis()/1000+""; + map.put("appId",Constant.PAT_APP_ID); + map.put("nonceStr",nonceStr); + map.put("package","prepay_id="+retMap.get("prepay_id")); + map.put("signType","MD5"); + map.put("timeStamp",timeStamp); + System.out.println("createSign:"+createSign(null, map)); + + data.put("packageValue",retMap.get("prepay_id")); + data.put("nonceStr",nonceStr); + data.put("paySign",createSign(null, map)); + data.put("timeStamp",timeStamp); return data; } } @@ -400,4 +411,32 @@ public class OrderController { } + /** + * 微信支付签名算法sign + * @param characterEncoding + * @param parameters + * @return + */ + public static String createSign(String characterEncoding,SortedMap parameters){ + StringBuffer sb = new StringBuffer(); + Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序) + Iterator it = es.iterator(); + while(it.hasNext()) { + Map.Entry entry = (Map.Entry)it.next(); + String k = (String)entry.getKey(); + Object v = entry.getValue(); + if(null != v && !"".equals(v) + && !"sign".equals(k) && !"key".equals(k)) { + sb.append(k + "=" + v + "&"); + } + } + + sb.append("key=" + Constant.REQ_KEY); + System.out.println("签名字符串:"+sb.toString()); + System.out.println("签名MD5未变大写:" + MD5Util.MD5Encode(sb.toString(), characterEncoding)); + String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase(); + return sign; + } + + } diff --git a/talkonlineweb/src/main/java/com/lyms/talkonlineweb/util/MD5Util.java b/talkonlineweb/src/main/java/com/lyms/talkonlineweb/util/MD5Util.java index 1e70630..0d34079 100644 --- a/talkonlineweb/src/main/java/com/lyms/talkonlineweb/util/MD5Util.java +++ b/talkonlineweb/src/main/java/com/lyms/talkonlineweb/util/MD5Util.java @@ -6,6 +6,9 @@ import java.security.NoSuchAlgorithmException; /** */ public class MD5Util { + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" + }; /** * md5加密 @@ -36,4 +39,42 @@ public class MD5Util { return null; } } + + /** + * md5加密并转为大写 + * @param origin 拼接的字符串 + * @return + */ + public static String MD5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = new String(origin); + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) + resultString = byteArrayToHexString(md.digest(resultString + .getBytes())); + else + resultString = byteArrayToHexString(md.digest(resultString + .getBytes(charsetname))); + } catch (Exception exception) { + } + return resultString; + } + private static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) + resultSb.append(byteToHexString(b[i])); + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n += 256; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + }