diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformPayType.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformPayType.java new file mode 100644 index 000000000..f2c3cc54e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformPayType.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.thirdparty.constant.miniplatform; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * app支付类型 + */ +@AllArgsConstructor +@Getter +public enum AppPlusPlatformPayType { + + WECHAT("10", "微信支付"), + ALI_PAY("20", "支付宝支付"), + ; + + private final String type; + private final String description; + + public static AppPlusPlatformPayType valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/ThirdMiniAppPayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/ThirdMiniAppPayDto.java index 8e25d1a96..ac1684daf 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/ThirdMiniAppPayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/ThirdMiniAppPayDto.java @@ -21,7 +21,6 @@ public class ThirdMiniAppPayDto { @NotEmpty(message = "充值业务id不能为空") private String bizId; - /** * 小程序平台 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java index 03f5420f1..21cd73488 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java @@ -9,6 +9,11 @@ import lombok.Data; @Data public class ThirdAppPlusPayDto { + /** + * 子商户id + */ + private String subMchid; + /** * 充值业务类型 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java index bb26a2912..302750e96 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java @@ -24,12 +24,22 @@ public class AppPlusPayConfig { /** * 微信公共平台 appId */ - private String appId; + private String gzhAppId; /** * 微信公共平台 appSecret */ - private String appSecret; + private String gzhAppSecret; + + /** + * 微信开放平台 appId + */ + private String appPlatformAppId; + + /** + * 微信开放平台 appSecret + */ + private String appPlatformAppSecret; /** * 商户号 @@ -37,14 +47,19 @@ public class AppPlusPayConfig { private String merchantId; /** - * 商户证书序列path + * 商户私钥 */ - private String merchantSerialPath; + private String mchPrivatePath; /** - * 商户APIV2密钥 + * 商户APIV3密钥 */ - private String apiV2Key; + private String apiV3Key; + + /** + * 商户序列号 + */ + private String merchantSerialNumber; /** * 支付成功的回调 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java index 20c3b7520..32a1d5101 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java @@ -5,6 +5,13 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.core.RSAPublicKeyConfig; +import com.wechat.pay.java.service.partnerpayments.app.AppService; +import com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension; +import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension; +import com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -27,8 +34,8 @@ public class WechatConfiguration { AppPlusPayConfig.WechatConfig wechatConfig = properties.getWechatConfig(); WxMaDefaultConfigImpl wxMaDefaultConfig = new WxMaDefaultConfigImpl(); - wxMaDefaultConfig.setAppid(wechatConfig.getAppId()); - wxMaDefaultConfig.setSecret(wechatConfig.getAppSecret()); + wxMaDefaultConfig.setAppid(wechatConfig.getGzhAppId()); + wxMaDefaultConfig.setSecret(wechatConfig.getGzhAppSecret()); wxMaDefaultConfig.setMsgDataFormat("JSON"); WxMaService maService = new WxMaServiceImpl(); @@ -36,4 +43,16 @@ public class WechatConfiguration { return maService; } + @Bean + public AppServiceExtension appServiceExtension() { + AppPlusPayConfig.WechatConfig wechatConfig = properties.getWechatConfig(); + Config config = new RSAAutoCertificateConfig.Builder() + .merchantId(wechatConfig.getMerchantId()) + .privateKeyFromPath(wechatConfig.getMchPrivatePath()) + .merchantSerialNumber(wechatConfig.getMerchantSerialNumber()) + .apiV3Key(wechatConfig.getApiV3Key()) + .build(); + return new AppServiceExtension.Builder().config(config).build(); + } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java index 1fcfe15f4..efa867da3 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java @@ -12,9 +12,9 @@ import java.util.Map; public interface ThirdAppPlusWechatService { /** - * JSAPI/小程序下单 + * APP支付 */ - ThirdMiniJsapiPayVo jsapiPay(ThirdAppPlusPayDto dto); + ThirdMiniJsapiPayVo appPay(ThirdAppPlusPayDto dto); /** * 获取openId diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java index b47716572..bcfb9246a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java @@ -14,8 +14,10 @@ import com.bsd.pjcloud.app.api.constant.AppUserTypeEnum; import com.bsd.pjcloud.app.api.dto.AppAdminSyncDto; import com.bsd.pjcloud.app.api.dto.AppUserInfo; import com.bsd.pjcloud.app.api.feign.RemoteAppUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformLoginErrorEnum; +import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformPayType; import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformTypeEnum; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderBizTypeEnum; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderStatusEnum; @@ -32,8 +34,12 @@ import com.bsd.pjcloud.thirdparty.vo.appplus.pay.alipay.ThirdALiPayCallbackVo; import com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat.*; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargePackageService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -42,6 +48,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -65,6 +72,7 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { private final RemoteTokenService remoteTokenService; private final RemoteAppUserService remoteAppUserService; private final RemoteWalletRechargePackageService remoteWalletRechargePackageService; + private final RemoteMchService remoteMchService; /** * 小程序登录 @@ -143,7 +151,23 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { public ThirdMiniAppPayVo miniPay(Long userId, ThirdMiniAppPayDto dto) { ThirdMiniAppPayVo result = new ThirdMiniAppPayVo(); + // 查询用户属于的商户 + UserInfo userInfo = remoteUserService.getByUserId(userId).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new RuntimeException("用户不存在"); + } + MchManageVo mchManage = remoteMchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId(), MerchantTypeEnum.OTHER_CANTEEN).getData(); + if (ObjectUtil.isEmpty(mchManage)) { + throw new RuntimeException("用户不属于任何食堂"); + } + if (ObjectUtil.isEmpty(mchManage.getPaySettingList())) { + throw new RuntimeException("商户未配置支付参数"); + } + + List paySettingList = mchManage.getPaySettingList(); + if (ObjectUtil.equals(dto.getBizType(), ThirdPayOrderBizTypeEnum.MINI_APP_WALLET_RECHARGE)) { + Long bizId = null; try { bizId = Long.valueOf(dto.getBizId()); @@ -177,7 +201,14 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { appPlusPayDto.setAmount(dto.getAmount()); // 微信小程序 if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), AppPlusPlatformTypeEnum.WECHAT.getType())) { - ThirdMiniJsapiPayVo thirdMiniJsapiPayVo = thirdMiniAppWechatService.jsapiPay(appPlusPayDto); + MchPaySettingVo paySetting = paySettingList.stream().filter(item -> ObjectUtil.equals(item.getPlatformType(), AppPlusPlatformPayType.WECHAT.getType())).findFirst().orElse(null); + if (ObjectUtil.isEmpty(paySetting) || ObjectUtil.isEmpty(paySetting.getSettingJson())) { + throw new RuntimeException("商户未配置微信支付参数"); + } + MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(paySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class); + appPlusPayDto.setSubMchid(wechatPaySetting.getSubMchid()); + + ThirdMiniJsapiPayVo thirdMiniJsapiPayVo = thirdMiniAppWechatService.appPay(appPlusPayDto); if (ObjectUtil.isEmpty(thirdMiniJsapiPayVo)) { throw new RuntimeException("创建微信支付错误"); } @@ -185,6 +216,11 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService { } // 支付宝 else if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), AppPlusPlatformTypeEnum.ALI_PAY.getType())) { + MchPaySettingVo paySetting = paySettingList.stream().filter(item -> ObjectUtil.equals(item.getPlatformType(), AppPlusPlatformPayType.ALI_PAY.getType())).findFirst().orElse(null); + if (ObjectUtil.isEmpty(paySetting)) { + throw new RuntimeException("商户未配置微信支付参数"); + } + String orderStr = thirdMiniAppAliPayService.appPay(appPlusPayDto); if (ObjectUtil.isEmpty(orderStr)) { throw new RuntimeException("创建支付宝支付错误"); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java index 375c1000b..978f773e4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java @@ -17,6 +17,11 @@ import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusWechatService; import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; import com.bsd.pjcloud.thirdparty.utils.pay.wechat.ThirdAppPlusWechantPayConstant; import com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat.*; +import com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension; +import com.wechat.pay.java.service.partnerpayments.app.model.Amount; +import com.wechat.pay.java.service.partnerpayments.app.model.PrepayRequest; +import com.wechat.pay.java.service.partnerpayments.app.model.PrepayWithRequestPaymentResponse; +import com.wechat.pay.java.service.partnerpayments.app.model.SettleInfo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; @@ -27,6 +32,8 @@ import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import javax.net.ssl.*; import java.io.FileInputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.security.KeyStore; import java.security.SecureRandom; @@ -51,12 +58,14 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService private final WxMaService wxMaService; private final ThirdPayOrderService thirdPayOrderService; + private final AppServiceExtension appServiceExtension; + /** - * JSAPI/小程序下单 + * APP支付 */ @Override - public ThirdMiniJsapiPayVo jsapiPay(ThirdAppPlusPayDto dto) { + public ThirdMiniJsapiPayVo appPay(ThirdAppPlusPayDto dto) { AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); ThirdPayOrderEntity payOrder = new ThirdPayOrderEntity(); @@ -69,76 +78,32 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService payOrder.setStatus(ThirdPayOrderStatusEnum.PAY_UNPAID.getType()); payOrder.setPayNo(dto.getOutTradeNo()); try { - Map params = new HashMap<>(); - // 公众账号ID - params.put("appid", wechatConfig.getAppId()); - // 商户号 - params.put("mch_id", wechatConfig.getMerchantId()); - // 设备号 - params.put("device_info", "WEB"); - // 随机字符串 - params.put("nonce_str", getNonceStr()); - // 签名 - params.put("sign", ""); - // 签名类型 - params.put("sign_type", "MD5"); - // 商品描述 - params.put("body", "浦江数勤-钱包充值"); - // 商户订单号 - params.put("out_trade_no", dto.getOutTradeNo()); - // 商户回调地址 - params.put("notify_url", wechatConfig.getPayCallbackUrl()); - // 订单总金额,单位为分 - params.put("total_fee", dto.getAmount()); - // 终端IP - params.put("spbill_create_ip", wechatConfig.getSpbillCreateIp()); - // 交易类型 - params.put("trade_type", "APP"); - // 用户标识 - params.put("openid", dto.getOpenid()); - // 生成签名 - params.put("sign", generateSign(params)); - ThirdAppPlusWechantPayConstant.Api api = initApi(ThirdAppPlusWechantPayConstant.WECHAT_PAY); - - String xmlStr = XmlUtil.mapToXmlStr(params); - payOrder.setPayRep(JSONUtil.toJsonStr(params)); - - String res = api.getHttpRequest().body(xmlStr).execute().body(); - log.debug("JSAPI/小程序下单,json,xml|{}", res); + String description = "饭卡钱包充值" + fenToYuan(BigDecimal.valueOf(dto.getAmount())) + "元"; + // 支付金额 + Amount amount = new Amount(); + amount.setTotal(dto.getAmount()); + amount.setCurrency("CNY"); + // 分账 + SettleInfo settleInfo = new SettleInfo(); + settleInfo.setProfitSharing(true); + PrepayRequest request = new PrepayRequest(); + request.setAmount(amount); + request.setSpAppid(wechatConfig.getAppPlatformAppId()); + request.setSpMchid(wechatConfig.getMerchantId()); + request.setSubMchid(dto.getSubMchid()); + request.setDescription(description); + request.setSettleInfo(settleInfo); + request.setOutTradeNo(dto.getOutTradeNo()); + request.setNotifyUrl(wechatConfig.getPayCallbackUrl()); + PrepayWithRequestPaymentResponse res = appServiceExtension.prepayWithRequestPayment(request, wechatConfig.getAppPlatformAppId()); + log.debug("APP支付,json,xml|{}", res); if (ObjectUtil.isEmpty(res)) { - log.error("JSAPI/小程序下单,res为空"); - return null; - } - String jsonVo = JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)); - ThirdMiniJsapiPayVo vo = JSONUtil.toBean(jsonVo, ThirdMiniJsapiPayVo.class); - log.debug("|{}|JSAPI/小程序下单,json,res|{}", TAG, JSONUtil.toJsonStr(vo)); - if (!vo.isHttpSucess()) { + log.error("APP支付,res为空"); return null; } payOrder.setPayTime(LocalDateTime.now()); - payOrder.setPayRes(jsonVo); - // 生成小程序 paySign - String nonceStr = RandomUtil.randomString(32); - long timeStamp = System.currentTimeMillis() / 1000; - String payPackage = "prepay_id=" + vo.getPrepay_id(); - String signType = "MD5"; - - String payStr = "appId=" + wechatConfig.getAppId() + "&"; - payStr += "nonceStr=" + nonceStr + "&"; - payStr += "package=" + payPackage + "&"; - payStr += "signType=" + signType + "&"; - payStr += "timeStamp=" + timeStamp + "&"; - payStr += "key=" + wechatConfig.getApiV2Key(); - String paySign = DigestUtils.md5Hex(payStr); - - HashMap miniAppPayParams = new HashMap<>(); - miniAppPayParams.put("timeStamp", timeStamp); - miniAppPayParams.put("nonceStr", nonceStr); - miniAppPayParams.put("package", payPackage); - miniAppPayParams.put("signType", signType); - miniAppPayParams.put("paySign", paySign); - vo.setMiniAppPayParams(miniAppPayParams); - return vo; + payOrder.setPayRes(JSONUtil.toJsonStr(res)); + return null; } catch (Exception e) { log.error("|{}|JSAPI/小程序下单,异常", TAG, e); return null; @@ -188,42 +153,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService */ @Override public ThirdMiniWechatQueryVo query(ThirdMiniWechatQueryDto dto) { - AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); - try { - Map params = new HashMap<>(); - // 公众账号ID - params.put("appid", wechatConfig.getAppId()); - // 商户号 - params.put("mch_id", wechatConfig.getMerchantId()); - // 微信订单号 - params.put("transaction_id", dto.getWechantOrderId()); - // 商户订单号 - params.put("out_trade_no", dto.getOrderId()); - // 随机字符串 - params.put("nonce_str", getNonceStr()); - // 签名 - params.put("sign", ""); - // 签名类型 - params.put("sign_type", "MD5"); - // 生成签名 - params.put("sign", generateSign(params)); - ThirdAppPlusWechantPayConstant.Api api = initApi(ThirdAppPlusWechantPayConstant.QUERY); - String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); - log.debug("查询订单,json,xml|{}", res); - if (ObjectUtil.isEmpty(res)) { - log.error("查询订单,res为空"); - return null; - } - ThirdMiniWechatQueryVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), ThirdMiniWechatQueryVo.class); - log.debug("|{}|查询订单,json,res|{}", TAG, JSONUtil.toJsonStr(vo)); - if (!vo.isHttpSucess()) { - return null; - } - return vo; - } catch (Exception e) { - log.error("|{}|查询订单,异常", TAG, e); - return null; - } + return null; } /** @@ -232,42 +162,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService @Override public ThirdMiniWechantReverseVo reverse(ThirdMiniWechantReverseDto dto) { AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); - try { - Map params = new HashMap<>(); - // 公众账号ID - params.put("appid", wechatConfig.getAppId()); - // 商户号 - params.put("mch_id", wechatConfig.getMerchantId()); - // 微信订单号 - params.put("transaction_id", dto.getWechantOrderId()); - // 商户订单号 - params.put("out_trade_no", dto.getOrderId()); - // 随机字符串 - params.put("nonce_str", getNonceStr()); - // 签名 - params.put("sign", ""); - // 签名类型 - params.put("sign_type", "MD5"); - // 生成签名 - params.put("sign", generateSign(params)); - ThirdAppPlusWechantPayConstant.Api api = initApi(ThirdAppPlusWechantPayConstant.REVERSE); - api.setSslSocketFactory(createSSLSocketFactory()); - String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); - log.debug("|{}|撤销订单,json,xml|{}", TAG, res); - if (ObjectUtil.isEmpty(res)) { - log.error("|{}|撤销订单,res为空", TAG); - return null; - } - ThirdMiniWechantReverseVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), ThirdMiniWechantReverseVo.class); - log.debug("|{}|撤销订单,json,res|{}", TAG, JSONUtil.toJsonStr(vo)); - if (!vo.isHttpSucess()) { - return null; - } - return vo; - } catch (Exception e) { - log.error("|{}|撤销订单,异常", TAG, e); - return null; - } + return null; } private String getTransactionIdByThirdPayOrder(ThirdPayOrderEntity thirdPayOrder) { @@ -294,61 +189,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService refundFee = thirdPayOrder.getPrice(); } String refundNo = "refund_" + thirdPayOrder.getPayNo(); - try { - Map params = new HashMap<>(); - // 公众账号ID - params.put("appid", wechatConfig.getAppId()); - // 商户号 - params.put("mch_id", wechatConfig.getMerchantId()); - // 随机字符串 - params.put("nonce_str", getNonceStr()); - // 签名 - params.put("sign", ""); - // 签名类型 - params.put("sign_type", "MD5"); - // 微信支付订单号 - params.put("transaction_id", getTransactionIdByThirdPayOrder(thirdPayOrder)); - // 商户订单号 - params.put("out_trade_no", thirdPayOrder.getPayNo()); - // 商户退款单号 - params.put("out_refund_no", refundNo); - // 订单金额 - params.put("total_fee", thirdPayOrder.getPrice()); - // 退款金额 - params.put("refund_fee", refundFee); - // 退款结果通知url - params.put("notify_url", wechatConfig.getRefundCallbackUrl()); - // 生成签名 - params.put("sign", generateSign(params)); - ThirdAppPlusWechantPayConstant.Api api = initApi(ThirdAppPlusWechantPayConstant.REFUND); - api.setSslSocketFactory(createSSLSocketFactory()); - - updateObj.setRefundRep(JSONUtil.toJsonStr(params)); - String xmlStr = XmlUtil.mapToXmlStr(params); - - String res = api.getHttpRequest().body(xmlStr).execute().body(); - log.debug("|{}|申请退款,json,xml|{}", TAG, res); - if (ObjectUtil.isEmpty(res)) { - log.error("|{}|申请退款,res为空", TAG); - return null; - } - String jsonVo = JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)); - updateObj.setRefundRes(jsonVo); - ThirdMiniWechatRefundVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), ThirdMiniWechatRefundVo.class); - log.debug("|{}|申请退款,json,res|{}", TAG, JSONUtil.toJsonStr(vo)); - if (!vo.isHttpSucess()) { - return null; - } - updateObj.setRefundNo(refundNo); - updateObj.setRefundTime(LocalDateTime.now()); - updateObj.setStatus(ThirdPayOrderStatusEnum.REFUNDING.getType()); - return vo; - } catch (Exception e) { - log.error("|{}|申请退款,异常", TAG, e); - return null; - } finally { - thirdPayOrderService.updateById(updateObj); - } + return null; } /** @@ -357,39 +198,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService @Override public ThirdMiniWechatRefundQueryVo refundQuery(ThirdMiniWechatRefundQueryDto dto) { AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig(); - try { - Map params = new HashMap<>(); - // 公众账号ID - params.put("appid", wechatConfig.getAppId()); - // 商户号 - params.put("mch_id", wechatConfig.getMerchantId()); - // 随机字符串 - params.put("nonce_str", getNonceStr()); - // 签名 - params.put("sign", ""); - // 签名类型 - params.put("sign_type", "MD5"); - // 签名类型 - params.put("out_refund_no", dto.getRefundId()); - // 生成签名 - params.put("sign", generateSign(params)); - ThirdAppPlusWechantPayConstant.Api api = initApi(ThirdAppPlusWechantPayConstant.REFUND_QUERY); - String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); - log.debug("|{}|查询退款,json,xml|{}", TAG, res); - if (ObjectUtil.isEmpty(res)) { - log.error("|{}|查询退款,res为空", TAG); - return null; - } - ThirdMiniWechatRefundQueryVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), ThirdMiniWechatRefundQueryVo.class); - log.debug("|{}|查询退款,json,res|{}", TAG, JSONUtil.toJsonStr(vo)); - if (!vo.isHttpSucess()) { - return null; - } - return vo; - } catch (Exception e) { - log.error("|{}|查询退款,异常", TAG, e); - return null; - } + return null; } /** @@ -464,7 +273,7 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService // 1 对加密串A做base64解码,得到加密串B byte[] encryptedBytes = Base64.decode(reqInfo); // 2 对商户key做md5,得到32位小写key - String md5Key = DigestUtils.md5Hex(wechatConfig.getApiV2Key()).toLowerCase(); + String md5Key = DigestUtils.md5Hex(wechatConfig.getApiV3Key()).toLowerCase(); // 3. AES-256-ECB 解密 SecretKeySpec secretKey = new SecretKeySpec(md5Key.getBytes(StandardCharsets.UTF_8), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); @@ -481,32 +290,6 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService } } - /** - * 生成微信支付签名 - */ - public String generateSign(Map params) { - String apiKey = appPlusPayConfig.getWechatConfig().getApiV2Key(); - Map filtered = new TreeMap<>(); - for (Map.Entry entry : params.entrySet()) { - if (ObjectUtil.isEmpty(entry.getValue()) || ObjectUtil.equals("sign", entry.getKey())) { - continue; - } - filtered.put(entry.getKey(), String.valueOf(entry.getValue())); - } - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : filtered.entrySet()) { - sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); - } - sb.append("key=").append(apiKey); - try { - String sign = DigestUtils.md5Hex(String.valueOf(sb)); - return sign.toUpperCase(); - } catch (Exception e) { - log.error("|{}|微信支付签名生成失败", TAG, e); - } - return ""; - } - private ThirdAppPlusWechantPayConstant.Api initApi(ThirdAppPlusWechantPayConstant.Api api) { api.setBaseUrl(appPlusPayConfig.getWechatConfig().getBaseUrl()); return api; @@ -517,32 +300,13 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService return RandomUtil.randomString(length); } - private SSLSocketFactory createSSLSocketFactory() throws Exception { - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - FileInputStream certStream = new FileInputStream(appPlusPayConfig.getWechatConfig().getMerchantSerialPath()); - keyStore.load(certStream, appPlusPayConfig.getWechatConfig().getMerchantId().toCharArray()); - certStream.close(); - // 创建KeyManagerFactory - KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyManagerFactory.init(keyStore, appPlusPayConfig.getWechatConfig().getMerchantId().toCharArray()); - // 创建TrustManagerFactory(信任所有证书) - TrustManager[] trustManagers = new TrustManager[]{ - new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { - } - - public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { - } - } - }; - // 创建SSLContext - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagerFactory.getKeyManagers(), trustManagers, new SecureRandom()); - return sslContext.getSocketFactory(); + public String fenToYuan(BigDecimal fen) { + if (ObjectUtil.isEmpty(fen)) { + return "0"; + } + return fen.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString(); } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index b0899050f..d2b07d23b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -109,11 +109,17 @@ ad: app-plus: pay: wechat-config: - app-id: wx9f2c53067b4520a4 - app-secret: a6b0d036b229117595687a7c1705d332 - merchant-id: 1744678188 - api-v2-key: xJNdavRG55ynCEAp6J5uGzxPWSFSGUWE - merchant-serial-path: /Users/dengzhangchen/Desktop/backups/pay/zax_wx_v2/apiclient_cert.p12 + + gzh-app-id: wx9f2c53067b4520a4 + gzh-app-secret: a6b0d036b229117595687a7c1705d332 + + app-platform-app-id: wx9f2c53067b4520a4 + app-platform-app-secret: 917d6656285df1d1fecc9626ecaf3aab + + merchant-id: 1723708975 + api-v3-key: f0f5fd485bac7f377af6f5ca97636dd4 + merchant-serial-number: 1A4A19DC15F4742D9DC1A2CF1DE05F15FFCAE315 + mch-private-path: /Users/dengzhangchen/Desktop/backups/pay/zax_wx_pt_v3/apiclient_key.pem pay-callback-url: https://dzc-test-1.fy.takin.cc/third/third-app-pay/app/pay-callback refund-callback-url: https://dzc-test-1.fy.takin.cc/third/third-app-pay/app/refund-callback spbill-create-ip: 59.202.170.152 diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchPaySettingDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchPaySettingDto.java new file mode 100644 index 000000000..337fd7ebf --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchPaySettingDto.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.dto.mch; + +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import lombok.Data; + +@Data +public class MchPaySettingDto extends MchPaySettingEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java new file mode 100755 index 000000000..57135bc4a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java @@ -0,0 +1,117 @@ +package com.bsd.pjcloud.wallet.api.entity.mch; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 商户管理 + */ +@Data +@TenantTable +@TableName("mch_pay_setting") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "商户管理") +public class MchPaySettingEntity extends Model { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 商户id + */ + @Schema(description = "商户id") + private Long mchId; + + /** + * 平台类型 + */ + @Schema(description = "平台类型") + private String platformType; + + /** + * 是否启用 + */ + @Schema(description = "是否启用") + private String enable; + + /** + * 使用范围(直接支付,钱包充值) + */ + @Schema(description = "使用范围(直接支付,钱包充值)") + private String useScope; + + /** + * 支付json配置 + */ + @Schema(description = "支付json配置") + private String settingJson; + + /** + * 分账比例(最高100%即分给对方商户的%) + */ + @Schema(description = "分账比例(最高100%即分给对方商户的%)") + private Integer fzRatio; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; + + @Data + static public class WechatPaySetting { + + /** + * 子商户号 + */ + private String subMchid; + + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java index 96f1e0fd1..f25c9ba43 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.wallet.api.vo; import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.vo.base.BaseWalletTypeInterface; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; import lombok.Data; import java.util.List; @@ -32,4 +33,9 @@ public class MchManageVo extends MchManageEntity implements BaseDeptInterface, B */ private String catgoryName; + /** + * 商户支付配置 + */ + private List paySettingList; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchPaySettingVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchPaySettingVo.java new file mode 100644 index 000000000..5a5e95e0b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchPaySettingVo.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.api.vo.mch; + +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import lombok.Data; + +@Data +public class MchPaySettingVo extends MchPaySettingEntity { + + private String mchName; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchPaySettingController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchPaySettingController.java new file mode 100755 index 000000000..fb8c8db09 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchPaySettingController.java @@ -0,0 +1,108 @@ +package com.bsd.pjcloud.wallet.controller.mch; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; +import com.bsd.pjcloud.wallet.service.MchPaySettingService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 商户管理 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/mch-pay-setting") +@Tag(description = "/mch-pay-setting", name = "商户支付管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class MchPaySettingController { + + private final MchPaySettingService mchPaySettingService; + + + /* ************************************* start app start ************************************* */ + + /** + * 用户可以支付的方式(目前微信、支付宝) + */ + @Operation(summary = "用户可以支付的方式(目前微信、支付宝)", description = "用户可以支付的方式(目前微信、支付宝)") + @GetMapping("/app/pay-type-list") + public R> getUserPaySettingList() { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(mchPaySettingService.getUserPaySettingList(user)); + } + + /* ************************************* end app end ************************************* */ + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_mchPaySetting_view')") + public R> getMchPaySettingPage(@ParameterObject Page page, @ParameterObject MchPaySettingDto dto) { + return R.ok(mchPaySettingService.scopePageList(page, dto, DataScope.of())); + } + + /** + * 通过id查询商户支付管理 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_mchPaySetting_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(mchPaySettingService.getById(id)); + } + + /** + * 新增查询商户支付管理 + */ + @Operation(summary = "新增查询商户支付管理", description = "新增查询商户支付管理") + @SysLog("新增查询商户支付管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_mchPaySetting_add')") + public R save(@RequestBody MchPaySettingDto dto) { + return R.ok(mchPaySettingService.create(dto)); + } + + /** + * 修改商户支付管理 + */ + @Operation(summary = "修改商户支付管理", description = "修改商户支付管理") + @SysLog("修改商户支付管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_mchPaySetting_edit')") + public R updateById(@RequestBody MchPaySettingDto dto) { + return R.ok(mchPaySettingService.edit(dto)); + } + + /** + * 通过id删除商户支付管理 + */ + @Operation(summary = "通过id删除商户支付管理", description = "通过id删除商户支付管理") + @SysLog("通过id删除商户支付管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_mchPaySetting_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(mchPaySettingService.removeBatchByIds(CollUtil.toList(ids))); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchPaySettingMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchPaySettingMapper.java new file mode 100755 index 000000000..0c77580e2 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchPaySettingMapper.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.wallet.mapper.mch; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface MchPaySettingMapper extends PjcloudBaseMapper { + + Page scopePageList(Page page, @Param("dto") MchPaySettingDto dto, DataScope dataScope); + + List pageList(@Param("dto") MchPaySettingDto dto, DataScope dataScope); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchPaySettingService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchPaySettingService.java new file mode 100755 index 000000000..eb3053e4e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchPaySettingService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; + +import java.util.List; + +public interface MchPaySettingService extends IService { + + Page scopePageList(Page page, MchPaySettingDto dto, DataScope dataScope); + + List pageList(MchPaySettingDto dto, DataScope dataScope); + + Long create(MchPaySettingDto dto); + + MchPaySettingEntity edit(MchPaySettingDto dto); + + /** + * 用户可以支付的方式(目前微信、支付宝) + */ + List getUserPaySettingList(PjcloudUser user); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java index b72ad0153..01fb954b8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java @@ -16,6 +16,7 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.QRCodeImageGenerator; @@ -31,14 +32,17 @@ import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchSupType; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; +import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.code.MchCollectionCodeVo; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; import com.bsd.pjcloud.wallet.mapper.MchManageMapper; import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; import com.bsd.pjcloud.wallet.service.MchManageService; +import com.bsd.pjcloud.wallet.service.MchPaySettingService; import com.bsd.pjcloud.wallet.service.WalletThirdZyService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -73,6 +77,8 @@ public class MchManageServiceImpl extends ServiceImpl deptIds = parentDeptIdList.stream().map(SysDept::getDeptId).toList(); - return getFirstMch(deptIds, mchTypeList); + MchManageVo targetMchVo = getFirstMch(deptIds, mchTypeList); + if (ObjectUtil.isNotEmpty(targetMchVo)) { + MchPaySettingDto paySettingDto = new MchPaySettingDto(); + paySettingDto.setMchId(targetMchVo.getId()); + paySettingDto.setEnable(YesNoEnum.YES.getCode()); + List paySettingList = paySettingService.pageList(paySettingDto, null); + if (ObjectUtil.isNotEmpty(paySettingList)) { + targetMchVo.setPaySettingList(paySettingList); + } + } + return targetMchVo; } /** diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java new file mode 100755 index 000000000..a779a5c38 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchPaySettingServiceImpl.java @@ -0,0 +1,99 @@ +package com.bsd.pjcloud.wallet.service.impl.mch; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo; +import com.bsd.pjcloud.wallet.mapper.mch.MchPaySettingMapper; +import com.bsd.pjcloud.wallet.service.MchManageService; +import com.bsd.pjcloud.wallet.service.MchPaySettingService; +import com.bsd.pjcloud.wallet.service.WalletManageService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; +import java.util.List; + +/** + * 商户管理 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class MchPaySettingServiceImpl extends ServiceImpl implements MchPaySettingService { + + @Lazy + private final MchManageService mchManageService; + + private final RemoteUserService remoteUserService; + + @Override + public Page scopePageList(Page page, MchPaySettingDto dto, DataScope dataScope) { + return baseMapper.scopePageList(page, dto, dataScope); + } + + @Override + public List pageList(MchPaySettingDto dto, DataScope dataScope) { + return baseMapper.pageList(dto, dataScope); + } + + @Override + public Long create(MchPaySettingDto dto) { + if (existPlatformType(dto)) { + throw new RuntimeException("改支付类型已经设置,请直接修改"); + } + baseMapper.insert(dto); + return dto.getId(); + } + + @Override + public MchPaySettingEntity edit(MchPaySettingDto dto) { + if (existPlatformType(dto)) { + throw new RuntimeException("改支付类型已经设置,请直接修改"); + } + baseMapper.updateById(dto); + return dto; + } + + /** + * 用户可以支付的方式(目前微信、支付宝) + */ + @Override + public List getUserPaySettingList(PjcloudUser user) { + // 查询当前的登录用户 + UserInfo userInfo = remoteUserService.getByUserId(user.getId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new RuntimeException("用户不存在"); + } + MchManageVo targetMch = mchManageService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId(), List.of(MerchantTypeEnum.OTHER_CANTEEN)); + if (ObjectUtil.isEmpty(targetMch) || ObjectUtil.isEmpty(targetMch.getPaySettingList())) { + return List.of(); + } + return targetMch.getPaySettingList(); + } + + public Boolean existPlatformType(MchPaySettingDto dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getMchId()), MchPaySettingEntity::getMchId, dto.getMchId()) + .eq(ObjectUtil.isNotEmpty(dto.getPlatformType()), MchPaySettingEntity::getPlatformType, dto.getPlatformType()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count > 1; + } + return count >= 1; + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchPaySettingMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchPaySettingMapper.xml new file mode 100755 index 000000000..90d908144 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchPaySettingMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + select a.id, + a.mch_id, + a.platform_type, + a.enable, + a.use_scope, + a.setting_json, + a.fz_ratio, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.mch_id = #{dto.mchId} + + + and a.enable = #{dto.enable} + + + + + , + m.name as mchName + from mch_pay_setting a + left join mch_manage m on a.mch_id = m.id + + + + + + + + + + + + \ No newline at end of file