service-acct/src/main/java/com/java110/acct/cmd/payment/NativeQrcodePaymentCmd.java
@@ -9,7 +9,13 @@ 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.paymentPool.PaymentPoolDto; import com.java110.dto.paymentPoolConfig.PaymentPoolConfigDto; 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.WechatConstant; @@ -18,10 +24,12 @@ import com.java110.utils.util.Assert; 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; /** @@ -36,10 +44,19 @@ protected static final String DEFAULT_PAYMENT_ADAPT = "wechatNativeQrcodePaymentFactory";// 默认微信通用支付 @Autowired private IPaymentPoolConfigV1InnerServiceSMO paymentPoolConfigV1InnerServiceSMOImpl; @Autowired private IPaymentPoolV1InnerServiceSMO paymentPoolV1InnerServiceSMOImpl; @Autowired private IPayFeeV1InnerServiceSMO payFeeV1InnerServiceSMOImpl; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { Assert.hasKeyAndValue(reqJson, "business", "未包含业务"); Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区"); } @@ -68,7 +85,7 @@ logger.debug(">>>>>>>>>>>>>>>>支付业务下单返回,{}", JSONObject.toJSONString(paymentOrderDto)); // 3.0 寻找当前支付适配器 String payAdapt = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.NATIVE_QRCODE_PAYMENT_ADAPT); String payAdapt = computeAdapt(reqJson.getString("business"), reqJson);//MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.NATIVE_QRCODE_PAYMENT_ADAPT); payAdapt = StringUtil.isEmpty(payAdapt) ? DEFAULT_PAYMENT_ADAPT : payAdapt; if (reqJson.containsKey("payAdapt") && !StringUtil.isEmpty(reqJson.getString("payAdapt"))) { @@ -94,4 +111,105 @@ // redis 中 保存 请求参数 CommonCache.setValue("nativeQrcodePayment_" + 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.getBeanNative(); } //todo 如果是临时车 paymentPoolDto = ifTempCarFeeBusiness(business, communityId); if (paymentPoolDto != null) { reqJson.put("paymentPoolId", paymentPoolDto.getPpId()); return paymentPoolDto.getBeanNative(); } //todo 按小区查询 支付信息 paymentPoolDto = new PaymentPoolDto(); paymentPoolDto.setCommunityId(communityId); paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_COMMUNITY); 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).getBeanNative(); } /** * 临时车场景处理 * * @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); 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); List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto); if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) { return null; } return paymentPoolDtos.get(0); } } service-acct/src/main/java/com/java110/acct/payment/adapt/wechat/WechatNativeQrcodePaymentFactoryAdapt.java
@@ -9,9 +9,11 @@ import com.java110.core.log.LoggerFactory; import com.java110.dto.payment.NotifyPaymentOrderDto; import com.java110.dto.payment.PaymentOrderDto; import com.java110.dto.paymentPoolValue.PaymentPoolValueDto; import com.java110.dto.wechat.OnlinePayDto; import com.java110.dto.wechat.SmallWeChatDto; import com.java110.intf.acct.IOnlinePayV1InnerServiceSMO; import com.java110.intf.acct.IPaymentPoolValueV1InnerServiceSMO; import com.java110.intf.store.ISmallWechatV1InnerServiceSMO; import com.java110.intf.user.IOwnerAppUserInnerServiceSMO; import com.java110.po.wechat.OnlinePayPo; @@ -69,18 +71,22 @@ @Autowired private IOnlinePayV1InnerServiceSMO onlinePayV1InnerServiceSMOImpl; @Autowired private IPaymentPoolValueV1InnerServiceSMO paymentPoolValueV1InnerServiceSMOImpl; @Autowired private RestTemplate outRestTemplate; @Override public Map java110Payment(PaymentOrderDto paymentOrderDto, JSONObject reqJson, ICmdDataFlowContext context) throws Exception { SmallWeChatDto smallWeChatDto = getSmallWechat(reqJson); String paymentPoolId = reqJson.getString("paymentPoolId"); String appId = context.getReqHeaders().get("app-id"); String userId = context.getReqHeaders().get("user-id"); String notifyUrl = UrlCache.getOwnerUrl() + "/app/payment/notify/nativeWechat/992020011134400001/" + smallWeChatDto.getObjId(); String notifyUrl = UrlCache.getOwnerUrl() + "/app/payment/notify/nativeWechat/992020011134400001/" + paymentPoolId; logger.debug("【小程序支付】 统一下单开始, 订单编号=" + paymentOrderDto.getOrderId()); SortedMap<String, String> resultMap = new TreeMap<String, String>(); @@ -94,6 +100,7 @@ TRADE_TYPE_NATIVE, payAmount, smallWeChatDto, paymentPoolId, notifyUrl ); @@ -113,9 +120,23 @@ private Map<String, String> java110UnifieldOrder(String feeName, String orderNum, String tradeType, double payAmount, SmallWeChatDto smallWeChatDto, String notifyUrl) throws Exception { SmallWeChatDto smallWeChatDto, String paymentPoolId, String notifyUrl) throws Exception { //String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME); PaymentPoolValueDto paymentPoolValueDto = new PaymentPoolValueDto(); paymentPoolValueDto.setPpId(paymentPoolId); List<PaymentPoolValueDto> paymentPoolValueDtos = paymentPoolValueV1InnerServiceSMOImpl.queryPaymentPoolValues(paymentPoolValueDto); if (paymentPoolValueDtos == null || paymentPoolValueDtos.isEmpty()) { throw new IllegalArgumentException("配置错误,未配置参数"); } String mchId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_MCHID"); String key = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_KEY"); if (feeName.length() > 127) { feeName = feeName.substring(0, 126); @@ -123,7 +144,7 @@ SortedMap<String, String> paramMap = new TreeMap<String, String>(); paramMap.put("appid", smallWeChatDto.getAppId()); paramMap.put("mch_id", smallWeChatDto.getMchId()); paramMap.put("mch_id", mchId); paramMap.put("nonce_str", PayUtil.makeUUID(32)); paramMap.put("body", feeName); paramMap.put("out_trade_no", orderNum); @@ -138,7 +159,7 @@ paramMap.put("sub_appid", smallWeChatDto.getAppId());//起调小程序appid paramMap.put("sub_mch_id", smallWeChatDto.getMchId());//起调小程序的商户号 } paramMap.put("sign", PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword())); paramMap.put("sign", PayUtil.createSign(paramMap, key)); //转换为xml String xmlData = PayUtil.mapToXml(paramMap); @@ -212,13 +233,27 @@ } paramMap.put(key, map.get(key).toString()); } //String appId = WechatFactory.getAppId(wId); JSONObject paramIn = new JSONObject(); paramIn.put("appId", appId); paramIn.put("communityId", notifyPaymentOrderDto.getCommunityId()); SmallWeChatDto smallWeChatDto = getSmallWechat(paramIn); String sign = PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword()); PaymentPoolValueDto paymentPoolValueDto = new PaymentPoolValueDto(); paymentPoolValueDto.setPpId(notifyPaymentOrderDto.getPaymentPoolId()); paymentPoolValueDto.setCommunityId(notifyPaymentOrderDto.getCommunityId()); List<PaymentPoolValueDto> paymentPoolValueDtos = paymentPoolValueV1InnerServiceSMOImpl.queryPaymentPoolValues(paymentPoolValueDto); if (paymentPoolValueDtos == null || paymentPoolValueDtos.isEmpty()) { throw new IllegalArgumentException("配置错误,未配置参数"); } // String mchId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_MCHID"); String key = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_KEY"); //String appId = WechatFactory.getAppId(wId); // JSONObject paramIn = new JSONObject(); // paramIn.put("appId", appId); // paramIn.put("communityId", notifyPaymentOrderDto.getCommunityId()); // SmallWeChatDto smallWeChatDto = getSmallWechat(paramIn); String sign = PayUtil.createSign(paramMap, key); if (!sign.equals(map.get("sign"))) { throw new IllegalArgumentException("鉴权失败"); @@ -246,8 +281,8 @@ smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId")); smallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret")); smallWeChatDto.setMchId(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "mchId")); smallWeChatDto.setPayPassword(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key")); // smallWeChatDto.setMchId(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "mchId")); // smallWeChatDto.setPayPassword(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key")); smallWeChatDto.setObjId(paramIn.getString("communityId")); return smallWeChatDto;