ApiPayService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package com.kmall.api.service;
  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.pay.wxpay.WxPayPropertiesBuilder;
  6. import com.kmall.common.entity.FormIdsEntity;
  7. import com.kmall.common.service.FormIdsService;
  8. import com.kmall.common.utils.DateUtils;
  9. import com.kmall.common.utils.MapUtils;
  10. import com.kmall.common.utils.wechat.WechatRefundApiResult;
  11. import com.kmall.common.utils.wechat.WechatUtil;
  12. import io.swagger.models.auth.In;
  13. import org.apache.log4j.Logger;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import java.math.BigDecimal;
  18. import java.util.*;
  19. /**
  20. * 小程序form_id收集Service实现类
  21. *
  22. * @author Scott
  23. * @email
  24. * @date 2017-12-16 15:32:50
  25. */
  26. @Service
  27. public class ApiPayService {
  28. private static Logger logger = Logger.getLogger(ApiPayService.class);
  29. @Autowired
  30. private ApiOrderService orderService;
  31. @Autowired
  32. private FormIdsService formIdsService;
  33. @Autowired
  34. private ApiGoodsGroupOpenDetailService apiGoodsGroupOpenDetailService;
  35. @Autowired
  36. private ApiGoodsGroupOpenService apiGoodsGroupOpenService;
  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. @Autowired
  46. private ApiUserCouponMapper apiUserCouponMapper;
  47. @Autowired
  48. private ApiOrderGoodsMapper apiOrderGoodsMapper;
  49. @Autowired
  50. private ApiProductStoreRelaMapper apiProductStoreRelaMapper;
  51. @Transactional
  52. public void payPrepay(Map<Object, Object> resultObj, Map<String, Object> resultUn, String nonceStr, List<OrderVo> orderVoList) {
  53. String prepay_id = MapUtils.getString("prepay_id", resultUn);
  54. // 先生成paySign 参考https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5
  55. //resultObj.put("appId", ResourceUtil.getConfigByName("wx.appId"));
  56. resultObj.put("appId", WxPayPropertiesBuilder.instance().getAppId());
  57. resultObj.put("timeStamp", DateUtils.timeToStr(System.currentTimeMillis() / 1000, DateUtils.DATE_TIME_PATTERN));
  58. resultObj.put("nonceStr", nonceStr);
  59. resultObj.put("package", "prepay_id=" + prepay_id);
  60. resultObj.put("signType", "MD5");
  61. //String paySign = WechatUtil.arraySign(resultObj, ResourceUtil.getConfigByName("wx.paySignKey"));
  62. String paySign = WechatUtil.arraySign(resultObj, WxPayPropertiesBuilder.instance().getPaySignKey());
  63. resultObj.put("paySign", paySign);
  64. for (OrderVo orderInfo: orderVoList) {
  65. // 业务处理
  66. orderInfo.setPay_id(prepay_id);
  67. orderInfo.setPay_status(1); // 付款中
  68. orderService.update(orderInfo);
  69. Map map = new HashMap();
  70. map.put("orderSn", orderInfo.getOrder_sn());
  71. List<PayerChildOrderRealEntity> list = payerChildOrderRealService.queryList(map);
  72. PayerChildOrderRealEntity entity = new PayerChildOrderRealEntity();
  73. entity.setGoodsBizType(orderInfo.getOrderBizType());
  74. entity.setOrderSn(orderInfo.getOrder_sn());
  75. entity.setMerchSn(orderInfo.getMerchSn());
  76. entity.setMerchOrderSn(orderInfo.getMerchOrderSn());
  77. entity.setPayNo(orderInfo.getPay_id());
  78. entity.setPayPrice(orderInfo.getActual_price());
  79. entity.setCreateTime(new Date());
  80. entity.setModTime(new Date());
  81. entity.setUserId(Integer.parseInt(orderInfo.getUser_id() + ""));
  82. if(list.size() == 0) {
  83. payerChildOrderRealService.save(entity);//记录微信返回的支付单与子订单信息
  84. }else{
  85. for (PayerChildOrderRealEntity payerChildOrderRealEntity:list) {
  86. entity.setId(payerChildOrderRealEntity.getId());
  87. payerChildOrderRealService.update(entity);
  88. }
  89. }
  90. FormIdsEntity formIdsEntity = formIdsService.getFormIdsByMerchOrderSn(orderInfo.getMerchOrderSn());
  91. if(formIdsEntity== null){
  92. // 保存form_id
  93. formIdsService.save(orderInfo.getUser_id(), prepay_id, 1, orderInfo.getMerchOrderSn());
  94. }else{
  95. FormIdsEntity formIds = new FormIdsEntity();
  96. formIds.setMerchOrderSn(orderInfo.getMerchOrderSn());
  97. formIds.setFormId(prepay_id);
  98. formIds.setId(formIdsEntity.getId());
  99. formIds.setValidNum(formIdsEntity.getValidNum()+1);
  100. formIdsService.releaseFormIds(formIds);
  101. }
  102. }
  103. }
  104. @Transactional
  105. public void notify(String out_trade_no,String total_fee,String transaction_id,String time_end) {
  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(new BigDecimal(100)));
  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.setExceptionContent("微信支付回调返回的订单金额与商户订单金额不一致");
  120. mallOrderExceptionRecord.setCreateTime(new Date());
  121. mallOrderExceptionRecordMapper.save(mallOrderExceptionRecord);//支付订单异常记录
  122. }
  123. if(Dict.orderStatus.item_0.getItem().equalsIgnoreCase(orderInfo.getOrder_status()+"")
  124. && (Dict.payStatus.item_0.getItem().equalsIgnoreCase(orderInfo.getPay_status()+"") || Dict.payStatus.item_1.getItem().equalsIgnoreCase(orderInfo.getPay_status()+""))
  125. ){
  126. OrderProcessRecordEntity processRecordEntity = orderProcessRecordMapper.queryObjectByOrderSn(orderInfo.getOrder_sn());
  127. if(processRecordEntity != null){
  128. OrderProcessRecordEntity entity = new OrderProcessRecordEntity();
  129. entity.setOrderSn(orderInfo.getOrder_sn());
  130. entity.setUserId(Integer.valueOf(orderInfo.getUser_id()+""));
  131. entity.setId(processRecordEntity.getId());
  132. entity.setPaySuccTime(timeEnd);//微信下单完成时间
  133. entity.setIsPaymentSend(Dict.isSend.item_1.getItem());
  134. processRecordEntityList.add(entity);
  135. }
  136. orderInfo.setPayTransactionId(transaction_id);
  137. orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_2.getItem()));
  138. orderInfo.setPay_time(timeEnd);//微信下单完成时间
  139. if (orderInfo.getOrder_status() == 0) {
  140. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
  141. }
  142. orderService.update(orderInfo);
  143. orderProcessRecordMapper.updateBatch(processRecordEntityList);//更新订单流转信息
  144. /*// 处理团购 todo 一期不实现团购
  145. if (null != orderInfo.getOrder_type() && orderInfo.getOrder_type().equals("2")) {
  146. GoodsGroupOpenDetailVo openDetailVo = apiGoodsGroupOpenDetailService.queryObject(orderInfo.getActivity_id());
  147. if (null != openDetailVo) {
  148. openDetailVo.setAttend_status(1);
  149. apiGoodsGroupOpenDetailService.update(openDetailVo);
  150. }
  151. GoodsGroupOpenVo openVo = apiGoodsGroupOpenService.queryObject(openDetailVo.getOpen_id());
  152. openVo.setAttend_num(openVo.getAttend_num() + 1);
  153. if (openVo.getMin_open_group() <= openVo.getAttend_num()) { // 一人拼团,直接结束
  154. openVo.setAttend_status(2);
  155. Map param = new HashMap();
  156. param.put("open_id", openDetailVo.getOpen_id());
  157. apiGoodsGroupOpenDetailService.updateComplete(param);
  158. } else {
  159. openVo.setAttend_status(1);
  160. }
  161. apiGoodsGroupOpenService.update(openVo);
  162. }*/
  163. // 微信支付成功通知
  164. orderService.notifyPaySuccess(orderInfo);
  165. // 打印机打印
  166. try {
  167. orderService.printMsg(orderInfo.getId());
  168. } catch (Exception e) {
  169. logger.error("打印机打印异常【" + e.getMessage() + "】");
  170. }
  171. }
  172. }
  173. }
  174. }
  175. /**
  176. * 退款
  177. * @param orderInfo
  178. */
  179. @Transactional
  180. public void refund(OrderVo orderInfo,WechatRefundApiResult result,String reason) {
  181. boolean needUpdateStock = true;
  182. if (orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_300.getItem())) {
  183. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_402.getItem()));
  184. } else if (orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
  185. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_402.getItem()));
  186. } else if (orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
  187. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  188. } else {
  189. orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
  190. }
  191. orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  192. // 判断是否有优惠券
  193. UserCouponVo couponVo = apiUserCouponMapper.queryByOrderId(orderInfo.getId());
  194. if (null != couponVo) {
  195. apiUserCouponMapper.cancelOrder(couponVo);
  196. }
  197. orderService.update(orderInfo);
  198. MallOrderRefund mallOrderRefund = mallOrderRefundMapper.queryObjectByOrderId(orderInfo.getId()+"");
  199. MallOrderRefund orderRefund = new MallOrderRefund();
  200. orderRefund.setRefundId(result.getRefund_id());
  201. orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
  202. orderRefund.setOutRefundNo(result.getOut_refund_no());
  203. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())));
  204. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));
  205. orderRefund.setModTime(new Date());
  206. if(mallOrderRefund !=null){
  207. orderRefund.setId(mallOrderRefund.getId());
  208. mallOrderRefundMapper.update(orderRefund);
  209. }else{
  210. orderRefund.setOrderId(Integer.parseInt(orderInfo.getId()+""));
  211. orderRefund.setUserId(Integer.parseInt(orderInfo.getUser_id()+""));
  212. orderRefund.setRefundReason(reason);
  213. orderRefund.setCreateTime(new Date());
  214. mallOrderRefundMapper.save(orderRefund);//退款记录
  215. }
  216. if (!needUpdateStock) {
  217. return;
  218. }
  219. // 更新库存
  220. Map<String, Object> map = new HashMap<String, Object>();
  221. map.put("order_id", orderInfo.getId());
  222. List<OrderGoodsVo> orderGoodsVoList = apiOrderGoodsMapper.queryList(map);
  223. for (OrderGoodsVo orderGoodsEntity : orderGoodsVoList) {
  224. ProductStoreRelaVo storeRelaEntity = apiProductStoreRelaMapper.queryByStoreIdProductId(Long.valueOf(orderInfo.getStore_id()), Long.valueOf(orderGoodsEntity.getProduct_id()));
  225. if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
  226. storeRelaEntity.setSellVolume(0);
  227. }
  228. BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume()).subtract(new BigDecimal(orderGoodsEntity.getNumber()));//销售量
  229. if (sellVolume.compareTo(new BigDecimal(0)) < 0) {
  230. sellVolume = new BigDecimal(0);
  231. }
  232. storeRelaEntity.setSellVolume(Integer.parseInt(String.valueOf(sellVolume)));
  233. if (null == storeRelaEntity.getStockNum()) {
  234. storeRelaEntity.setStockNum(0);
  235. }
  236. storeRelaEntity.setStockNum(storeRelaEntity.getStockNum() + orderGoodsEntity.getNumber());//库存数量
  237. apiProductStoreRelaMapper.update(storeRelaEntity);
  238. }
  239. /*// 是否是团购订单
  240. if (null != orderInfo.getOrder_type() && orderInfo.getOrder_type().equals("2")) {
  241. GoodsGroupOpenDetailVo openVo = apiGoodsGroupOpenDetailService.queryObject(orderInfo.getActivity_id());
  242. if (null != openVo) {
  243. openVo.setAttend_status(3);
  244. apiGoodsGroupOpenDetailService.update(openVo);
  245. }
  246. }*/
  247. }
  248. @Transactional
  249. public void refundNotify(WechatRefundApiResult refundApiResult) {
  250. String success_time = refundApiResult.getSuccess_time();
  251. String out_trade_no = refundApiResult.getOut_trade_no();//商户订单号
  252. // 业务处理
  253. List<OrderVo> orderVoList = orderService.queryObjectByMerchOrderSn(out_trade_no);
  254. Date successTime = DateUtils.strToDate(success_time);
  255. if(orderVoList != null && orderVoList.size()>0) {
  256. for(OrderVo orderInfo:orderVoList) {
  257. if(orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
  258. || orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_401.getItem())){
  259. MallOrderRefund mallOrderRefund = mallOrderRefundMapper.queryObjectByOrderId(orderInfo.getId()+"");
  260. MallOrderRefund orderRefund = new MallOrderRefund();
  261. if(mallOrderRefund != null){
  262. orderRefund.setRefundTime(successTime);//退款成功时间
  263. orderRefund.setOutRefundNo(refundApiResult.getOut_refund_no());
  264. orderRefund.setRefundId(refundApiResult.getRefund_id());
  265. orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(refundApiResult.getRefund_fee())));
  266. if (refundApiResult.getRefund_status().equalsIgnoreCase("SUCCESS")) {
  267. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));
  268. orderRefund.setWechatRefundStatusDes("退款成功");
  269. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("REFUNDCLOSE")) {
  270. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  271. orderRefund.setWechatRefundStatusDes("退款关闭");
  272. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("PROCESSING")) {
  273. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_5.getItem()));
  274. orderRefund.setWechatRefundStatusDes("退款处理中");
  275. } else if (refundApiResult.getRefund_status().equalsIgnoreCase("CHANGE")) {
  276. orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
  277. orderRefund.setWechatRefundStatusDes("退款异常");
  278. }
  279. orderRefund.setRefundRecvAccout(refundApiResult.getRefund_recv_accout());
  280. orderRefund.setId(mallOrderRefund.getId());
  281. mallOrderRefundMapper.update(orderRefund);//更新订单退款信息
  282. OrderVo orderVo = new OrderVo();
  283. orderVo.setPay_status(Integer.parseInt(Dict.payStatus.item_4.getItem()));
  284. orderVo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
  285. orderVo.setId(orderInfo.getId());
  286. orderService.update(orderVo);
  287. }
  288. }
  289. }
  290. }
  291. }
  292. }