JhService.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.pj.api.jh.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.NumberUtil;
  4. import cn.hutool.core.util.RandomUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.json.JSONObject;
  7. import cn.hutool.json.JSONUtil;
  8. import cn.hutool.log.StaticLog;
  9. import com.pj.api.jh.bo.JhNotifyBO;
  10. import com.pj.api.jh.bo.JhNotifySignBO;
  11. import com.pj.api.jh.utils.JhHttpUtils;
  12. import com.pj.api.jh.utils.MerchantApiUtil;
  13. import com.pj.api.wx.bo.Attach;
  14. import com.pj.api.wx.bo.NotifyBO;
  15. import com.pj.api.wx.service.WxService;
  16. import com.pj.current.config.JhConfig;
  17. import com.pj.current.config.MyConfig;
  18. import com.pj.current.config.PartConfig;
  19. import com.pj.current.config.WxConfig;
  20. import com.pj.current.task.TaskService;
  21. import com.pj.project.tb_order.TbOrder;
  22. import com.pj.project.tb_order.TbOrderService;
  23. import com.pj.project4sp.global.BusinessException;
  24. import com.pj.utils.sg.AjaxError;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.springframework.scheduling.annotation.Async;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import javax.annotation.Resource;
  30. import javax.servlet.http.HttpServletRequest;
  31. import java.nio.charset.Charset;
  32. import java.time.LocalDateTime;
  33. import java.time.format.DateTimeFormatter;
  34. import java.time.temporal.ChronoUnit;
  35. import java.util.Date;
  36. import java.util.HashMap;
  37. import java.util.List;
  38. import java.util.Map;
  39. /**
  40. * @Auther: lzm
  41. * @Date: 2022/04/19/17:38
  42. */
  43. @Service
  44. @Transactional
  45. @Slf4j
  46. public class JhService {
  47. @Resource
  48. MyConfig myConfig;
  49. @Resource
  50. JhConfig jhConfig;
  51. @Resource
  52. PartConfig partConfig;
  53. @Resource
  54. WxService wxService;
  55. @Resource
  56. private WxConfig wxConfig;
  57. @Resource
  58. JhHttpUtils jhHttpUtils;
  59. @Resource
  60. private TbOrderService tbOrderService;
  61. @Resource
  62. private TaskService taskService;
  63. public Map<String, ?> initPay(HttpServletRequest request) throws Exception {
  64. if (!jhConfig.isEnable()) {
  65. return wxService.prePay(request);
  66. }
  67. String money = request.getParameter("money");
  68. if (Double.valueOf(money) <= 0) {
  69. throw new BusinessException("金额不正确");
  70. }
  71. String openid = request.getParameter("openid");
  72. String calculateId = request.getParameter("calculateId");
  73. String desc = handlerDesc(request.getParameter("desc"));
  74. String businessId = request.getParameter("b");
  75. String c = request.getParameter("c");
  76. String a = request.getParameter("a");
  77. String i = request.getParameter("i");
  78. String businessType = request.getParameter("businessType");
  79. Attach atchMap = new Attach();
  80. atchMap.setC(c).setB(businessId).setA(a).setI(i);
  81. String attchStr = JSONUtil.toJsonStr(atchMap);
  82. TbOrder dbOrder = tbOrderService.find30Seconds(attchStr, LocalDateTime.now().minusSeconds(wxConfig.getLimitPaySeconds()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  83. if (dbOrder != null && !StrUtil.equals(dbOrder.getOpenid(), openid)) {
  84. throw new Exception("其他人正在付款....");
  85. }
  86. TbOrder successOrder = tbOrderService.findSuccessOrder(attchStr);
  87. if (successOrder != null && StrUtil.contains(attchStr, "b")) {
  88. throw new Exception("业务订单已支付....");
  89. }
  90. String out_trade_no = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + RandomUtil.randomNumbers(6);
  91. Map<String, Object> params = new HashMap<>();
  92. // params.put("attach", JSONUtil.toJsonStr(atchMap));
  93. params.put("productType", jhConfig.getProductType());
  94. params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo());
  95. params.put("openId", openid);
  96. params.put("merchantNo", jhConfig.getBusinessMerchantNo());
  97. params.put("tradeType", businessType);
  98. params.put("subTradeType", "");
  99. String total_free = partConfig.isTestEnv() ? "0.01" : money + "";
  100. params.put("orderPrice", total_free);
  101. params.put("outTradeNo", out_trade_no);
  102. params.put("productName", desc);
  103. params.put("orderIp", WxService.getIpAddress(request));
  104. String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
  105. params.put("orderTime", now);
  106. params.put("returnUrl", "");
  107. params.put("notifyUrl", myConfig.getDomain() + "/jh/notify");
  108. params.put("remark", desc);
  109. String paySecrit = jhConfig.getPaySecret();
  110. String sign = MerchantApiUtil.getSign(params, paySecrit);
  111. params.put("sign", sign);
  112. String jsonParam = JSONUtil.toJsonStr(params);
  113. String initPayUrl = jhConfig.getServerUrl() + "/uaps-web-gateway/cnpPay/initPay";
  114. String result = jhHttpUtils.postJson(initPayUrl, jsonParam);
  115. StaticLog.info("调用聚合支付返回:{}", result);
  116. JSONObject jsonResult = JSONUtil.parseObj(result);
  117. if (StrUtil.equals("0000", jsonResult.getStr("resultCode"))) {
  118. JSONObject payMessage = JSONUtil.parseObj(jsonResult.getStr("payMessage"));
  119. String p = payMessage.getStr("package");
  120. Map<String, String> r = wxService.getPayP(payMessage.getStr("timeStamp"), payMessage.getStr("nonceStr"), openid, p);
  121. StaticLog.info("re:{}", JSONUtil.toJsonStr(r));
  122. JSONObject object = JSONUtil.parseObj(payMessage);
  123. object.set("outTradeNo", out_trade_no);
  124. TbOrder tbOrder = new TbOrder();
  125. tbOrder.setAttach(attchStr)
  126. .setCalculateId(calculateId)
  127. .setOpenid(openid)
  128. .setOrderTime(new Date())
  129. .setOutTradeNo(out_trade_no).setPrice(money);
  130. tbOrderService.save(tbOrder);
  131. // taskService.addTask(new CheckPayStatusTask(RandomUtil.randomNumbers(12), 2000, out_trade_no));
  132. return BeanUtil.beanToMap(object);
  133. }
  134. throw new Exception("生成订单失败");
  135. // return new HashMap<>();
  136. }
  137. private String handlerDesc(String desc) {
  138. if (StrUtil.isEmpty(desc)) {
  139. return "";
  140. }
  141. if (desc.getBytes(Charset.forName("utf-8")).length > 128) {
  142. desc = StrUtil.sub(desc, 0, desc.lastIndexOf("-"));
  143. desc = handlerDesc(desc);
  144. }
  145. return desc;
  146. }
  147. public Map<String, Object> buildCheckParams(String outTradeNo) {
  148. Map<String, Object> params = new HashMap<>();
  149. params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo());
  150. params.put("outTradeNo", outTradeNo);
  151. String paySecrit = jhConfig.getPaySecret();
  152. String sign = MerchantApiUtil.getSign(params, paySecrit);
  153. params.put("sign", sign);
  154. return params;
  155. }
  156. public JSONObject checkPayResult(String outTradeNo) {
  157. String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
  158. Map<String, Object> params = buildCheckParams(outTradeNo);
  159. String result = jhHttpUtils.postForm(url, params);
  160. return JSONUtil.parseObj(result);
  161. }
  162. @Async
  163. public void notifyResult(JhNotifyBO bo) {
  164. JhNotifySignBO signBO = new JhNotifyBO();
  165. BeanUtil.copyProperties(bo, signBO);
  166. if (!MerchantApiUtil.isRightSign(BeanUtil.beanToMap(signBO), jhConfig.getPaySecret(), bo.getSign())) {
  167. log.error("无效签名:{}", JSONUtil.toJsonStr(bo));
  168. return;
  169. }
  170. String orderStatus = bo.getTradeStatus();
  171. if (!"SUCCESS".equals(orderStatus) && !"FINISH".equals(orderStatus)) {
  172. log.error("支付订单回调失败:{}", JSONUtil.toJsonStr(bo));
  173. return;
  174. }
  175. NotifyBO notifyBO = new NotifyBO();
  176. notifyBO.setOutTradeNo(bo.getOutTradeNo()).setTradeStatus(orderStatus)
  177. .setTransactionId(bo.getBankTrxNo()).setTimeEnd(bo.getSuccessTime())
  178. .setTotalFee(NumberUtil.mul(bo.getOrderPrice(), 100 + "").toString());
  179. wxService.WxNotify(notifyBO);
  180. }
  181. }