diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index 364e26c7c..81e5992dd 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -166,8 +166,13 @@ public class OrderService { * @return */ public String generateOrderV2(GenerateOrderDTO dto) throws ParseException { + String delayMode = null; + if (StringUtils.equals(dto.getRequestSource(), AdapayPayChannelEnum.WX_LITE.getValue())) { + delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getAppId()); + } else if (StringUtils.equals(dto.getRequestSource(), AdapayPayChannelEnum.ALIPAY_LITE.getValue())) { + delayMode = pileMerchantInfoService.getDelayModeByAlipayAppId(dto.getAppId()); + } // 新逻辑 - String delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getAppId()); AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(delayMode); OrderBasicInfo orderBasicInfo = orderLogic.generateOrder(dto); if (orderBasicInfo != null) { diff --git a/jsowell-admin/src/main/resources/application-dev.yml b/jsowell-admin/src/main/resources/application-dev.yml index c649f849e..e99765ead 100644 --- a/jsowell-admin/src/main/resources/application-dev.yml +++ b/jsowell-admin/src/main/resources/application-dev.yml @@ -171,12 +171,14 @@ adapay: rsaPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOl7qJyrkrks7FKnBPr/Sngub897Ni5Bkn5pEa81zfs+4LrYsuWZQ8G1n7Q8/rjH4G/T7vPX+So41vNU74Sqn6E1b3BpW+wWBULhs9p1JSPT7Kzima4FmPigUr80NLrlVKn5bW+V4/odpN+bJWvpxdd024edHAD8mXX1M1N1lU5ZAgMBAAECgYA+mxbiM6tbFe2kV/6g4vVv9luq0cn8az7BwKCqT44U8Y5G67ZElG0zsuTI6pYOrCHFOpnXLrE0HhudEchL1YiJqW/SDKaoC4oDZf5nybhh11kOR3N5maLqvUz/WxdNy17th/2XxqVfTTu752X9yeeoXDj89N5OxyMl0jmxlhWbgQJBAPeoitR7FCxcjKtcKsEyrtV3T0H2WtQ2Pbku7CGe6VCtL4+DJNeUentn7plBj4IhbH3EwNmyCYzNlfp0X2d8fWkCQQDxWONjt1vV/dyKQYRvSVw/SWQWlR7g2OnHZokU2SNeewiCX2umCdYKh0doN0JHbSTLOGG5IA3+6Vxam+9hzPtxAkEAjr+QHf8/Vn6V+mOqpSdgjNwzS/MC0ZTeKPI52vsswnrAkjjmMHh9zMnQRnf6juhTD38sJY6wYH9TdkRDhXPFGQJATiFYe4+AS2ZDXv6WwPAezN4VaLodpOyTwdmPxxAEQzHRL2N0levZPs9MbpB1BGpw3tkBycx2u28QVsTkWeTiAQJAGRsAVr6Rhhdaq2vTjt9orhMVwt6BCoSQ0zzHSYilv4PMOtSu1Pyt4K8BDv3gjEyAi1GtE7kkJ0dcbsvOGiLzqQ== appId: app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa wechatAppId: wxbb3e0d474569481d + alipayAppId: 2021004145642756 xixiao: apiKey: api_live_8690aad5-18df-4c94-ba8c-4f9499721c65 mockApiKey: api_test_a2944395-e6ba-4d59-969a-f629b7a9e53e rsaPrivateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ608yEkr5Fxj3ID9fIzavuwW/orgjlD1SIrmZVTwLFzM+ljnr/iFMRRhjJZZGImO+ySj296N+VPujHiiQZqymgIACdORs3YyRvxOeWQoPKiik21mOiF7RRw2GIOQEzqo0MKeJ/qdK89FvwnAIZKRXl+ccH/VTTr68VGWuiLWEK3AgMBAAECgYACsMCaZDvRtGIhJa4KsBJ1N9UnVYt8mwjG7oRJAsV2fKR5pWWwjQ2bEmK7Acbw3wMPDKD/28uMyKA4bkWyZScPO5T2Mhvo28AVOfdsbBht70iKzBAXuqHhHd99+AEmQL9ZcoCYCvoP2JqV8cHp5sXGEvncm9VRsjs3iSTsBYu0WQJBANB6x0DCPnAFXYnKvtBcBmF4jU8pO0iIGtx/ZR/N0pRTbL7cIvh+z6ZqtWo880Xbcli6i1qwZl1ctWwV0yKArOsCQQDC4dN6e8/Gj3FubXLmyLfIrbq7BuHW8kg19t0/wmAXunpkBtFhAA2FD7FYGg+/l6/f6YqWX8nSUr6pFZQI0Z5lAkARvBANIzj6gIpXeWbIBLwKOJ4UuNYxMlrOnQu2K+UY9wvOJJ3Y87ioWHV8RxkOvT856wyFt3HNyWAphKXETpvnAkEAnIjJ1ktW9FXJtfph3bABt0acg5eelYmcqQP2aT1W9BhMMMYtLi3drjCRsYOVfL55fXBYajrcoHzoOmZjtsWw5QJBAM/Wpk6L7BLVi357icleuivPtKsP04Ix5afUpgiFmssEheiLAxr+Zs5/nk/HM6V4Pk8kA0ILaNbRqjfAF5ZnAvk= appId: app_7848ccb2-f7e7-4841-a968-fbf02cc265ad wechatAppId: wx20abc5210391649c + alipayAppId: wx20abc5210391649c # 待修改为真正的支付宝小程序id #高德地图相关配置 diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/config/merchant/JsowellAdapayConfig.java b/jsowell-pile/src/main/java/com/jsowell/adapay/config/merchant/JsowellAdapayConfig.java index 6edd6b7f5..04dc2b707 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/config/merchant/JsowellAdapayConfig.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/config/merchant/JsowellAdapayConfig.java @@ -35,9 +35,14 @@ public class JsowellAdapayConfig extends AbstractAdapayConfig { @Value("${adapay.jsowell.wechatAppId}") private String wechatAppId; + @Value("${adapay.jsowell.alipayAppId}") + private String alipayAppId; + @Override public void afterPropertiesSet() throws Exception { // key为微信小程序id AdapayConfigFactory.register(wechatAppId, this); + // key为支付宝小程序id + AdapayConfigFactory.register(alipayAppId, this); } } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index a0b1989f6..758adc1c1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -84,9 +84,9 @@ public class AdapayService { private MemberBasicInfoService memberBasicInfoService; /** - * 获取支付参数 + * 获取支付参数-微信支付 */ - public Map createPayment(PayOrderDTO dto) { + public Map createPaymentForWechat(PayOrderDTO dto) { // log.info("===============使用汇付支付-获取支付参数"); // 相同参数重复请求,返回同一个支付对象 String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode(); @@ -173,6 +173,97 @@ public class AdapayService { return resultMap; } + /** + * 获取支付参数-支付宝支付 + */ + public Map createPaymentForAlipay(PayOrderDTO dto) { + // log.info("===============使用汇付支付-获取支付参数"); + // 相同参数重复请求,返回同一个支付对象 + String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode(); + Map resultMap = redisCache.getCacheObject(redisKey); + if (resultMap != null) { + // 表示已经获取到支付参数了,后续再有支付请求就拒绝 + return resultMap; + } + + // 获取支付配置 + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(dto.getAlipayAppId()); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + + // 获取openId + MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(dto.getMemberId()); + if (memberBasicInfo == null) { + throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); + } + String openId = memberBasicInfo.getOpenId(); + + // 支付场景 + String type = dto.getType(); + + // 封装对象 + String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额 + String delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getWechatAppId()); + String payMode = MerchantDelayModeEnum.getAdapayPayMode(delayMode); + CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); + // 请求订单号, 防止请求订单号重复,结尾拼接时间 + String orderNo = dto.getOrderCode() + "_" + DateUtils.dateTimeNow(); + createAdaPaymentParam.setOrder_no(orderNo); + createAdaPaymentParam.setPay_amt(amount); + createAdaPaymentParam.setApp_id(config.getAdapayAppId()); + + // 2024年6月13日11点55分,需要兼容支付宝小程序,首先判断请求来源,如为空默认微信小程序 + String payChannel = StringUtils.isNotBlank(dto.getRequestSource()) + ? dto.getRequestSource() + : AdapayPayChannelEnum.WX_LITE.getValue(); + createAdaPaymentParam.setPay_channel(payChannel); + createAdaPaymentParam.setGoods_title(dto.getGoodsTitle()); + createAdaPaymentParam.setGoods_desc(dto.getGoodsDesc()); // 这个字段是微信支付凭证的商品名 + Map map = Maps.newHashMap(); + map.put("type", type); + map.put("orderCode", dto.getOrderCode()); + map.put("payMode", payMode); + map.put("memberId", dto.getMemberId()); + createAdaPaymentParam.setDescription(JSON.toJSONString(map)); + // 异步通知地址,url为http/https路径,服务器POST回调,URL 上请勿附带参数 + createAdaPaymentParam.setNotify_url(ADAPAY_CALLBACK_URL); + + // alipay_lite参数 buyer_id String(100) Y 买家的支付宝用户 id + createAdaPaymentParam.setExpend(JSON.toJSONString(ImmutableMap.of("buyer_id", openId))); + + // 延时分账 + if (StringUtils.isNotBlank(payMode)) { + createAdaPaymentParam.setPay_mode(payMode); + } + try { + Map response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId()); + log.info("创建汇付支付参数:{}, response:{}", JSON.toJSONString(createAdaPaymentParam), JSON.toJSONString(response)); + if (response != null && !response.isEmpty()) { + String status = (String) response.get("status"); + if (!StringUtils.equals(status, AdapayStatusEnum.SUCCEEDED.getValue())) { + String error_msg = (String) response.get("error_msg"); + throw new BusinessException(ReturnCodeEnum.CODE_GET_WECHAT_PAY_PARAMETER_ERROR.getValue(), error_msg); + } + JSONObject expend = JSONObject.parseObject(response.get("expend").toString()); + JSONObject pay_info = expend.getJSONObject("pay_info"); + resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + } + } catch (BaseAdaPayException e) { + log.error("汇付-获取支付对象发生异常, orderCode:{}", dto.getOrderCode(), e); + } + + // 放缓存 + if (resultMap != null) { + // 请求参数放入缓存,15分钟以内返回同一个支付参数 + redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES); + + // 请求订单号放redis + redisCache.setCacheObject(CacheConstants.ORDER_WECHAT_PAY_PARAMETERS + dto.getOrderCode(), orderNo, CacheConstants.cache_expire_time_10d); + } + return resultMap; + } + /** * 创建结算账户 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java index b5e4fc2ba..570311918 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java @@ -66,6 +66,11 @@ public class PayOrderDTO extends BaseDTO{ */ private String wechatAppId; + /** + * 支付宝小程序appId + */ + private String alipayAppId; + /** * 商品标题 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileMerchantInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileMerchantInfoService.java index f4c0a1f6b..0a2b0797c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileMerchantInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileMerchantInfoService.java @@ -140,6 +140,8 @@ public interface PileMerchantInfoService { */ String getDelayModeByWechatAppId(String wechatAppId); + String getDelayModeByAlipayAppId(String alipayAppId); + /** * 通过运营商id查询一级运营商配置的delayMode * @param merchantId 运营商id diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java index 56a59a852..81da9d760 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java @@ -578,7 +578,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService { dto.setGoodsTitle("占桩费用"); dto.setGoodsDesc("占桩订单金额"); dto.setType(ScenarioEnum.OCCUPY.getValue()); - Map weixinMap = adapayService.createPayment(dto); + Map weixinMap = adapayService.createPaymentForWechat(dto); resultMap.put("weixinMap", weixinMap); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 whiteListPayOccupyPileOrder(dto); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java index 4bde424f6..218639b33 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java @@ -514,6 +514,20 @@ public class PileMerchantInfoServiceImpl implements PileMerchantInfoService { return merchant.getDelayMode(); } + /** + * 通过wechatAppId查询一级运营商的延时支付模式配置 + * @param alipayAppId 微信小程序id + * @return 延时分账模式(0-不延时;1-延时分账) + */ + @Override + public String getDelayModeByAlipayAppId(String alipayAppId) { + PileMerchantInfo merchant = getFirstLevelMerchantByAlipayAppId(alipayAppId); + if (merchant == null) { + throw new BusinessException(ReturnCodeEnum.CODE_GET_FIRST_LEVEL_MERCHANT_BY_APP_ID); + } + return merchant.getDelayMode(); + } + /** * 通过运营商id查询一级运营商配置的delayMode * @param merchantId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 7323e10cb..4b4d8ba3b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -102,10 +102,25 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { dto.setGoodsTitle(goodsTitle); dto.setGoodsDesc(goodsDesc); dto.setType(ScenarioEnum.ORDER.getValue()); - Map weixinMap = onlinePaymentOrder(dto); + Map weixinMap = onlinePaymentOrderForWechat(dto); // 返回微信支付参数 resultMap.put("weixinMap", weixinMap); + } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { + // 2023-07-11 全部改为汇付支付 + String goodsTitle = "充电费用"; + String goodsDesc = "充电桩预付款金额"; + if (StringUtils.equals(orderInfo.getPayStatus(), OrderPayStatusEnum.repay.getValue())) { + goodsTitle = "补缴费用"; + goodsDesc = dto.getOrderCode() + "订单补缴金额"; + } + dto.setGoodsTitle(goodsTitle); + dto.setGoodsDesc(goodsDesc); + dto.setType(ScenarioEnum.ORDER.getValue()); + Map weixinMap = onlinePaymentOrderForWechat(dto); + + // 返回微信支付参数 + resultMap.put("alipayMap", weixinMap); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 // 白名单支付可以直接调支付回调方法 dto.setPayAmount(Constants.WHITELIST_DEFAULT_AMOUNT); @@ -319,12 +334,18 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { /** * 在线支付订单 */ - public Map onlinePaymentOrder(PayOrderDTO dto) { + public Map onlinePaymentOrderForWechat(PayOrderDTO dto) { logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto)); - Map weixinMap = adapayService.createPayment(dto); + Map weixinMap = adapayService.createPaymentForWechat(dto); return weixinMap; } + public Map onlinePaymentOrderForAlipay(PayOrderDTO dto) { + logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto)); + Map alipayMap = adapayService.createPaymentForAlipay(dto); + return alipayMap; + } + /** * 白名单支付订单 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 28c440855..1dc6de076 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -212,7 +212,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { */ public Map onlinePaymentOrder(PayOrderDTO dto) { logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto)); - Map weixinMap = adapayService.createPayment(dto); + Map weixinMap = adapayService.createPaymentForWechat(dto); return weixinMap; }