1
0

ApiWxGlobalPayService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package com.kmall.api.service.wxGlobal;
  2. import com.kmall.api.contants.Dict;
  3. import com.kmall.api.dao.*;
  4. import com.kmall.api.entity.*;
  5. import com.kmall.api.service.ApiGoodsGroupOpenDetailService;
  6. import com.kmall.api.service.ApiGoodsGroupOpenService;
  7. import com.kmall.api.service.ApiOrderService;
  8. import com.kmall.api.service.PayerChildOrderRealService;
  9. import com.kmall.api.service.pay.wxpay.WxPayPropertiesBuilder;
  10. import com.kmall.common.entity.FormIdsEntity;
  11. import com.kmall.common.service.FormIdsService;
  12. import com.kmall.common.utils.Constant;
  13. import com.kmall.common.utils.DateUtils;
  14. import com.kmall.common.utils.MapUtils;
  15. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  16. import com.kmall.common.utils.wechat.WechatUtil;
  17. import com.kmall.common.utils.wechat.wxglobal.WechatGlobalUtil;
  18. import com.kmall.common.utils.wechat.wxglobal.dto.WechatGlobalQueryApiResult;
  19. import org.apache.log4j.Logger;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.math.BigDecimal;
  24. import java.util.*;
  25. /**
  26. * 小程序form_id收集Service实现类
  27. *
  28. * @author Scott
  29. * @email
  30. * @date 2017-12-16 15:32:50
  31. */
  32. @Service
  33. public class ApiWxGlobalPayService {
  34. private static Logger logger = Logger.getLogger(ApiWxGlobalPayService.class);
  35. @Autowired
  36. private ApiOrderService orderService;
  37. @Autowired
  38. private FormIdsService formIdsService;
  39. @Autowired
  40. private PayerChildOrderRealService payerChildOrderRealService;
  41. @Autowired
  42. private ApiOrderExceptionRecordMapper mallOrderExceptionRecordMapper;
  43. @Autowired
  44. private ApiOrderProcessRecordMapper orderProcessRecordMapper;
  45. @Autowired
  46. private ApiOrderRefundMapper mallOrderRefundMapper;
  47. @Transactional
  48. public void payPrepay(Map<Object, Object> resultObj, WechatGlobalQueryApiResult queryApiResult, String nonceStr, List<OrderVo> orderVoList) {
  49. logger.info("payPrepay》》》》更新订单状态");
  50. String prepay_id = queryApiResult.getPrepay_id();
  51. resultObj.put("appId", WxPayPropertiesBuilder.instance().getAppId());
  52. resultObj.put("timeStamp", DateUtils.timeToStr(System.currentTimeMillis() / 1000, DateUtils.DATE_TIME_PATTERN));
  53. resultObj.put("nonceStr", nonceStr);
  54. resultObj.put("package", "prepay_id=" + prepay_id);
  55. resultObj.put("signType", "MD5");
  56. String paySign = WechatUtil.arraySign(resultObj, WxPayPropertiesBuilder.instance().getPaySignKey());
  57. resultObj.put("paySign", paySign);
  58. for (OrderVo orderInfo: orderVoList) {
  59. // 业务处理
  60. orderInfo.setPay_id(prepay_id);
  61. orderInfo.setPayFlag(Dict.payFlag.item_wxglobalpay.getItem());
  62. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_100.getItem()));
  63. orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_1.getItem())); // 付款中
  64. orderService.update(orderInfo);
  65. Map map = new HashMap();
  66. map.put("orderSn", orderInfo.getOrder_sn());
  67. List<PayerChildOrderRealEntity> list = payerChildOrderRealService.queryList(map);
  68. PayerChildOrderRealEntity entity = new PayerChildOrderRealEntity();
  69. entity.setGoodsBizType(orderInfo.getOrderBizType());
  70. entity.setOrderSn(orderInfo.getOrder_sn());
  71. entity.setMerchSn(orderInfo.getMerchSn());
  72. entity.setMerchOrderSn(orderInfo.getMerchOrderSn());
  73. entity.setPayNo(orderInfo.getPay_id());
  74. entity.setPayPrice(orderInfo.getActual_price());
  75. entity.setCreateTime(new Date());
  76. entity.setModTime(new Date());
  77. entity.setUserId(Integer.parseInt(orderInfo.getUser_id() + ""));
  78. if(list.size() > 0) {
  79. for (PayerChildOrderRealEntity payerChildOrderRealEntity:list) {
  80. entity.setId(payerChildOrderRealEntity.getId());
  81. payerChildOrderRealService.update(entity);
  82. }
  83. }else{
  84. payerChildOrderRealService.save(entity);//记录微信返回的支付单与子订单信息
  85. }
  86. FormIdsEntity formIdsEntity = formIdsService.getFormIdsByMerchOrderSn(orderInfo.getMerchOrderSn());
  87. if(formIdsEntity != null){
  88. FormIdsEntity formIds = new FormIdsEntity();
  89. formIds.setMerchOrderSn(orderInfo.getMerchOrderSn());
  90. formIds.setFormId(prepay_id);
  91. formIds.setValidNum(formIdsEntity.getValidNum()+1);
  92. formIds.setId(formIdsEntity.getId());
  93. formIdsService.releaseFormIds(formIds);
  94. }else{
  95. // 保存form_id
  96. formIdsService.save(orderInfo.getUser_id(), prepay_id, 1, orderInfo.getMerchOrderSn());
  97. }
  98. }
  99. }
  100. @Transactional
  101. public void notify(String out_trade_no,String total_fee,String transaction_id,String time_end) {
  102. // 业务处理
  103. List<OrderVo> orderVoList = orderService.queryObjectByMerchOrderSn(out_trade_no);
  104. List<OrderProcessRecordEntity> processRecordEntityList = new ArrayList<>();
  105. Date timeEnd = DateUtils.convertStringToDate(time_end,DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
  106. if(orderVoList != null && orderVoList.size()>0) {
  107. for(OrderVo orderInfo:orderVoList) {
  108. //校验返回的订单金额是否与商户侧的订单金额一致
  109. String actualPrice = String.valueOf(orderInfo.getActual_price().multiply(Constant.ONE_HUNDRED));
  110. if(!total_fee.equalsIgnoreCase(actualPrice)){//不一致
  111. MallOrderExceptionRecord mallOrderExceptionRecord = new MallOrderExceptionRecord();
  112. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUser_id()+""));
  113. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrder_sn());
  114. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_04.getItem());
  115. mallOrderExceptionRecord.setCreateTime(new Date());
  116. mallOrderExceptionRecord.setExceptionContent("微信支付回调返回的订单金额与商户订单金额不一致");
  117. mallOrderExceptionRecordMapper.save(mallOrderExceptionRecord);//支付订单异常记录
  118. }
  119. if(Dict.orderStatus.item_100.getItem().equalsIgnoreCase(orderInfo.getOrder_status()+"")
  120. && Dict.payStatus.item_1.getItem().equalsIgnoreCase(orderInfo.getPay_status()+"")){
  121. OrderProcessRecordEntity processRecordEntity = orderProcessRecordMapper.queryObjectByOrderSn(orderInfo.getOrder_sn());
  122. if(processRecordEntity != null){
  123. OrderProcessRecordEntity entity = new OrderProcessRecordEntity();
  124. entity.setOrderSn(orderInfo.getOrder_sn());
  125. entity.setUserId(Integer.valueOf(orderInfo.getUser_id()+""));
  126. entity.setId(processRecordEntity.getId());
  127. entity.setIsPaymentSend(Dict.isSend.item_1.getItem());
  128. entity.setPaySuccTime(timeEnd);//微信下单完成时间
  129. processRecordEntityList.add(entity);
  130. }
  131. orderInfo.setPayTransactionId(transaction_id);
  132. orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  133. orderInfo.setPay_time(timeEnd);//微信下单完成时间
  134. if (orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_100.getItem())) {
  135. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  136. }
  137. orderService.update(orderInfo);
  138. orderProcessRecordMapper.updateBatch(processRecordEntityList);//更新订单流转信息
  139. // 微信支付成功通知
  140. orderService.notifyPaySuccess(orderInfo);
  141. }
  142. }
  143. }
  144. }
  145. @Transactional
  146. public void refundNotify(WechatRefundApiResult refundApiResult) {
  147. String success_time = refundApiResult.getSuccess_time();
  148. String out_trade_no = refundApiResult.getOut_trade_no();//商户订单号
  149. // 业务处理
  150. List<OrderVo> orderVoList = orderService.queryOrderByMerchOrderSnAndRefundStatus(out_trade_no);
  151. Date successTime = DateUtils.strToDate(success_time);
  152. if(orderVoList != null && orderVoList.size()>0) {
  153. for(OrderVo orderInfo:orderVoList) {
  154. if(orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
  155. || orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_401.getItem())){
  156. MallOrderRefund mallOrderRefund = mallOrderRefundMapper.queryObjectByOrderId(orderInfo.getId()+"");
  157. MallOrderRefund orderRefund = new MallOrderRefund();
  158. if(mallOrderRefund != null){
  159. orderRefund.setOutRefundNo(refundApiResult.getOut_refund_no());
  160. orderRefund.setRefundTime(successTime);//退款成功时间
  161. orderRefund.setRefundId(refundApiResult.getRefund_id());
  162. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(refundApiResult.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  163. if (refundApiResult.getRefund_status().equalsIgnoreCase(WechatGlobalUtil.WXTradeState.SUCCESS.getCode())) {
  164. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));
  165. orderRefund.setWechatRefundStatusDes("退款成功");
  166. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("PROCESSING")) {
  167. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));
  168. orderRefund.setWechatRefundStatusDes("退款处理中");
  169. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("REFUNDCLOSE")) {
  170. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  171. orderRefund.setWechatRefundStatusDes("退款关闭");
  172. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("CHANGE")) {
  173. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  174. orderRefund.setWechatRefundStatusDes("退款异常");
  175. }
  176. orderRefund.setRefundRecvAccout(refundApiResult.getRefund_recv_accout());
  177. orderRefund.setId(mallOrderRefund.getId());
  178. mallOrderRefundMapper.update(orderRefund);//更新订单退款信息
  179. OrderVo orderVo = new OrderVo();
  180. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  181. orderVo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  182. orderVo.setId(orderInfo.getId());
  183. orderService.update(orderVo);
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }