ApiWxGlobalPayService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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.commons.logging.Log;
  18. import org.apache.commons.logging.LogFactory;
  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 Log logger = LogFactory.getLog(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(WechatGlobalNotifyResult result) {
  102. String time_end = result.getTime_end();
  103. String out_trade_no = result.getOut_trade_no();//商户订单号
  104. String transaction_id = result.getTransaction_id();//微信支付订单号
  105. String total_fee = result.getTotal_fee();//订单编号
  106. // 支付成功业务处理
  107. List<OrderVo> orderVoList = orderService.queryObjectByMerchOrderSn(out_trade_no);
  108. List<OrderProcessRecordEntity> processRecordEntityList = new ArrayList<>();
  109. Date timeEnd = DateUtils.convertStringToDate(time_end,DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
  110. if(orderVoList != null && orderVoList.size()>0) {
  111. for(OrderVo orderInfo:orderVoList) {
  112. //校验返回的订单金额是否与商户侧的订单金额一致
  113. String actualPrice = String.valueOf(orderInfo.getActual_price().multiply(Constant.ONE_HUNDRED));
  114. if(!total_fee.equalsIgnoreCase(actualPrice)){//不一致
  115. MallOrderExceptionRecord mallOrderExceptionRecord = new MallOrderExceptionRecord();
  116. mallOrderExceptionRecord.setUserId(Integer.parseInt(orderInfo.getUser_id()+""));
  117. mallOrderExceptionRecord.setOrderSn(orderInfo.getOrder_sn());
  118. mallOrderExceptionRecord.setExceptionStatus(Dict.exceptionStatus.item_04.getItem());
  119. mallOrderExceptionRecord.setCreateTime(new Date());
  120. mallOrderExceptionRecord.setExceptionContent("微信支付回调返回的订单金额与商户订单金额不一致");
  121. mallOrderExceptionRecordMapper.save(mallOrderExceptionRecord);//支付订单异常记录
  122. }
  123. if(Dict.orderStatus.item_100.getItem().equalsIgnoreCase(orderInfo.getOrder_status()+"")
  124. && Dict.payStatus.item_1.getItem().equalsIgnoreCase(orderInfo.getPay_status()+"")){
  125. OrderProcessRecordEntity processRecordEntity = orderProcessRecordMapper.queryObjectByOrderSn(orderInfo.getOrder_sn());
  126. if(processRecordEntity != null){
  127. OrderProcessRecordEntity entity = new OrderProcessRecordEntity();
  128. entity.setOrderSn(orderInfo.getOrder_sn());
  129. entity.setUserId(Integer.valueOf(orderInfo.getUser_id()+""));
  130. entity.setPaySuccTime(timeEnd);//微信下单完成时间
  131. entity.setId(processRecordEntity.getId());
  132. processRecordEntityList.add(entity);
  133. }
  134. orderInfo.setPayTransactionId(transaction_id);
  135. orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  136. orderInfo.setPay_time(timeEnd);//微信下单完成时间
  137. if (orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_100.getItem())) {
  138. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  139. }
  140. orderInfo.setTotalFee(Integer.parseInt(result.getTotal_fee()));//标价金额
  141. orderInfo.setFeeType(result.getFee_type());//标价币种
  142. orderInfo.setCashFee(Integer.parseInt(result.getCash_fee()));//用户支付金额
  143. orderInfo.setCashFeeType(result.getCash_fee_type());//用户支付金额币种
  144. orderInfo.setRate(result.getRate_value());//汇率
  145. orderService.update(orderInfo);
  146. orderProcessRecordMapper.updateBatch(processRecordEntityList);//更新订单流转信息
  147. // 微信支付成功通知
  148. orderService.notifyPaySuccess(orderInfo);
  149. }
  150. }
  151. }
  152. }
  153. @Transactional
  154. public void refundNotify(WechatRefundApiResult refundApiResult) {
  155. String success_time = refundApiResult.getSuccess_time();
  156. String out_trade_no = refundApiResult.getOut_trade_no();//商户订单号
  157. // 业务处理
  158. List<OrderVo> orderVoList = orderService.queryOrderByMerchOrderSnAndRefundStatus(out_trade_no);
  159. Date successTime = DateUtils.strToDate(success_time);
  160. if(orderVoList != null && orderVoList.size()>0) {
  161. for(OrderVo orderInfo:orderVoList) {
  162. if(orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
  163. || orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_401.getItem())){
  164. MallOrderRefund mallOrderRefund = mallOrderRefundMapper.queryObjectByOrderId(orderInfo.getId()+"");
  165. MallOrderRefund orderRefund = new MallOrderRefund();
  166. OrderVo orderVo = new OrderVo();
  167. if(mallOrderRefund != null){
  168. orderRefund.setOutRefundNo(refundApiResult.getOut_refund_no());
  169. orderRefund.setRefundTime(successTime);//退款成功时间
  170. orderRefund.setRefundId(refundApiResult.getRefund_id());
  171. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(refundApiResult.getRefund_fee())).divide(Constant.ONE_HUNDRED));
  172. if (refundApiResult.getRefund_status().equalsIgnoreCase(WechatGlobalUtil.WXTradeState.SUCCESS.getCode())) {
  173. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));
  174. orderRefund.setWechatRefundStatusDes("退款成功");
  175. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  176. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("PROCESSING")) {
  177. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));
  178. orderRefund.setWechatRefundStatusDes("退款处理中");
  179. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_3.getItem()));
  180. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("REFUNDCLOSE")) {
  181. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  182. orderRefund.setWechatRefundStatusDes("退款关闭");
  183. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_5.getItem()));
  184. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("CHANGE")) {
  185. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  186. orderRefund.setWechatRefundStatusDes("退款异常");
  187. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_6.getItem()));
  188. }
  189. orderRefund.setRefundRecvAccout(refundApiResult.getRefund_recv_accout());
  190. orderRefund.setId(mallOrderRefund.getId());
  191. mallOrderRefundMapper.update(orderRefund);//更新订单退款信息
  192. orderVo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  193. orderVo.setId(orderInfo.getId());
  194. orderService.update(orderVo);
  195. }
  196. }
  197. }
  198. }
  199. }
  200. }