WechatPayService.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.dk.oauth.service.wxapi.basic;
  2. import com.dk.common.response.ResponseResultUtil;
  3. import com.dk.common.response.ResponseResultVO;
  4. import com.dk.common.util.*;
  5. import com.dk.oauth.config.WechatPayConfigInfo;
  6. import com.dk.oauth.entity.Company;
  7. import com.dk.oauth.entity.Trade;
  8. import com.dk.oauth.entity.UserLogin;
  9. import com.dk.oauth.mapper.CompanyMapper;
  10. import com.dk.oauth.mapper.TradeMapper;
  11. import com.dk.oauth.mapper.UserMapper;
  12. import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
  13. import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
  14. import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
  15. import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
  16. import com.github.binarywang.wxpay.config.WxPayConfig;
  17. import com.github.binarywang.wxpay.exception.WxPayException;
  18. import com.github.binarywang.wxpay.service.WxPayService;
  19. import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import java.math.BigDecimal;
  25. import java.math.RoundingMode;
  26. import java.time.LocalDate;
  27. import java.util.Date;
  28. import java.util.HashMap;
  29. import java.util.Map;
  30. /**
  31. * 微信支付服务
  32. * 后台管理设置的金额 从dkic_ms里取数据 金额
  33. * 所以放到了 权限的oauth-server 的服务里240327
  34. *
  35. * @author 姜永辉
  36. * @since 20223-07-01 09:41:05
  37. */
  38. @Service("wechatPayService")
  39. @Slf4j
  40. public class WechatPayService {
  41. @Autowired
  42. private WechatPayConfigInfo wechatPayConfigInfo;
  43. @Autowired
  44. private TradeMapper tradeMapper;
  45. @Autowired
  46. private UserMapper userMapper;
  47. @Autowired
  48. private CompanyMapper companyMapper;
  49. /**
  50. * 商户 下单选取旗舰版或专业版的订单
  51. *
  52. * @param param
  53. * @return
  54. * @throws WxPayException
  55. */
  56. public ResponseResultVO unifiedOrder(Map<String, Object> param) throws WxPayException {
  57. String paymentSn = param.get("paymentSn").toString();
  58. String openId = param.get("openId").toString();
  59. log.info("下单选取旗舰版或专业版的订单1----------" + param.toString());
  60. try {
  61. // 获取单据的金额 --后台管理设置的金额 从dkic_ms里取数据 金额
  62. // 所以放到了 权限的oauth-server 的服务里
  63. // todo。。。。。。。。。。。。
  64. String payFee = "0.01";
  65. WxPayService wxPayService = this.getWxPayService();
  66. WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
  67. orderRequest.setBody("商品测试");
  68. orderRequest.setOutTradeNo(paymentSn);
  69. orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(payFee.toString()));//元转成分
  70. orderRequest.setOpenid(openId);
  71. orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
  72. orderRequest.setNotifyUrl(wechatPayConfigInfo.getWechatNotifyUrl() + "/" + wechatPayConfigInfo.getAppId());
  73. orderRequest.setTradeType("JSAPI");
  74. // 生成预支付订单
  75. WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest);
  76. String prepay_id = wxPayUnifiedOrderResult.getPrepayId();
  77. String timeStamp = new Date().getTime() + "";
  78. String nonceStr = UUID.fastUUID().toString(true);
  79. String pack = "prepay_id=" + prepay_id;
  80. String signType = "MD5";
  81. String paySign = "";
  82. String sigmTemp = "appId=" + wxPayUnifiedOrderResult.getAppid() + "&nonceStr=" + nonceStr + "&package="
  83. + pack + "&signType=" + signType + "&timeStamp=" + timeStamp;
  84. sigmTemp = sigmTemp + "&key=" + wechatPayConfigInfo.getMchKey();
  85. paySign = Md5Utils.hash(sigmTemp);
  86. log.info("下单选取旗舰版或专业版的订单2----------" + prepay_id + "--" + sigmTemp + "--");
  87. Map<String, Object> params = new HashMap<String, Object>();
  88. params.put("appId", wxPayUnifiedOrderResult.getAppid());
  89. params.put("timeStamp", timeStamp);
  90. params.put("nonceStr", nonceStr);
  91. params.put("pack", pack);
  92. params.put("signType", signType);
  93. params.put("paySign", paySign);
  94. log.info("下单选取旗舰版或专业版的订单3----------" + params.toString());
  95. return ResponseResultUtil.success(params);
  96. } catch (Exception e) {
  97. log.error("unifiedOrder--微信支付失败!支付单号:{},原因:{}", paymentSn, e.getMessage());
  98. return ResponseResultUtil.error("支付失败,请稍后重试!");
  99. }
  100. }
  101. /**
  102. * @desc : 处理支付成功逻辑
  103. * @author : 姜永辉
  104. * @date : 2024/03/06 11:29
  105. */
  106. @Transactional(
  107. rollbackFor = {Exception.class}
  108. )
  109. public ResponseResultVO notifyWechatPay(WxPayOrderNotifyResult info) {
  110. log.info("处理支付成功逻辑----------" + info.getOutTradeNo() + "---------" + info.toString());
  111. UserLogin byWxid = userMapper.getByWxid(info.getOpenid());
  112. log.info("微信用户----------" + byWxid);
  113. // 插入 待支付的 数据
  114. BigDecimal payFee = new BigDecimal(info.getTotalFee()).divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
  115. Integer cpid = byWxid.getCurrentCp();
  116. // 交易记录
  117. Trade trade = new Trade();
  118. trade.setTradeCode(info.getTransactionId()); // 微信交易单号
  119. trade.setCpId(cpid);
  120. trade.setWxUserId(byWxid.getUserId());
  121. trade.setTradeAmount(payFee);
  122. trade.setTradeType("功能单买");
  123. trade.setBuyLong("1年");
  124. trade.setBuyBeginDate(LocalDate.now());
  125. trade.setBuyEndDate(LocalDate.now().plusYears(1));
  126. trade.setWxGradeCoNo(info.getTransactionId());// 微信交易单号
  127. trade.setExtendDays(365);
  128. tradeMapper.insert(trade);
  129. log.info("交易记录----------" + trade);
  130. // 企业
  131. Company c = new Company();
  132. c.setCpId(cpid);
  133. // 结束日期
  134. c.setEndDate(LocalDate.now().plusYears(1));
  135. companyMapper.updateById(c);
  136. log.info("交易记录-企业更新----------" + c);
  137. return ResponseResultUtil.success();
  138. }
  139. /**
  140. * @desc : 获取商户配置信息
  141. * @author : 姜永辉
  142. * @date : 2023-08-02 17:30
  143. */
  144. public WxPayService getWxPayService() {
  145. log.info("getWxPayService----------" + wechatPayConfigInfo.toString());
  146. WxPayConfig payConfig = new WxPayConfig();
  147. payConfig.setAppId(StringUtils.trimToNull(wechatPayConfigInfo.getAppId()));
  148. payConfig.setMchId(StringUtils.trimToNull(wechatPayConfigInfo.getMchId()));
  149. payConfig.setMchKey(StringUtils.trimToNull(wechatPayConfigInfo.getMchKey()));
  150. // payConfig.setSubAppId(null);
  151. // payConfig.setSubMchId(null);
  152. // payConfig.setKeyPath(StringUtils.trimToNull(wechatPayConfigInfo.getKeyPath()));
  153. // 可以指定是否使用沙箱环境
  154. payConfig.setUseSandboxEnv(false);
  155. WxPayService wxPayService = new WxPayServiceImpl();
  156. wxPayService.setConfig(payConfig);
  157. return wxPayService;
  158. }
  159. }