WxPayServiceMy.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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.springframework.http.HttpStatus;
  20. import org.springframework.http.ResponseEntity;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.web.bind.annotation.GetMapping;
  23. import org.springframework.web.bind.annotation.RequestParam;
  24. import javax.annotation.Resource;
  25. import javax.servlet.http.HttpSession;
  26. import java.io.BufferedReader;
  27. import java.io.IOException;
  28. import java.io.InputStreamReader;
  29. import java.io.UnsupportedEncodingException;
  30. import java.net.*;
  31. import java.nio.charset.StandardCharsets;
  32. import java.util.Base64;
  33. import java.util.HashMap;
  34. import java.util.LinkedHashMap;
  35. import java.util.Map;
  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 Map<String, String> pay(PayOrder payOrder) throws UnknownHostException {
  52. WxPayService wxPayService = getPayService();
  53. WxPayUnifiedOrderRequest orderRequest = WxPayUnifiedOrderRequest.newBuilder()
  54. .body(payOrder.getSubject())
  55. .openid(payOrder.getOpenId())
  56. .outTradeNo(payOrder.getTraceNo())
  57. .totalFee((int) Math.round(payOrder.getTotalAmount() * 100)) // 单位是分
  58. .spbillCreateIp(InetAddress.getLocalHost().getHostAddress())
  59. .notifyUrl(wxConfig.getNotifyUrl())
  60. .tradeType("JSAPI")
  61. .productId(IdUtil.fastUUID())
  62. .build();
  63. // 设置商户子账户id
  64. orderRequest.setSubMchId(wxConfig.getSubMchId());
  65. try {
  66. WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(orderRequest);
  67. Map<String, String> payData = new HashMap<>();
  68. payData.put("appId", wxConfig.getAppId());
  69. payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
  70. payData.put("nonceStr", result.getNonceStr());
  71. payData.put("package", "prepay_id=" + result.getPrepayId());
  72. payData.put("signType", "MD5");
  73. payData.put("openid", payOrder.getOpenId());
  74. payData.put("paySign", SignUtils.createSign(payData, wxPayService.getConfig().getMchKey(), null, null));
  75. System.out.println(payData.toString());
  76. return payData;
  77. } catch (WxPayException e) {
  78. e.printStackTrace();
  79. return null;
  80. }
  81. }
  82. public String getOpenIdCode(Long orderId) throws UnsupportedEncodingException {
  83. String oAuth2Url = wxConfig.getOAuth2Url();
  84. 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",
  85. wxConfig.getAppId(), URLEncoder.encode(wxConfig.getOAuth2Url(), "UTF-8"), "snsapi_base", orderId);
  86. }
  87. public String getOpenId(String code) {
  88. String urlString = String.format(
  89. "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
  90. wxConfig.getAppId(), wxConfig.getSecret(), code);
  91. try {
  92. URL url = new URL(urlString);
  93. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  94. connection.setRequestMethod("GET");
  95. BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
  96. StringBuilder response = new StringBuilder();
  97. String inputLine;
  98. while ((inputLine = in.readLine()) != null) {
  99. response.append(inputLine);
  100. }
  101. in.close();
  102. Map<String, Object> map = JsonUtil.toMap(response.toString());
  103. return map.get("openid").toString();
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. return null; // 或者处理错误
  107. }
  108. }
  109. }