WxPayServiceImpl.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.zhongzheng.service.impl;
  2. import cn.hutool.core.lang.Validator;
  3. import com.alibaba.fastjson.JSON;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  7. import com.google.zxing.BarcodeFormat;
  8. import com.google.zxing.client.j2se.MatrixToImageWriter;
  9. import com.google.zxing.common.BitMatrix;
  10. import com.google.zxing.qrcode.QRCodeWriter;
  11. import com.zhongzheng.common.config.WxSmallConfig;
  12. import com.zhongzheng.common.croe.RedisCache;
  13. import com.zhongzheng.common.filter.CustomException;
  14. import com.zhongzheng.common.util.DateUtils;
  15. import com.zhongzheng.common.util.IpUtils;
  16. import com.zhongzheng.common.util.ServletUtils;
  17. import com.zhongzheng.common.util.wx.WXPay;
  18. import com.zhongzheng.common.util.wx.WXPayUtil;
  19. import com.zhongzheng.domian.Order;
  20. import com.zhongzheng.domian.OrderPerson;
  21. import com.zhongzheng.service.IOrderAttachmentService;
  22. import com.zhongzheng.service.IOrderPersonService;
  23. import com.zhongzheng.service.IOrderService;
  24. import com.zhongzheng.service.IWxPayService;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.transaction.annotation.Transactional;
  30. import java.io.ByteArrayOutputStream;
  31. import java.math.BigDecimal;
  32. import java.util.*;
  33. import java.util.concurrent.TimeUnit;
  34. import java.util.stream.Collectors;
  35. @Service
  36. public class WxPayServiceImpl implements IWxPayService {
  37. // @Value("${wx.gzh.appid}")
  38. private String appid;
  39. // @Value("${wx.wepay.mchid}")
  40. private String mchid;
  41. // @Value("${wx.wepay.key}")
  42. private String key;
  43. // @Value("${wx.wepay.notifyUrl}")
  44. private String notifyUrl;
  45. @Autowired
  46. private IOrderService iOrderService;
  47. @Autowired
  48. private IOrderPersonService iOrderPersonService;
  49. @Autowired
  50. private RedisCache redisCache;
  51. @Override
  52. public String paymentCallBack(String notifyData) {
  53. String xmlBack = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml> ";
  54. try {
  55. Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData); // 转换成map
  56. String TenantId = notifyMap.get("attach");
  57. ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", TenantId);
  58. WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
  59. WXPay wxpay = new WXPay(config);
  60. if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
  61. String result_code = notifyMap.get("result_code");
  62. if ("SUCCESS".equals(result_code)) {
  63. String out_trade_no = notifyMap.get("out_trade_no");
  64. String transaction_id = notifyMap.get("transaction_id");
  65. Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
  66. if (ObjectUtils.isNotNull(order)) {
  67. if (dealOrder(out_trade_no, transaction_id)) {
  68. xmlBack = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  69. return xmlBack;
  70. }
  71. }
  72. }
  73. } else {
  74. // 签名错误,如果数据里没有sign字段,也认为是签名错误
  75. }
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. return xmlBack;
  80. }
  81. @Override
  82. @Transactional(rollbackFor = Exception.class)
  83. public boolean dealOrder(String out_trade_no, String transaction_id) {
  84. String key = out_trade_no;
  85. String ticket = redisCache.getCacheObject(key);
  86. if (Validator.isNotEmpty(ticket)) {
  87. return false;
  88. }
  89. redisCache.setCacheObject(key, "dealing", 30, TimeUnit.SECONDS);//30秒
  90. Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
  91. if (ObjectUtils.isNotNull(order) && order.getOrderStatus() == 0) {
  92. //已支付
  93. order.setOrderStatus(1);
  94. order.setPayTime(DateUtils.getNowTime());
  95. order.setTransid(transaction_id);
  96. order.setPayStatus(2);
  97. order.setCheckStatus(1);
  98. order.setOrderReceived(order.getPayPrice());
  99. //未付
  100. BigDecimal orderUncollected = order.getOrderUncollected();
  101. if (orderUncollected.compareTo(BigDecimal.ZERO) > 0) {
  102. BigDecimal subtract = order.getPayPrice().subtract(orderUncollected);
  103. order.setOrderUncollected(subtract);
  104. }
  105. iOrderService.updateById(order);
  106. //修改订单员工支付状态
  107. iOrderPersonService.update(new LambdaUpdateWrapper<OrderPerson>()
  108. .set(OrderPerson::getPayStatus,3)//已收费
  109. .eq(OrderPerson::getOrderSn, out_trade_no)
  110. .eq(OrderPerson::getStatus,1));
  111. }
  112. return true;
  113. }
  114. @Override
  115. public Map<String, String> paymentPc(String out_trade_no, String body, BigDecimal price) {
  116. WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
  117. BigDecimal unit = new BigDecimal(100);
  118. price = price.multiply(unit);
  119. try {
  120. WXPay wxpay = new WXPay(config);
  121. Map<String, String> data = new HashMap<String, String>();
  122. data.put("body", body);
  123. data.put("out_trade_no", out_trade_no);
  124. data.put("device_info", "");
  125. data.put("fee_type", "CNY");
  126. data.put("total_fee", price.longValue() + "");
  127. data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
  128. data.put("notify_url", notifyUrl);
  129. data.put("trade_type", "NATIVE");
  130. Date date = new Date();
  131. Date newDate = new Date(date.getTime() + 60000*30);
  132. String TenantId = ServletUtils.getRequest().getHeader("TenantId");
  133. data.put("attach", TenantId);
  134. Map<String, String> resp = wxpay.unifiedOrder(data);
  135. Map<String, String> result = new HashMap<>();
  136. String code_url = resp.get("code_url");
  137. if (Validator.isEmpty(code_url)) {
  138. throw new CustomException("支付错误");
  139. }
  140. QRCodeWriter qrCodeWriter = new QRCodeWriter();
  141. BitMatrix bitMatrix = qrCodeWriter.encode(code_url, BarcodeFormat.QR_CODE, 120, 120);
  142. // 写到输出流
  143. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  144. MatrixToImageWriter.writeToStream(bitMatrix, "jpg", outputStream);
  145. //转换为base64
  146. Base64.Encoder encoder1 = Base64.getEncoder();
  147. String urlBase64 = "data:image/jpeg;base64,"
  148. + encoder1.encodeToString(outputStream.toByteArray());
  149. result.put("urlBase64", urlBase64);
  150. Long overTime = (long)(newDate.getTime()/1000);
  151. result.put("overTime", overTime.toString());
  152. return result;
  153. } catch (Exception e) {
  154. e.printStackTrace();
  155. }
  156. return null;
  157. }
  158. }