WxPayServiceMy.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package com.hys.app.pay.wx;
  2. import cn.hutool.core.util.IdUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
  7. import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
  8. import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
  9. import com.github.binarywang.wxpay.config.WxPayConfig;
  10. import com.github.binarywang.wxpay.exception.WxPayException;
  11. import com.github.binarywang.wxpay.service.WxPayService;
  12. import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
  13. import com.github.binarywang.wxpay.util.SignUtils;
  14. import com.github.wxpay.sdk.WXPayUtil;
  15. import com.hys.app.framework.database.annotation.Id;
  16. import com.hys.app.framework.exception.ServiceException;
  17. import com.hys.app.framework.util.JsonUtil;
  18. import com.hys.app.pay.ali.PayOrder;
  19. import org.apache.commons.codec.digest.DigestUtils;
  20. import org.springframework.http.HttpStatus;
  21. import org.springframework.http.ResponseEntity;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.web.bind.annotation.GetMapping;
  24. import org.springframework.web.bind.annotation.RequestParam;
  25. import org.springframework.web.client.RestTemplate;
  26. import org.springframework.web.util.UriComponentsBuilder;
  27. import javax.annotation.Resource;
  28. import javax.servlet.http.HttpSession;
  29. import java.io.BufferedReader;
  30. import java.io.IOException;
  31. import java.io.InputStreamReader;
  32. import java.io.UnsupportedEncodingException;
  33. import java.net.*;
  34. import java.nio.charset.StandardCharsets;
  35. import java.util.*;
  36. @Service
  37. public class WxPayServiceMy {
  38. @Resource
  39. private WxConfig wxConfig;
  40. private WxPayService getPayService() {
  41. WxPayConfig payConfig = new WxPayConfig();
  42. payConfig.setAppId(wxConfig.getAppId());
  43. payConfig.setMchId(wxConfig.getMchId());
  44. payConfig.setMchKey(wxConfig.getMchKey());
  45. payConfig.setKeyPath(wxConfig.getKeyPath());
  46. payConfig.setApiV3Key(wxConfig.getApiV3Key());
  47. WxPayService wxPayService = new WxPayServiceImpl();
  48. wxPayService.setConfig(payConfig);
  49. return wxPayService;
  50. }
  51. public Object pay(PayOrder payOrder) throws UnknownHostException, WxPayException {
  52. // WxPayService wxPayService = getPayService();
  53. // //H5
  54. // WxPayUnifiedOrderRequest build = WxPayUnifiedOrderRequest.newBuilder()
  55. // .body(payOrder.getSubject())
  56. // .outTradeNo(payOrder.getTraceNo())
  57. // .feeType("CNY")
  58. // .totalFee((int) Math.round(payOrder.getTotalAmount() * 100))
  59. // .spbillCreateIp(InetAddress.getLocalHost().getHostAddress())
  60. // .notifyUrl(wxConfig.getNotifyUrl())
  61. // .tradeType("MWEB")
  62. // .build();
  63. // // // 设置商户子账户id
  64. // build.setSubMchId(wxConfig.getSubMchId());
  65. // WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(build);
  66. // return wxPayUnifiedOrderResult.getMwebUrl(); // 包含 mweb_url
  67. // WxPayUnifiedOrderRequest orderRequest = WxPayUnifiedOrderRequest.newBuilder()
  68. // .body(payOrder.getSubject())
  69. // .outTradeNo(payOrder.getTraceNo())
  70. // .totalFee((int) Math.round (payOrder.getTotalAmount()*100)) // 单位是分
  71. // .spbillCreateIp(InetAddress.getLocalHost().getHostAddress())
  72. // .notifyUrl(wxConfig.getNotifyUrl())
  73. // .tradeType("NATIVE")
  74. // .productId(IdUtil.fastUUID())
  75. // .build();
  76. // // 设置商户子账户id
  77. // orderRequest.setSubMchId(wxConfig.getSubMchId()); //
  78. // try {
  79. // WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(orderRequest);
  80. // return result.getCodeURL(); // 获取生成的二维码URL
  81. // } catch (WxPayException e) {
  82. // e.printStackTrace();
  83. // return null;
  84. // }
  85. WxPayService wxPayService = getPayService();
  86. WxPayUnifiedOrderRequest orderRequest = WxPayUnifiedOrderRequest.newBuilder()
  87. .body(payOrder.getSubject())
  88. .openid(payOrder.getOpenId())
  89. .outTradeNo(payOrder.getTraceNo())
  90. .totalFee((int) Math.round(payOrder.getTotalAmount() * 100)) // 单位是分
  91. .spbillCreateIp(InetAddress.getLocalHost().getHostAddress())
  92. .notifyUrl(wxConfig.getNotifyUrl())
  93. .tradeType("JSAPI")
  94. .productId(IdUtil.fastUUID())
  95. .build();
  96. // 设置商户子账户id
  97. orderRequest.setSubMchId(wxConfig.getSubMchId());
  98. try {
  99. WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(orderRequest);
  100. // Map<String, String> params = new HashMap<>();
  101. // params.put("appId", wxConfig.getAppId());
  102. // params.put("mchId", wxConfig.getMchId());
  103. // params.put("nonceStr", result.getNonceStr());
  104. // params.put("body", payOrder.getSubject());
  105. // params.put("outTradeNo", payOrder.getTraceNo());
  106. // params.put("totalFee", String.valueOf(payOrder.getTotalAmount()));
  107. // params.put("spbillCreateIp", payOrder.getIp());
  108. // params.put("notifyUrl", wxConfig.getNotifyUrl());
  109. // params.put("tradeType", "JSAPI"); // 或 "NATIVE", "APP" 等
  110. // params.put("package", "prepay_id=" + result.getPrepayId());
  111. // params.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
  112. // params.put("signtype", "MD5");
  113. // String sign = SignUtils.createSign(params, wxConfig.getMchKey(), null, null);
  114. // params.put("paySign", sign);
  115. // params.put("appId", wxConfig.getAppId());
  116. // params.put("key", wxConfig.getMchKey());
  117. // return params;
  118. Map<String, String> payData = new HashMap<>();
  119. payData.put("appId", wxConfig.getAppId());
  120. payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
  121. payData.put("nonceStr", result.getNonceStr());
  122. payData.put("package", "prepay_id=" + result.getPrepayId());
  123. payData.put("signType", "MD5");
  124. String sign = createSign(payData, wxConfig.getMchKey());
  125. payData.put("paySign", sign); // 将签名放入参数中
  126. System.out.println(payData);
  127. return payData;
  128. } catch (WxPayException e) {
  129. e.printStackTrace();
  130. return null;
  131. }
  132. }
  133. public static String createSign(Map<String, String> params, String signKey) {
  134. // 1. 对参数进行排序
  135. StringBuilder toSign = new StringBuilder();
  136. for (String key : new TreeMap<>(params).keySet()) {
  137. String value = params.get(key);
  138. if (value != null && !value.isEmpty()) {
  139. toSign.append(key).append("=").append(value).append("&");
  140. }
  141. }
  142. toSign.append("key=").append(signKey); // 2. 添加商户密钥
  143. // 3. 生成签名
  144. return DigestUtils.md5Hex(toSign.toString()).toUpperCase(); // 使用 MD5 签名
  145. }
  146. public String getOpenIdCode(Long userId, String ip) throws UnsupportedEncodingException {
  147. return String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect",
  148. wxConfig.getAppId(), URLEncoder.encode(wxConfig.getOAuth2Url(), "UTF-8"), "snsapi_userinfo", userId);
  149. }
  150. public String getOpenId(String code) {
  151. String urlString = String.format(
  152. "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
  153. wxConfig.getAppId(), wxConfig.getSecret(), code);
  154. try {
  155. URL url = new URL(urlString);
  156. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  157. connection.setRequestMethod("GET");
  158. BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
  159. StringBuilder response = new StringBuilder();
  160. String inputLine;
  161. while ((inputLine = in.readLine()) != null) {
  162. response.append(inputLine);
  163. }
  164. in.close();
  165. Map<String, Object> map = JsonUtil.toMap(response.toString());
  166. System.out.println(map.get("openid").toString() +"openid 是什么--------------------------------");
  167. return map.get("openid").toString();
  168. } catch (Exception e) {
  169. e.printStackTrace();
  170. return null; // 或者处理错误
  171. }
  172. }
  173. public String getAccessToken(String code) {
  174. RestTemplate restTemplate = new RestTemplate();
  175. String url = UriComponentsBuilder.fromHttpUrl(wxConfig.getTokenUrl())
  176. .queryParam("appid", wxConfig.getAppId())
  177. .queryParam("secret", wxConfig.getSecret())
  178. .queryParam("code", code)
  179. .queryParam("grant_type", "authorization_code")
  180. .toUriString();
  181. return restTemplate.getForObject(url, String.class);
  182. }
  183. public String getUserInfo(String accessToken, String openId) {
  184. RestTemplate restTemplate = new RestTemplate();
  185. String url = UriComponentsBuilder.fromHttpUrl(wxConfig.getUserInfoUrl())
  186. .queryParam("access_token", accessToken)
  187. .queryParam("openid", openId)
  188. .queryParam("lang", "zh_CN")
  189. .toUriString();
  190. return restTemplate.getForObject(url, String.class);
  191. }
  192. }