ApiPayService.java 19 KB

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