| New file |
| | |
| | | package com.java110.acct.cmd.payment; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.java110.acct.payment.IPaymentBusiness; |
| | | import com.java110.acct.payment.IPaymentFactoryAdapt; |
| | | import com.java110.core.annotation.Java110Cmd; |
| | | import com.java110.core.context.ICmdDataFlowContext; |
| | | import com.java110.core.event.cmd.Cmd; |
| | | import com.java110.core.event.cmd.CmdEvent; |
| | | import com.java110.core.log.LoggerFactory; |
| | | import com.java110.dto.fee.PayFeeDto; |
| | | import com.java110.dto.payment.PaymentOrderDto; |
| | | import com.java110.dto.payment.PaymentPoolConfigDto; |
| | | import com.java110.dto.payment.PaymentPoolDto; |
| | | import com.java110.intf.acct.IPaymentPoolConfigV1InnerServiceSMO; |
| | | import com.java110.intf.acct.IPaymentPoolV1InnerServiceSMO; |
| | | import com.java110.intf.fee.IPayFeeV1InnerServiceSMO; |
| | | import com.java110.utils.cache.CommonCache; |
| | | import com.java110.utils.cache.MappingCache; |
| | | import com.java110.utils.constant.MappingConstant; |
| | | import com.java110.utils.exception.CmdException; |
| | | import com.java110.utils.factory.ApplicationContextFactory; |
| | | import com.java110.utils.util.Assert; |
| | | import com.java110.utils.util.DateUtil; |
| | | import com.java110.utils.util.StringUtil; |
| | | import org.slf4j.Logger; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.http.ResponseEntity; |
| | | |
| | | import java.text.ParseException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 统一支付接口 |
| | | */ |
| | | @Java110Cmd(serviceCode = "payment.pcCashier") |
| | | public class PcCashierCmd extends Cmd { |
| | | |
| | | |
| | | private static final Logger logger = LoggerFactory.getLogger(PcCashierCmd.class); |
| | | |
| | | protected static final String DEFAULT_PAYMENT_ADAPT = "wechatPaymentFactory";// 默认微信通用支付 |
| | | |
| | | @Autowired |
| | | private IPaymentPoolConfigV1InnerServiceSMO paymentPoolConfigV1InnerServiceSMOImpl; |
| | | |
| | | @Autowired |
| | | private IPaymentPoolV1InnerServiceSMO paymentPoolV1InnerServiceSMOImpl; |
| | | |
| | | @Autowired |
| | | private IPayFeeV1InnerServiceSMO payFeeV1InnerServiceSMOImpl; |
| | | |
| | | /** |
| | | * 校验 |
| | | * |
| | | * @param event 事件对象 |
| | | * @param context 请求报文数据 |
| | | * @param reqJson |
| | | * @throws CmdException |
| | | */ |
| | | |
| | | @Override |
| | | public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { |
| | | context.getReqHeaders().put("app-id", "992019111758490006"); |
| | | Assert.hasKeyAndValue(reqJson, "business", "未包含业务"); |
| | | Assert.hasKeyAndValue(reqJson, "cashierUserId", "未包含收银人员"); |
| | | // Assert.hasKeyAndValue(reqJson, "openId", "未包含openId"); |
| | | Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区ID"); |
| | | |
| | | context.getReqHeaders().put("user-id", reqJson.getString("cashierUserId")); |
| | | } |
| | | |
| | | @Override |
| | | public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { |
| | | if(reqJson.containsKey("custStartTime") && reqJson.containsKey("custEndTime")){ |
| | | reqJson.put("cycles", (DateUtil.dayCompare( |
| | | DateUtil.getDateFromStringB(reqJson.get("custStartTime").toString().split(" ")[0]), |
| | | DateUtil.getDateFromStringB(reqJson.get("custEndTime").toString().split(" ")[0]) |
| | | ))); |
| | | }else if(reqJson.containsKey("custEndTime") && !(reqJson.get("custEndTime").equals(""))){ |
| | | reqJson.put("cycles", (DateUtil.dayCompare( |
| | | DateUtil.getDateFromStringB(reqJson.get("endTime").toString().split(" ")[0]), |
| | | DateUtil.getDateFromStringB(reqJson.get("custEndTime").toString().split(" ")[0]) |
| | | ))); |
| | | } |
| | | logger.debug(">>>>>>>>>>>>>>>>支付参数报文,{}", reqJson.toJSONString()); |
| | | String appId = context.getReqHeaders().get("app-id"); |
| | | String userId = reqJson.getString("cashierUserId"); |
| | | |
| | | |
| | | //1.0 查询当前支付的业务 |
| | | |
| | | IPaymentBusiness paymentBusiness = ApplicationContextFactory.getBean(reqJson.getString("business"), IPaymentBusiness.class); |
| | | |
| | | if (paymentBusiness == null) { |
| | | throw new CmdException("当前支付业务不支持"); |
| | | } |
| | | |
| | | //2.0 相应业务 下单 返回 单号 ,金额, |
| | | reqJson.put("endTime",reqJson.getString("endTime").toString().split(" ")[0]+" 00:00:00"); |
| | | PaymentOrderDto paymentOrderDto = paymentBusiness.unified(context, reqJson); |
| | | paymentOrderDto.setAppId(appId); |
| | | paymentOrderDto.setUserId(userId); |
| | | // paymentOrderDto.setMoney(1); // TODO 测试数据 |
| | | |
| | | logger.debug(">>>>>>>>>>>>>>>>支付业务下单返回,{}", JSONObject.toJSONString(paymentOrderDto)); |
| | | |
| | | String env = MappingCache.getValue(MappingConstant.ENV_DOMAIN, "HC_ENV"); |
| | | |
| | | // 这里 演示环境不向微信下单 |
| | | if ("DEV".equals(env) || "TEST".equals(env)) { |
| | | paymentBusiness.notifyPayment(paymentOrderDto, reqJson); |
| | | JSONObject param = new JSONObject(); |
| | | param.put("code", "100"); |
| | | param.put("msg", "演示环境不触发支付"); |
| | | context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK)); |
| | | return; |
| | | } |
| | | |
| | | // 3.0 如果支付金额为0 直接调用 支付完通知接口 |
| | | if (paymentOrderDto.getMoney() <= 0) { |
| | | paymentBusiness.notifyPayment(paymentOrderDto, reqJson); |
| | | JSONObject param = new JSONObject(); |
| | | param.put("code", "100"); |
| | | param.put("msg", "扣费为0回调成功"); |
| | | context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK)); |
| | | return; |
| | | } |
| | | |
| | | // todo 3.0 寻找当前支付适配器 |
| | | String payAdapt = computeAdapt(reqJson.getString("business"), reqJson); |
| | | //MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAYMENT_ADAPT); |
| | | payAdapt = StringUtil.isEmpty(payAdapt) ? DEFAULT_PAYMENT_ADAPT : payAdapt; |
| | | |
| | | if (reqJson.containsKey("payAdapt") && !StringUtil.isEmpty(reqJson.getString("payAdapt"))) { |
| | | payAdapt = reqJson.getString("payAdapt"); |
| | | } |
| | | |
| | | IPaymentFactoryAdapt tPayAdapt = ApplicationContextFactory.getBean(payAdapt, IPaymentFactoryAdapt.class); |
| | | |
| | | // 4.0 相应支付厂家下单 |
| | | Map result = null; |
| | | try { |
| | | result = tPayAdapt.java110Payment(paymentOrderDto, reqJson, context); |
| | | } catch (Exception e) { |
| | | logger.error("支付异常", e); |
| | | throw new CmdException(e.getLocalizedMessage()); |
| | | } |
| | | ResponseEntity<String> responseEntity = new ResponseEntity(JSONObject.toJSONString(result), HttpStatus.OK); |
| | | |
| | | logger.debug("调用支付厂家返回,{}", responseEntity); |
| | | context.setResponseEntity(responseEntity); |
| | | |
| | | |
| | | // redis 中 保存 请求参数 |
| | | CommonCache.setValue("unifiedPayment_" + paymentOrderDto.getOrderId(), reqJson.toJSONString(), CommonCache.PAY_DEFAULT_EXPIRE_TIME); |
| | | } |
| | | |
| | | /** |
| | | * 计算适配器 |
| | | * |
| | | * @param business |
| | | * @param reqJson |
| | | * @return |
| | | */ |
| | | private String computeAdapt(String business, JSONObject reqJson) { |
| | | |
| | | String communityId = reqJson.getString("communityId"); |
| | | //todo 如果是单个费用缴费 |
| | | PaymentPoolDto paymentPoolDto = ifPayFeeBusiness(business, reqJson); |
| | | if (paymentPoolDto != null) { |
| | | reqJson.put("paymentPoolId", paymentPoolDto.getPpId()); |
| | | return paymentPoolDto.getBeanJsapi(); |
| | | } |
| | | |
| | | //todo 如果是临时车 |
| | | paymentPoolDto = ifTempCarFeeBusiness(business, communityId); |
| | | if (paymentPoolDto != null) { |
| | | reqJson.put("paymentPoolId", paymentPoolDto.getPpId()); |
| | | return paymentPoolDto.getBeanJsapi(); |
| | | } |
| | | |
| | | //todo 按小区查询 支付信息 |
| | | paymentPoolDto = new PaymentPoolDto(); |
| | | paymentPoolDto.setCommunityId(communityId); |
| | | paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_COMMUNITY); |
| | | paymentPoolDto.setState("Y"); |
| | | List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto); |
| | | if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) { |
| | | throw new IllegalArgumentException("小区未配置支付信息"); |
| | | } |
| | | |
| | | reqJson.put("paymentPoolId", paymentPoolDtos.get(0).getPpId()); |
| | | return paymentPoolDtos.get(0).getBeanJsapi(); |
| | | } |
| | | |
| | | /** |
| | | * 临时车场景处理 |
| | | * |
| | | * @param business |
| | | * @param communityId |
| | | * @return |
| | | */ |
| | | private PaymentPoolDto ifTempCarFeeBusiness(String business, String communityId) { |
| | | if (!"tempCarFee".equals(business)) { |
| | | return null; |
| | | } |
| | | //todo 按小区查询 支付信息 |
| | | PaymentPoolDto paymentPoolDto = new PaymentPoolDto(); |
| | | paymentPoolDto.setCommunityId(communityId); |
| | | paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_TEMP_CAT); |
| | | paymentPoolDto.setState("Y"); |
| | | List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto); |
| | | if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | return paymentPoolDtos.get(0); |
| | | } |
| | | |
| | | private PaymentPoolDto ifPayFeeBusiness(String business, JSONObject reqJson) { |
| | | String feeId = ""; |
| | | if (!"payFee".equals(business) || !reqJson.containsKey("feeId")) { |
| | | return null; |
| | | } |
| | | |
| | | feeId = reqJson.getString("feeId"); |
| | | if (StringUtil.isNumber(feeId)) { |
| | | return null; |
| | | } |
| | | |
| | | PayFeeDto feeDto = new PayFeeDto(); |
| | | feeDto.setFeeId(feeId); |
| | | feeDto.setCommunityId(reqJson.getString("communityId")); |
| | | List<PayFeeDto> feeDtos = payFeeV1InnerServiceSMOImpl.queryPayFees(feeDto); |
| | | |
| | | if (feeDtos == null || feeDtos.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | PaymentPoolConfigDto paymentPoolConfigDto = new PaymentPoolConfigDto(); |
| | | paymentPoolConfigDto.setConfigId(feeDtos.get(0).getConfigId()); |
| | | paymentPoolConfigDto.setCommunityId(feeDtos.get(0).getCommunityId()); |
| | | List<PaymentPoolConfigDto> paymentPoolConfigDtos = paymentPoolConfigV1InnerServiceSMOImpl.queryPaymentPoolConfigs(paymentPoolConfigDto); |
| | | if (paymentPoolConfigDtos == null || paymentPoolConfigDtos.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | PaymentPoolDto paymentPoolDto = new PaymentPoolDto(); |
| | | paymentPoolDto.setPpId(paymentPoolConfigDtos.get(0).getPpId()); |
| | | paymentPoolDto.setCommunityId(paymentPoolConfigDtos.get(0).getCommunityId()); |
| | | paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_FEE_CONFIG); |
| | | paymentPoolDto.setState("Y"); |
| | | List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto); |
| | | if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | return paymentPoolDtos.get(0); |
| | | } |
| | | } |