ApiWxGlobalPayService.java 12 KB

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