You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							143 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							5.7 KiB
						
					
					
				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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 |