From 037c144cd417410deb8137c6f3fd271a34691742 Mon Sep 17 00:00:00 2001 From: jiangping <jp@doumee.com> Date: 星期二, 12 十二月 2023 18:18:17 +0800 Subject: [PATCH] 服务商支付版本 --- server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java | 201 +++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 156 insertions(+), 45 deletions(-) diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java index 22043e0..566ca83 100644 --- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java +++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java @@ -1,5 +1,7 @@ package com.doumee.service.business.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -17,6 +19,7 @@ import com.doumee.core.utils.Utils; import com.doumee.core.wx.WxMiniConfig; import com.doumee.core.wx.WxMiniUtilService; +import com.doumee.core.wx.WxPayProperties; import com.doumee.dao.business.*; import com.doumee.dao.business.MemberRidesMapper; import com.doumee.dao.business.join.GoodsorderJoinMapper; @@ -38,11 +41,11 @@ import com.doumee.service.business.MemberRidesService; import com.doumee.service.business.PricingRuleService; import com.doumee.service.business.RefundService; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; -import com.github.binarywang.wxpay.exception.WxPayException; import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension; +import com.wechat.pay.java.service.partnerpayments.jsapi.model.*; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.checkerframework.checker.units.qual.A; @@ -64,8 +67,10 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service +@Slf4j public class GoodsorderServiceImpl implements GoodsorderService { @@ -473,10 +478,22 @@ closeGoodsorder( goodsorder,Constants.REFUND_TYPE.PLAT_FORCE.getKey()); } + /** + * 鍙戣捣閫�娆剧敵璇� + * @param goodsorder + * @param type + */ @Transactional(rollbackFor = {Exception.class,BusinessException.class}) @Override public void closeGoodsorder( Goodsorder goodsorder ,int type ) { - + Refund r = refundMapper.selectOne(new QueryWrapper<Refund>().lambda() + .eq(Refund::getObjId,goodsorder.getId()) + .eq(Refund::getIsdeleted,Constants.ZERO) + .eq(Refund::getStatus,Constants.ZERO) + .last("limit 1" )); + if(r != null){ + throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞瓨鍦ㄩ��娆剧敵璇锋鍦ㄥ鐞嗕腑锛岃绋嶅悗鏌ョ湅璁㈠崟淇℃伅鍝"); + } List<MemberRides> memberRides = getMemberRidesForClose(goodsorder.getId()); //榛樿缁撶畻涓烘娂閲戦噾棰� BigDecimal closeMoney = new BigDecimal(0.00); @@ -485,6 +502,55 @@ closeMoney = getCloseMoneyByRides(memberRides,true,goodsorder.getMoney()).getAmount(); //瀹為檯缁撶畻浠锋牸锛岃褰曞湪鏈�楂樿溅鍨嬭褰曚笂 memberRides.get(0).setActualPrice(closeMoney); + } + int refundMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(closeMoney)).intValue();//璁$畻浠锋牸 + RefundDTO refundDTO = new RefundDTO(); + refundDTO.setOrderId(goodsorder.getId()); + refundDTO.setCanBalance(goodsorder.getMoney()); + refundDTO.setRefundAmount(new BigDecimal(refundMoney)); + refundDTO.setTotalAmount(goodsorder.getMoney()); + refundDTO.setMemberId(goodsorder.getMemberId()); + refundDTO.setReason(Constants.REFUND_TYPE.get(type).getName()); + refundDTO.setCreator(goodsorder.getEditor()); + refundDTO.setType(type); + wxMiniUtilService.wxRefund(refundDTO); + } + + /** + * 閫�娆炬垚鍔熷洖璋� + */ + @Transactional(rollbackFor = {Exception.class,BusinessException.class}) + @Override + public void closeGoodsorderDone(RefundNotification param) { + //鏌ヨ閫�娆剧敵璇疯鍗� + Refund refund = refundMapper.selectById(param.getOutRefundNo()); + if(refund == null + || Constants.formatIntegerNum(refund.getIsdeleted()) == Constants.ONE + || Constants.formatIntegerNum(refund.getStatus()) == Constants.TWO){ + return; + } + if (!"SUCCESS".equals(param.getRefundStatus().name())) { + // 濡傛灉閫�娆剧姸鎬佷笉姝g‘锛屼慨鏀归��娆惧崟鐘舵�� + refund.setStatus(Constants.ONE); + refund.setEditDate(new Date()); + refund.setOnlineOrderid(param.getTransactionId()); + refund.setDoneDate(refund.getEditDate()); + //鏇存柊閫�娆惧崟鐘舵�� + refundMapper.updateById(refund); + return; + } + refund.setOnlineOrderid(param.getTransactionId()); + doRefundTransactions(refund); + + Goodsorder goodsorder = goodsorderMapper.selectById(refund.getObjId()); + if(goodsorder ==null || Constants.formatIntegerNum(goodsorder.getCloseStatus()) != Constants.ZERO){ + return; + } + //杩涜璁㈠崟缁撶畻涓氬姟澶勭悊 + List<MemberRides> memberRides = getMemberRidesForClose(refund.getObjId()); + //榛樿缁撶畻涓烘娂閲戦噾棰� + if (!CollectionUtils.isEmpty(memberRides)){ + //楠戣鎬绘椂闀� for(MemberRides model :memberRides){ MemberRides up = new MemberRides(); up.setId(model.getId()); @@ -497,12 +563,15 @@ memberRidesJoinMapper.updateById(up); } } + BigDecimal closeMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(refund.getMoney())); + //閫�娆句箰琛� + int type =Constants.formatIntegerNum(refund.getType()); Goodsorder update = new Goodsorder(); update.setId(goodsorder.getId()); update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey()); update.setCloseMoney(closeMoney); update.setCloseDate(new Date()); - update.setCloseInfo(Constants.REFUND_TYPE.get(type).getInfo()); + update.setCloseInfo(Constants.REFUND_TYPE.get(refund.getType()).getInfo()); update.setCloseUserId(goodsorder.getEditor()); if(Constants.REFUND_TYPE.PLAT_FORCE.getKey() == type){ //濡傛灉鏄己鍒剁粨绠� @@ -516,21 +585,7 @@ //濡傛灉鏄钩鍙拌嚜鍔ㄧ粨绠� update.setCloseType(Constants.TWO); } - int refundMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(closeMoney)).intValue();//璁$畻浠锋牸 - if(refundMoney > 0){ - //濡傛灉鏈夐��娆撅紝鐢宠寰俊閫�娆撅紝璁板綍閫�娆句氦鏄撴祦姘� - RefundDTO refundDTO = new RefundDTO(); - refundDTO.setOrderId(goodsorder.getId()); - refundDTO.setCanBalance(goodsorder.getMoney()); - refundDTO.setRefundAmount(new BigDecimal(refundMoney)); - refundDTO.setTotalAmount(goodsorder.getMoney()); - refundDTO.setMemberId(goodsorder.getMemberId()); - refundDTO.setReason(Constants.REFUND_TYPE.get(type).getName()); - refundDTO.setCreator(update.getEditor()); - refundDTO.setType(type); - Refund refund = wxMiniUtilService.wxRefund(refundDTO); - update.setCloseId(refund.getId()); - } + update.setCloseId(refund.getId()); //瀛樺偍 娑堣垂浜ゆ槗娴佹按 Transactions transactions = new Transactions(); transactions.setId(Constants.getUUID()); @@ -538,7 +593,7 @@ transactions.setCreateDate(new Date()); transactions.setIsdeleted(Constants.ZERO); transactions.setOrderId(goodsorder.getId()); - transactions.setMoney(goodsorder.getMoney().subtract(new BigDecimal(refundMoney))); + transactions.setMoney(goodsorder.getMoney().subtract(Constants.formatDecimalNum(refund.getMoney()))); transactions.setType(Constants.TRANSACTIONS_TYPE.CONSUMPTION.getKey()); transactions.setDoneDate(new Date()); transactions.setTitle(Constants.TRANSACTIONS_TYPE.CONSUMPTION.getName()); @@ -549,6 +604,46 @@ transactionsMapper.insert(transactions); //淇敼璁㈠崟淇℃伅 goodsorderMapper.updateById(update); + } + + private void doRefundTransactions(Refund refund ) { + //瀛樺偍浜ゆ槗娴佹按琛� + refund.setStatus(Constants.TWO); + refund.setEditDate(new Date()); + refund.setDoneDate(refund.getEditDate()); + //鏇存柊閫�娆惧崟鐘舵�� + refundMapper.updateById(refund); + + Transactions transactions = new Transactions(); + transactions.setId(Constants.getUUID()); + transactions.setMemberId(refund.getMemberId()); + transactions.setCreateDate(new Date()); + transactions.setIsdeleted(Constants.ZERO); + transactions.setOrderId(refund.getObjId()); + transactions.setMoney(refund.getMoney()); + transactions.setPreOrderid(refund.getObjId()); + transactions.setOnlineOrderid(refund.getId()); + transactions.setDoneDate(new Date()); + if(refund.getType().equals(Constants.REFUND_TYPE.PLAT_AUTO.getKey())||refund.getType().equals(Constants.REFUND_TYPE.PLAT_FORCE.getKey())){ + //骞冲彴鑷姩閫�娆� 鎴� 寮哄埗閫�娆� + transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey()); + transactions.setTitle(Constants.REFUND_TYPE.PLAT_AUTO.getInfo()); + transactions.setContent(Constants.REFUND_TYPE.PLAT_AUTO.getInfo()); + }else if(refund.getType().equals(Constants.REFUND_TYPE.NORMAL.getKey())){ + //鐢ㄦ埛涓诲姩閫�娆� + transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey()); + transactions.setTitle(Constants.REFUND_TYPE.NORMAL.getInfo()); + transactions.setContent(Constants.REFUND_TYPE.NORMAL.getInfo()); + }else if(refund.getType().equals(Constants.REFUND_TYPE.BACK.getKey())){ + //缁撶畻鍚庨��娆� + transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey()); + transactions.setTitle(Constants.REFUND_TYPE.BACK.getInfo()); + transactions.setContent(Constants.REFUND_TYPE.BACK.getInfo()); + } + transactions.setBalance(BigDecimal.ZERO); + transactions.setObjId(refund.getId()); + transactions.setObjType(Constants.ONE); + transactionsMapper.insert(transactions); } private RidesDetailResponse getCloseMoneyByRides(List<MemberRides> memberRides,boolean isClose,BigDecimal yjMoney) { @@ -636,7 +731,8 @@ refundDTO.setCreator(principal.getId()); refundDTO.setReason(reason); refundDTO.setType(Constants.REFUND_TYPE.BACK.getKey()); - Refund refund = wxMiniUtilService.wxRefund(refundDTO); + //鍙戣捣閫�娆剧敵璇� + wxMiniUtilService.wxRefund(refundDTO); }else { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝閫�娆鹃噾棰濅笉鍏佽瓒呰繃"+canBalance+"鍏�"); } @@ -825,23 +921,43 @@ goodsorder.setPayWay(Constants.ZERO); this.goodsorderMapper.insert(goodsorder); //璋冭捣鏀粯 + Object response = null; try { - Object response = null; - WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); - request.setBody("楠戣鎶奸噾"); - request.setAttach("createGoodsOrder"); - request.setOutTradeNo(goodsorder.getId()); - request.setTotalFee(goodsorder.getMoney().intValue()); - request.setSpbillCreateIp(this.getIpAddr()); - request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss")); - request.setOpenid(member.getOpenid()); - response = WxMiniConfig.wxPayService.createOrder(request); - return response; - } catch (WxPayException e) { - e.printStackTrace(); - throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage()); + response = getWxPayResponse(goodsorder,member.getOpenid()); + } catch (Exception e) { + throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍙戣捣鏀粯澶辫触~"); } + + return response; } + + private Object getWxPayResponse(Goodsorder goodsorder,String openid) throws Exception { + //璋冭捣鏀粯 + Object response = null; + PrepayRequest request = new PrepayRequest(); + request.setAttach("createGoodsOrder"); + request.setDescription("妫灄鍏洯鑷杞﹂獞琛屾娂閲戞敮浠�"); + request.setSpMchid(WxMiniConfig.wxProperties.getMchId()); + request.setSpAppid(WxMiniConfig.wxProperties.getAppId()); + request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId()); + request.setSubAppid(WxMiniConfig.wxProperties.getSubAppId()); + Payer payer = new Payer(); + payer.setSubOpenid(openid); + request.setPayer(payer); + request.setOutTradeNo(goodsorder.getId()); + request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//杩欎釜鍥炶皟url蹇呴』鏄痟ttps寮�澶寸殑 + Amount amount = new Amount(); + amount.setTotal(goodsorder.getMoney().intValue()); + request.setAmount(amount); +// PrepayResponse res = WxMiniConfig.wxPayService.prepay(request); + // 璺熶箣鍓嶄笅鍗曠ず渚嬩竴鏍凤紝濉厖棰勪笅鍗曞弬鏁� + PrepayWithRequestPaymentResponse resParam = WxMiniConfig.jsapiExtService.prepayWithRequestPayment(request,WxMiniConfig.wxProperties.getSubAppId()); + response =resParam; + + return response; + + } + /** * 楠岃瘉钀ヤ笟鏃堕棿 @@ -897,10 +1013,8 @@ s.setEditDate(date); s.setEditor(null); s.setCloseDate(date); - closeGoodsorder(s,Constants.REFUND_TYPE.PLAT_AUTO.getKey()); }catch (BusinessException e){ - }catch (Exception e){ } @@ -915,10 +1029,7 @@ .eq("status",Constants.goodsorderStatus.pay) .last(" limit 1 ")); if(Objects.isNull(goodsorder)){ - throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏃犻獞琛岃鍗曡褰�"); - } - if(goodsorder == null ){ - throw new BusinessException(ResponseStatus.DATA_EMPTY ); + throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�"); } if(Constants.formatIntegerNum(goodsorder.getStatus()) != Constants.GOODSORDER_STATUS.HAVING_PAY.getKey() ){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ヨ鍗曞綋鍓嶇姸鎬佷笉鏀寔缁撶畻鎿嶄綔锛岃灏濊瘯鍒锋柊鍒楄〃閲嶈瘯锛�" ); @@ -935,7 +1046,7 @@ public String payNotify(String preOrderId,String paymentNo){ Goodsorder goodsorder = this.goodsorderMapper.selectById(preOrderId); if(goodsorder.getStatus()==Constants.goodsorderStatus.pay){ - return WxPayNotifyResponse.success("澶勭悊鎴愬姛!"); + return ("澶勭悊鎴愬姛!"); } goodsorder.setOnlineOrderid(paymentNo); goodsorder.setPayStatus(Constants.goodsorderPayStatus.pay); @@ -960,7 +1071,7 @@ transactions.setObjId(goodsorder.getId()); transactions.setObjType(Constants.ZERO); transactionsMapper.insert(transactions); - return WxPayNotifyResponse.success("澶勭悊鎴愬姛!"); + return ("澶勭悊鎴愬姛!"); } -- Gitblit v1.9.3