Md5Pay.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package com.ruoyi.app.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.ruoyi.system.domain.vo.PayResponse;
  4. import com.ruoyi.system.domain.vo.PayVN;
  5. import lombok.SneakyThrows;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import java.io.BufferedReader;
  8. import java.io.DataOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11. import java.net.HttpURLConnection;
  12. import java.net.URL;
  13. import java.net.URLEncoder;
  14. import java.nio.charset.StandardCharsets;
  15. import java.text.SimpleDateFormat;
  16. import java.util.*;
  17. public class Md5Pay {
  18. public static final SimpleDateFormat ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
  19. // public JSONObject payMd5(String orderid,String amount,String customName){
  20. // try {
  21. // String merchantNo = "API8918130442359667";
  22. // String merchant_private_key = "6d75bb6318944312b7456193ce776a6f";
  23. // String signType = "MD5";
  24. // String url = "https://mgp-pay.com:8443/api/pay/V2";
  25. //
  26. // Map<String, String> requestMap = new HashMap<String, String>();
  27. // requestMap.put("merchantNo", merchantNo);
  28. // requestMap.put("channleType", "1");
  29. // requestMap.put("signType", signType);
  30. // requestMap.put("version", "V2");// 常量V1
  31. // requestMap.put("date", ymdhms.format(new Date()));
  32. // requestMap.put("orderNo", orderid);// System.currentTimeMillis()
  33. // requestMap.put("bizAmt", amount); // 元
  34. // requestMap.put("customName", customName); // 元
  35. // requestMap.put("noticeUrl", "http://203.175.169.46:8080/pay/payJson");
  36. // String signStr = SftSignUtil.formatSignData(requestMap);
  37. // System.out.println("signStr签名:" + signStr);
  38. // String sign = SftSignUtil.sign(signType, signStr, merchant_private_key);
  39. // requestMap.put("sign", sign);
  40. // System.out.println("sign "+sign);
  41. // Map<String, String> head = new HashMap<String, String>();
  42. // head.put("Content-Type", "application/json");
  43. // String rs = HttpKit.post(url, JSON.toJSONString(requestMap), head);
  44. // JSONObject jsonObject = JSONObject.parseObject(rs);
  45. // return jsonObject;
  46. // } catch (Exception e) {
  47. // JSONObject json = new JSONObject();
  48. // json.put("data",null);
  49. // return json;
  50. // }
  51. // }
  52. //发起支付
  53. @SneakyThrows
  54. public String VNPay(String language, String orderid, String amount,String ip){
  55. String vnp_Version = "2.1.0";
  56. String vnp_Command = "pay";
  57. String orderType = "other";
  58. String bankCode = "";
  59. long pamount = Long.valueOf(amount)*100;
  60. String vnp_TxnRef = VNPay.getRandomNumber(8);
  61. String vnp_IpAddr = ip;
  62. String vnp_TmnCode = VNPay.vnp_TmnCode;
  63. Map<String, String> vnp_Params = new HashMap<>();
  64. vnp_Params.put("vnp_Version", vnp_Version);
  65. vnp_Params.put("vnp_Command", vnp_Command);
  66. vnp_Params.put("vnp_TmnCode", vnp_TmnCode);
  67. vnp_Params.put("vnp_Amount", String.valueOf(pamount));
  68. vnp_Params.put("vnp_CurrCode", "VND");
  69. if (bankCode != null && !bankCode.isEmpty()) {
  70. vnp_Params.put("vnp_BankCode", bankCode);
  71. }
  72. vnp_Params.put("vnp_TxnRef", orderid);
  73. vnp_Params.put("vnp_OrderInfo", orderid);
  74. vnp_Params.put("vnp_OrderType", orderType);
  75. String locate = language;
  76. if (locate != null && !locate.isEmpty()) {
  77. vnp_Params.put("vnp_Locale", locate);
  78. } else {
  79. vnp_Params.put("vnp_Locale", "vn");
  80. }
  81. vnp_Params.put("vnp_ReturnUrl", VNPay.vnp_ReturnUrl);
  82. vnp_Params.put("vnp_IpAddr", vnp_IpAddr);
  83. Calendar cld = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+7"));
  84. SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
  85. String vnp_CreateDate = formatter.format(cld.getTime());
  86. vnp_Params.put("vnp_CreateDate", vnp_CreateDate);
  87. cld.add(Calendar.MINUTE, 15);
  88. String vnp_ExpireDate = formatter.format(cld.getTime());
  89. vnp_Params.put("vnp_ExpireDate", vnp_ExpireDate);
  90. List fieldNames = new ArrayList(vnp_Params.keySet());
  91. Collections.sort(fieldNames);
  92. StringBuilder hashData = new StringBuilder();
  93. StringBuilder query = new StringBuilder();
  94. Iterator itr = fieldNames.iterator();
  95. while (itr.hasNext()) {
  96. String fieldName = (String) itr.next();
  97. String fieldValue = (String) vnp_Params.get(fieldName);
  98. if ((fieldValue != null) && (fieldValue.length() > 0)) {
  99. //Build hash data
  100. hashData.append(fieldName);
  101. hashData.append('=');
  102. hashData.append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString()));
  103. //Build query
  104. query.append(URLEncoder.encode(fieldName, StandardCharsets.US_ASCII.toString()));
  105. query.append('=');
  106. query.append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString()));
  107. if (itr.hasNext()) {
  108. query.append('&');
  109. hashData.append('&');
  110. }
  111. }
  112. }
  113. String queryUrl = query.toString();
  114. String vnp_SecureHash = VNPay.hmacSHA512(VNPay.secretKey, hashData.toString());
  115. queryUrl += "&vnp_SecureHash=" + vnp_SecureHash;
  116. String paymentUrl = VNPay.vnp_PayUrl + "?" + queryUrl;
  117. return paymentUrl;
  118. }
  119. //查询支付订单
  120. public String getPay(PayResponse payResponse,String ip) throws IOException {
  121. //Command:querydr
  122. String vnp_RequestId = VNPay.getRandomNumber(8);
  123. String vnp_Version = "2.1.0";
  124. String vnp_Command = "querydr";
  125. String vnp_TmnCode = VNPay.vnp_TmnCode;
  126. String vnp_TxnRef = payResponse.getOrder_id();
  127. String vnp_OrderInfo = vnp_TxnRef;;
  128. //String vnp_TransactionNo = req.getParameter("transactionNo");
  129. String vnp_TransDate = payResponse.getTrans_date();
  130. Calendar cld = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+7"));
  131. SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
  132. String vnp_CreateDate = formatter.format(cld.getTime());
  133. String vnp_IpAddr = ip;
  134. JSONObject vnp_Params = new JSONObject();
  135. vnp_Params.put("vnp_RequestId", vnp_RequestId);
  136. vnp_Params.put("vnp_Version", vnp_Version);
  137. vnp_Params.put("vnp_Command", vnp_Command);
  138. vnp_Params.put("vnp_TmnCode", vnp_TmnCode);
  139. vnp_Params.put("vnp_TxnRef", vnp_TxnRef);
  140. vnp_Params.put("vnp_OrderInfo", vnp_OrderInfo);
  141. //vnp_Params.put("vnp_TransactionNo", vnp_TransactionNo);
  142. vnp_Params.put("vnp_TransactionDate", vnp_TransDate);
  143. vnp_Params.put("vnp_CreateDate", vnp_CreateDate);
  144. vnp_Params.put("vnp_IpAddr", vnp_IpAddr);
  145. String hash_Data= String.join("|", vnp_RequestId, vnp_Version, vnp_Command, vnp_TmnCode, vnp_TxnRef, vnp_TransDate, vnp_CreateDate, vnp_IpAddr, vnp_OrderInfo);
  146. String vnp_SecureHash = VNPay.hmacSHA512(VNPay.secretKey, hash_Data.toString());
  147. vnp_Params.put("vnp_SecureHash", vnp_SecureHash);
  148. URL url = new URL (VNPay.vnp_ApiUrl);
  149. HttpURLConnection con = (HttpURLConnection)url.openConnection();
  150. con.setRequestMethod("POST");
  151. con.setRequestProperty("Content-Type", "application/json");
  152. con.setDoOutput(true);
  153. DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  154. wr.writeBytes(vnp_Params.toString());
  155. wr.flush();
  156. wr.close();
  157. int responseCode = con.getResponseCode();
  158. System.out.println("nSending 'POST' request to URL : " + url);
  159. System.out.println("Post Data : " + vnp_Params);
  160. System.out.println("Response Code : " + responseCode);
  161. BufferedReader in = new BufferedReader(
  162. new InputStreamReader(con.getInputStream()));
  163. String output;
  164. StringBuffer response = new StringBuffer();
  165. while ((output = in.readLine()) != null) {
  166. response.append(output);
  167. }
  168. in.close();
  169. System.out.println(response.toString());
  170. return response.toString();
  171. }
  172. //退款
  173. public String doPost(PayVN payVN) throws IOException {
  174. //Command: refund
  175. String vnp_RequestId = VNPay.getRandomNumber(8);
  176. String vnp_Version = "2.1.0";
  177. String vnp_Command = "refund";
  178. String vnp_TmnCode = VNPay.vnp_TmnCode;
  179. String vnp_TransactionType = payVN.getTrantype();
  180. String vnp_TxnRef = payVN.getOrder_id();
  181. long amount = Integer.parseInt(payVN.getAmount())*100;
  182. String vnp_Amount = String.valueOf(amount);
  183. String vnp_OrderInfo = vnp_TxnRef;
  184. String vnp_TransactionNo = payVN.getTransaction(); //不存在则为空。
  185. String vnp_TransactionDate = payVN.getTrans_date();
  186. String vnp_CreateBy = payVN.getUser();
  187. Calendar cld = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+7"));
  188. SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
  189. String vnp_CreateDate = formatter.format(cld.getTime());
  190. String vnp_IpAddr = payVN.getIpaddr();
  191. JSONObject vnp_Params = new JSONObject ();
  192. vnp_Params.put("vnp_RequestId", vnp_RequestId);
  193. vnp_Params.put("vnp_Version", vnp_Version);
  194. vnp_Params.put("vnp_Command", vnp_Command);
  195. vnp_Params.put("vnp_TmnCode", vnp_TmnCode);
  196. vnp_Params.put("vnp_TransactionType", vnp_TransactionType);
  197. vnp_Params.put("vnp_TxnRef", vnp_TxnRef);
  198. vnp_Params.put("vnp_Amount", vnp_Amount);
  199. vnp_Params.put("vnp_OrderInfo", vnp_OrderInfo);
  200. if(vnp_TransactionNo != null && !vnp_TransactionNo.isEmpty())
  201. {
  202. vnp_Params.put("vnp_TransactionNo", payVN.getTransaction());
  203. }
  204. vnp_Params.put("vnp_TransactionDate", vnp_TransactionDate);
  205. vnp_Params.put("vnp_CreateBy", vnp_CreateBy);
  206. vnp_Params.put("vnp_CreateDate", vnp_CreateDate);
  207. vnp_Params.put("vnp_IpAddr", vnp_IpAddr);
  208. String hash_Data= String.join("|", vnp_RequestId, vnp_Version, vnp_Command, vnp_TmnCode,
  209. vnp_TransactionType, vnp_TxnRef, vnp_Amount, vnp_TransactionNo, vnp_TransactionDate,
  210. vnp_CreateBy, vnp_CreateDate, vnp_IpAddr, vnp_OrderInfo);
  211. String vnp_SecureHash = VNPay.hmacSHA512(VNPay.secretKey, hash_Data.toString());
  212. vnp_Params.put("vnp_SecureHash", vnp_SecureHash);
  213. URL url = new URL (VNPay.vnp_ApiUrl);
  214. HttpURLConnection con = (HttpURLConnection)url.openConnection();
  215. con.setRequestMethod("POST");
  216. con.setRequestProperty("Content-Type", "application/json");
  217. con.setDoOutput(true);
  218. DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  219. wr.writeBytes(vnp_Params.toString());
  220. wr.flush();
  221. wr.close();
  222. int responseCode = con.getResponseCode();
  223. System.out.println("nSending 'POST' request to URL : " + url);
  224. System.out.println("Post Data : " + vnp_Params);
  225. System.out.println("Response Code : " + responseCode);
  226. BufferedReader in = new BufferedReader(
  227. new InputStreamReader(con.getInputStream()));
  228. String output;
  229. StringBuffer response = new StringBuffer();
  230. while ((output = in.readLine()) != null) {
  231. response.append(output);
  232. }
  233. in.close();
  234. System.out.println(response.toString());
  235. return response.toString();
  236. }
  237. }