package com.ynxbd.common.service; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.PayOutCollect; import com.ynxbd.common.config.OCHelper; import com.ynxbd.common.dao.OutCollectPayDao; import com.ynxbd.common.helper.common.CopyHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import java.math.BigDecimal; @Slf4j public class OutCollectService { /** * [外采]扫收款码支付 */ public Order ocPayMicro(Order order, String brCode, String cardNo) { Order oResult = new Order(); PayOutCollect addInfo = CopyHelper.fatherToChild(order, PayOutCollect.class); addInfo.setBarCode(brCode); addInfo.setIdCardNo(cardNo); addInfo.setPayState(0); addInfo.setNoticeState(0); addInfo.setPayWay("2"); boolean isResult = new OutCollectPayDao().insert(addInfo); oResult.setSuccess(isResult); return oResult; } /** * [外采]支付 * * @param totalFee */ public void ocPay(String outTradeNo, BigDecimal totalFee, String collectId, String openid, String mid, String name, String cardNo, String patientId, String remark) throws ServiceException { log.info("collectId={}, mid={}, name={}, cardNo={}, patientId={}, remark={}", collectId, mid, name, cardNo, patientId, remark); if (ObjectUtils.isEmpty(collectId) || ObjectUtils.isEmpty(mid) || ObjectUtils.isEmpty(name) || ObjectUtils.isEmpty(cardNo)) { throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); } PayOutCollect addInfo = new PayOutCollect(); addInfo.setOutTradeNo(outTradeNo); addInfo.setTotalFee(totalFee); addInfo.setMid(mid); addInfo.setOpenid(openid); addInfo.setCollectId(collectId); // -------------------------- addInfo.setName(name); addInfo.setIdCardNo(cardNo); addInfo.setPatientId(patientId); addInfo.setRemark(remark); addInfo.setPayWay("3"); addInfo.setPayState(-1); addInfo.setNoticeState(-1); if (!new OutCollectPayDao().insert(addInfo)) { log.error("[外采]信息预存失败 collectId={}", collectId); } } /** * [外采]回调通知 */ private boolean callback(String bankTransNo, BigDecimal totalFee, String collectId) throws ServiceException { String resp = OkHttpHelper.get(OCHelper.URL + "/api/Pay/CallBack", map -> { map.put("collectId", collectId); map.put("payAmount", totalFee); map.put("bankTransNo", bankTransNo); }); log. info("[外采]回调 resp={}", resp); if (resp == null) { throw new ServiceException("[外采]回调请求失败"); } Result result = JsonHelper.parseObject(resp, Result.class); if (result == null) { throw new ServiceException("[外采]回调,数据转换失败"); } Integer code = result.getCode(); if (code == null || code != 200) { String tip = String.format("[外采]回调异常 code=%s, message=%s, code", code, result.getMessage()); throw new ServiceException(tip); } return true; } /** * [外采]回调通知 */ public void ocPayNotify(MerchantEnum merchantEnum, String openid, BigDecimal totalFee, String outTradeNo, String bankTransNo, String payInfo) throws ServiceException { OutCollectPayDao ocPayDao = new OutCollectPayDao(); PayOutCollect ocPay = ocPayDao.selectByOutTradeNo(outTradeNo); if (ocPay == null) { throw new ServiceException(ResultEnum.DATA_NOT_FOUND, String.format("【%s】[外采]数据库中未找到订单 outTradeNo={%s}, bankTransNo={%s}", merchantEnum.NAME, outTradeNo, bankTransNo)); } if (totalFee == null || totalFee.compareTo(BigDecimal.ZERO) == 0) { throw new ServiceException(ResultEnum.PAY_MONEY_IS_ZERO); } String collectId = ocPay.getCollectId(); if (collectId == null) { throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); } Integer payState = ocPay.getPayState(); Integer noticeState = ocPay.getNoticeState(); if (payState == null || noticeState == null || payState != -1 || noticeState != -1) { // 状态不明确 throw new ServiceException(ResultEnum.PAY_REPEAT, String.format("{%s}[外采]订单已支付 outTradeNo={%s}, bankTransNo={%s}", merchantEnum.NAME, outTradeNo, bankTransNo)); } // 更新商户支付状态 if (!ocPayDao.updateMerPaidByOutTradeNo(outTradeNo, bankTransNo)) { log.info("{} [外采]更新订单失败 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); } try { if (!callback(bankTransNo, ocPay.getTotalFee(), collectId)) { // 失败 return; } } catch (ServiceException e) { ocPayDao.updateNoticeErr(outTradeNo, 500, e.getMessage()); throw e; } if (!ocPayDao.updateNoticeOk(outTradeNo)) { log.info("{} [外采]更新信息失败 outTradeNo={}, collectId={}", merchantEnum.NAME, outTradeNo, collectId); } } }