From 5ee07ec34d4eee862c8a089f1ca75ee499887c93 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Wed, 1 Mar 2023 10:59:27 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8F=90=E7=8E=B0-?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E6=94=AF=E4=BB=98=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=EF=BC=8C=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/MemberWalletBuyerController.java | 46 +++++-- .../lili/event/impl/MemberWalletExecute.java | 32 ++++- .../lili/event/impl/NoticeMessageExecute.java | 75 +++-------- .../java/cn/lili/common/enums/ResultCode.java | 5 +- .../DistributionCashServiceImpl.java | 2 - .../entity/enums/NoticeMessageNodeEnum.java | 7 +- .../serviceimpl/NoticeMessageServiceImpl.java | 2 +- .../modules/payment/kit/CashierSupport.java | 8 +- .../cn/lili/modules/payment/kit/Payment.java | 2 +- .../kit/plugin/alipay/AliPayPlugin.java | 8 +- .../kit/plugin/wechat/WechatPlugin.java | 30 +++-- .../system/entity/dto/WithdrawalSetting.java | 23 +++- .../system/entity/vo/WithdrawalSettingVO.java | 27 ++++ .../entity/dos/MemberWithdrawApply.java | 6 + .../entity/dto/MemberWithdrawalMessage.java | 9 +- .../entity/enums/WithdrawStatusEnum.java | 10 +- .../wallet/service/MemberWalletService.java | 14 +- .../serviceimpl/MemberWalletServiceImpl.java | 125 +++++++++++------- .../MemberWithdrawApplyServiceImpl.java | 29 +--- .../other/ElasticsearchController.java | 4 - 20 files changed, 276 insertions(+), 188 deletions(-) create mode 100644 framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java diff --git a/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java index 52328e6f..4e330d5d 100644 --- a/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java @@ -9,12 +9,18 @@ import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.WithdrawalSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.entity.vo.WithdrawalSettingVO; +import cn.lili.modules.system.service.SettingService; import cn.lili.modules.verification.entity.enums.VerificationEnums; import cn.lili.modules.verification.service.VerificationService; import cn.lili.modules.wallet.entity.dos.MemberWallet; import cn.lili.modules.wallet.entity.vo.MemberWalletVO; import cn.lili.modules.wallet.service.MemberWalletService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.Gson; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -24,7 +30,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.Max; -import javax.validation.constraints.Min; import javax.validation.constraints.Pattern; /** @@ -54,6 +59,9 @@ public class MemberWalletBuyerController { @Autowired private VerificationService verificationService; + @Autowired + private SettingService settingService; + @GetMapping @ApiOperation(value = "查询会员预存款余额") public ResultMessage get() { @@ -64,6 +72,31 @@ public class MemberWalletBuyerController { throw new ServiceException(ResultCode.USER_NOT_LOGIN); } + @GetMapping(value = "/withdrawalSettingVO") + @ApiOperation(value = "获取提现设置VO") + public ResultMessage minPrice() { + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()); + WithdrawalSetting withdrawalSetting = new Gson().fromJson(setting.getSettingValue(), WithdrawalSetting.class); + + WithdrawalSettingVO withdrawalSettingVO = new WithdrawalSettingVO(); + withdrawalSettingVO.setMinPrice(withdrawalSetting.getMinPrice()); + withdrawalSettingVO.setFee(withdrawalSetting.getFee()); + withdrawalSettingVO.setType(withdrawalSetting.getType()); + return ResultUtil.data(withdrawalSettingVO); + } + + @PreventDuplicateSubmissions + @PostMapping(value = "/withdrawal") + @ApiOperation(value = "会员中心余额提现") + @ApiImplicitParams({ + @ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query"), + @ApiImplicitParam(name = "realName", value = "真实姓名", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "connectNumber", value = "第三方登录账号", required = true, dataType = "String", paramType = "query") + }) + public ResultMessage withdrawal(@Max(value = 9999, message = "充值金额单次最多允许提现9999元") Double price, @RequestParam String realName, @RequestParam String connectNumber) { + return ResultUtil.data(memberWalletService.applyWithdrawal(price, realName, connectNumber)); + } + @PostMapping(value = "/set-password") @ApiOperation(value = "设置支付密码") @ApiImplicitParams({ @@ -120,15 +153,4 @@ public class MemberWalletBuyerController { return memberWalletService.checkPassword(); } - - @PreventDuplicateSubmissions - @PostMapping(value = "/withdrawal") - @ApiOperation(value = "会员中心余额提现") - @ApiImplicitParams({ - @ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query") - }) - public ResultMessage withdrawal(@Max(value = 9999, message = "充值金额单次最多允许提现9999元") @Min(value = 1, message = "充值金额单次最少提现金额为1元") Double price) { - return ResultUtil.data(memberWalletService.applyWithdrawal(price)); - } - } diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java index 79713ce2..b2fbf5b8 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java @@ -1,8 +1,11 @@ package cn.lili.event.impl; -import cn.lili.event.MemberRegisterEvent; -import cn.lili.modules.member.entity.dos.Member; +import cn.lili.event.MemberWithdrawalEvent; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; import cn.lili.modules.wallet.service.MemberWalletService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,14 +17,31 @@ import org.springframework.stereotype.Service; * @since 2020-07-03 11:20 */ @Service -public class MemberWalletExecute implements MemberRegisterEvent { +public class MemberWalletExecute implements MemberWithdrawalEvent { @Autowired private MemberWalletService memberWalletService; @Override - public void memberRegister(Member member) { - // 有些情况下,会同时创建一个member_id的两条数据 -// memberWalletService.save(member.getId(),member.getUsername()); + public void memberWithdrawal(MemberWithdrawalMessage memberWithdrawalMessage) { + switch (WithdrawStatusEnum.valueOf(memberWithdrawalMessage.getStatus())) { + case VIA_AUDITING: + memberWalletService.withdrawal(memberWithdrawalMessage.getMemberWithdrawApplyId()); + break; + case SUCCESS: + //提现成功扣减冻结金额 + memberWalletService.reduceFrozen( + new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), memberWithdrawalMessage.getMemberId(), "提现成功,余额提现", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + break; + case ERROR: + //需要从冻结金额扣减到余额 + memberWalletService.increaseWithdrawal(new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), memberWithdrawalMessage.getMemberId(), "提现失败,提现金额解冻到余额", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + break; + case FAIL_AUDITING: + //需要从冻结金额扣减到余额 + memberWalletService.increaseWithdrawal(new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), memberWithdrawalMessage.getMemberId(), "审核拒绝,提现金额解冻到余额", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + default: + break; + } } } diff --git a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java index 386732a7..3dfc8b1e 100644 --- a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java @@ -16,7 +16,6 @@ import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum; import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; -import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum; import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -179,60 +178,30 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, public void memberWithdrawal(MemberWithdrawalMessage memberWithdrawalMessage) { NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); noticeMessageDTO.setMemberId(memberWithdrawalMessage.getMemberId()); - //如果提现状态为申请则发送申请提现站内消息 - if (memberWithdrawalMessage.getStatus().equals(WithdrawStatusEnum.APPLY.name())) { - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_CREATE); - Map params = new HashMap<>(2); - params.put("price", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setParameter(params); - //发送提现申请成功消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - } - //如果提现状态为通过则发送审核通过站内消息 - if (memberWithdrawalMessage.getStatus().equals(WithdrawStatusEnum.VIA_AUDITING.name())) { - //如果提现到余额 - if (memberWithdrawalMessage.getDestination().equals(MemberWithdrawalDestinationEnum.WALLET.name())) { - //组织参数 - Map params = new HashMap<>(2); - params.put("income", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setParameter(params); + Map params = new HashMap<>(2); + switch (WithdrawStatusEnum.valueOf(memberWithdrawalMessage.getStatus())) { + case APPLY: + //如果提现状态为申请则发送申请提现站内消息 + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_CREATE); + break; + case FAIL_AUDITING: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_AUDIT_ERROR); + break; + case SUCCESS: noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_SUCCESS); - //发送提现成功消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - params.put("income", memberWithdrawalMessage.getPrice().toString()); - params.put("expenditure", "0"); - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_CHANGE); - noticeMessageDTO.setParameter(params); - //发送余额变动消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - } - //如果提现到微信 - if (memberWithdrawalMessage.getDestination().equals(MemberWithdrawalDestinationEnum.WECHAT.name())) { - Map params = new HashMap<>(2); - params.put("income", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setParameter(params); - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_WEICHAT_SUCCESS); - //发送提现成功消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - - params.put("income", "0"); - params.put("expenditure", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_CHANGE); - noticeMessageDTO.setParameter(params); - //发送余额变动消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - } - } - //如果提现状态为拒绝则发送审核拒绝站内消息 - if (memberWithdrawalMessage.getStatus().equals(WithdrawStatusEnum.FAIL_AUDITING.name())) { - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_ERROR); - Map params = new HashMap<>(2); - params.put("price", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setParameter(params); - //发送提现申请成功消息 - noticeMessageService.noticeMessage(noticeMessageDTO); + break; + case ERROR: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_ERROR); + break; + case VIA_AUDITING: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_AUDIT_SUCCESS); + default: + break; } - + params.put("price", memberWithdrawalMessage.getPrice().toString()); + noticeMessageDTO.setParameter(params); + //发送提现申请消息 + noticeMessageService.noticeMessage(noticeMessageDTO); } } diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index b93239fb..e31369e5 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -257,8 +257,9 @@ public enum ResultCode { WALLET_WITHDRAWAL_FROZEN_AMOUNT_INSUFFICIENT(34006, "冻结金额不足,无法处理提现申请请求!"), WALLET_ERROR_INSUFFICIENT(34003, "零钱提现失败!"), WALLET_REMARK_ERROR(34004, "请填写审核备注!"), - WALLET_EXIT_ERROR(34000, "钱包已存在,无法重复创建"), - WALLET_APPLY_ERROR(34005, "提现申请异常!"), + WALLET_EXIT_ERROR(34005, "钱包已存在,无法重复创建"), + WALLET_APPLY_ERROR(34006, "提现申请异常!"), + WALLET_APPLY_MIN_PRICE_ERROR(34007, "提现最低提现金额错误!"), /** * 评价 diff --git a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java index 8f3e18cc..122b23d2 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java @@ -83,7 +83,6 @@ public class DistributionCashServiceImpl extends ServiceImpl() .eq(NoticeMessage::getNoticeNode - , noticeMessageDTO.getNoticeMessageNodeEnum().getDescription().trim())); + , noticeMessageDTO.getNoticeMessageNodeEnum().getDescription().trim()),false); //如果通知类站内信开启的情况下 if (noticeMessage != null && noticeMessage.getNoticeStatus().equals(SwitchEnum.OPEN.name())) { MemberMessage memberMessage = new MemberMessage(); diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java b/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java index fb8874cc..e9dca0f8 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java @@ -145,13 +145,15 @@ public class CashierSupport { /** * 用户提现 - * @param paymentMethodEnum 支付渠道 + * + * @param paymentMethodEnum 支付渠道 * @param memberWithdrawApply 用户提现申请 */ - public void transfer(PaymentMethodEnum paymentMethodEnum, MemberWithdrawApply memberWithdrawApply){ + public boolean transfer(PaymentMethodEnum paymentMethodEnum, MemberWithdrawApply memberWithdrawApply) { Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); - payment.transfer(memberWithdrawApply); + return payment.transfer(memberWithdrawApply); } + /** * 获取收银台参数 * diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java b/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java index fba4010e..bb96c3e9 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java @@ -114,7 +114,7 @@ public interface Payment { /** * 提现 */ - default void transfer(MemberWithdrawApply memberWithdrawApply) { + default boolean transfer(MemberWithdrawApply memberWithdrawApply) { throw new ServiceException(ResultCode.PAY_ERROR); } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java index 2d72e845..f40f277f 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java @@ -31,7 +31,6 @@ import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.*; import com.alipay.api.internal.util.AlipaySignature; -import com.alipay.api.request.AlipayFundTransUniTransferRequest; import com.alipay.api.response.AlipayFundTransUniTransferResponse; import com.alipay.api.response.AlipayTradeRefundResponse; import lombok.extern.slf4j.Slf4j; @@ -238,7 +237,7 @@ public class AliPayPlugin implements Payment { * @param memberWithdrawApply 会员提现申请 */ @Override - public void transfer(MemberWithdrawApply memberWithdrawApply) { + public boolean transfer(MemberWithdrawApply memberWithdrawApply) { AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); model.setOutBizNo(SnowFlake.createStr("T")); model.setRemark("用户提现"); @@ -255,10 +254,10 @@ public class AliPayPlugin implements Payment { model.setOrderTitle("用户提现"); //交互退款 try { - AlipayFundTransUniTransferResponse alipayFundTransUniTransferResponse = AliPayApi.uniTransferToResponse(model,null); + AlipayFundTransUniTransferResponse alipayFundTransUniTransferResponse = AliPayApi.uniTransferToResponse(model, null); log.error("支付宝退款,参数:{},支付宝响应:{}", JSONUtil.toJsonStr(model), JSONUtil.toJsonStr(alipayFundTransUniTransferResponse)); if (alipayFundTransUniTransferResponse.isSuccess()) { - + return true; } else { log.error(alipayFundTransUniTransferResponse.getSubMsg()); } @@ -266,6 +265,7 @@ public class AliPayPlugin implements Payment { log.error("用户提现异常:", e); throw new ServiceException(ResultCode.PAY_ERROR); } + return false; } /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java index 3497d8e2..a4cbbd4e 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java @@ -39,11 +39,13 @@ import cn.lili.modules.payment.kit.plugin.wechat.model.*; import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.WithdrawalSetting; import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -475,17 +477,21 @@ public class WechatPlugin implements Payment { * @param memberWithdrawApply 会员提现申请 */ @Override - public void transfer(MemberWithdrawApply memberWithdrawApply) { + public boolean transfer(MemberWithdrawApply memberWithdrawApply) { try { - WechatPaymentSetting setting = wechatPaymentSetting(); + //获取提现设置 + WithdrawalSetting withdrawalSetting = new Gson().fromJson(settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()).getSettingValue(), WithdrawalSetting.class); + //获取微信设置 + WechatPaymentSetting wechatPaymentSetting = wechatPaymentSetting(); + //获取用户openId Connect connect = connectService.queryConnect( - ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()) + ConnectQueryDTO.builder().userId(memberWithdrawApply.getMemberId()) .unionType(ConnectEnum.WECHAT_OPEN_ID.name()).build() ); - //根据自身情况设置AppId,此处我存放的是服务号的APPID,下方的openID需要对应此处的APPID配置 + //构建提现,发起申请 TransferModel transferModel = new TransferModel() - .setAppid(setting.getServiceAppId()) + .setAppid(withdrawalSetting.getWechatAppId()) .setOut_batch_no(SnowFlake.createStr("T")) .setBatch_name("用户提现") .setBatch_remark("用户提现") @@ -499,10 +505,6 @@ public class WechatPlugin implements Payment { transferDetailInput.setTransfer_amount(CurrencyUtil.fen(memberWithdrawApply.getApplyMoney())); transferDetailInput.setTransfer_remark("用户提现"); transferDetailInput.setOpenid(connect.getUnionId()); -// transferDetailInput.setUserName( -// "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45"); -// transferDetailInput.setUserIdCard( -// "8609cb22e1774a50a930e414cc71eca06121bcd266335cda230d24a7886a8d9f"); transferDetailListList.add(transferDetailInput); } transferModel.setTransfer_detail_list(transferDetailListList); @@ -511,17 +513,21 @@ public class WechatPlugin implements Payment { RequestMethodEnums.POST, WechatDomain.CHINA.toString(), WechatApiEnum.TRANSFER_BATCHES.toString(), - setting.getMchId(), - setting.getSerialNumber(), + wechatPaymentSetting.getMchId(), + wechatPaymentSetting.getSerialNumber(), null, - setting.getApiclient_key(), + wechatPaymentSetting.getApiclient_key(), JSONUtil.toJsonStr(transferModel) ); log.info("微信提现响应 {}", response); + String body = response.getBody(); + JSONObject jsonObject = JSONUtil.parseObj(body); + return jsonObject.getStr("batch_id") != null ? true : false; //根据自身业务进行接下来的任务处理 } catch (Exception e) { e.printStackTrace(); } + return false; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java index 932bbab4..bb916e2c 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java @@ -15,7 +15,28 @@ public class WithdrawalSetting implements Serializable { private static final long serialVersionUID = -3872782530832122976L; /** - * 提现是否需要申请 + * 提现最低金额 + */ + private Double minPrice; + /** + * 提现手续费 + */ + private Double fee; + /** + * 提现类型 WECHAT\ALI + */ + private String type; + /** + * 提现是否需要审核 */ private Boolean apply; + + /** + * 微信提现使用的APPID + */ + private String wechatAppId; + /** + * 微信APPID渠道 + */ + private String wechatAppIdSource; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java new file mode 100644 index 00000000..2c1d9545 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java @@ -0,0 +1,27 @@ +package cn.lili.modules.system.entity.vo; + +import lombok.Data; + +/** + * 用户提现设置VO + * + * @author Bulbasaur + * @since 2023/3/1 + */ +@Data +public class WithdrawalSettingVO { + + /** + * 提现最低金额 + */ + private Double minPrice; + /** + * 提现手续费 + */ + private Double fee; + /** + * 提现类型 WECHAT\ALI + */ + private String type; + +} diff --git a/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java index 78c630ae..cb5ee344 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java @@ -56,8 +56,14 @@ public class MemberWithdrawApply extends BaseEntity { @ApiModelProperty(value = "sn") private String sn; + /** + * 支付宝提现时必填 + */ @ApiModelProperty(value = "真实姓名") private String realName; + /** + * 支付宝登录账号 + */ @ApiModelProperty(value = "第三方平台账号") private String connectNumber; diff --git a/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java index 6eeb7f62..30a691f1 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java @@ -1,6 +1,5 @@ package cn.lili.modules.wallet.entity.dto; -import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,6 +12,9 @@ import lombok.Data; @Data public class MemberWithdrawalMessage { + @ApiModelProperty(value = "提现申请ID") + private String memberWithdrawApplyId; + @ApiModelProperty(value = "金额") private Double price; @@ -22,9 +24,4 @@ public class MemberWithdrawalMessage { @ApiModelProperty(value = "提现状态") private String status; - /** - * @see MemberWithdrawalDestinationEnum - */ - @ApiModelProperty(value = "提现到哪里") - private String destination; } diff --git a/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java index 3910eace..d5f91e73 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java @@ -18,7 +18,15 @@ public enum WithdrawStatusEnum { /** * 审核未通过 */ - FAIL_AUDITING("审核未通过"); + FAIL_AUDITING("审核未通过"), + /** + * 提现成功 + */ + SUCCESS("提现成功"), + /** + * 提现失败 + */ + ERROR("提现失败"); private String description; diff --git a/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java index 99334fd3..c0b0c416 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java +++ b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java @@ -3,10 +3,10 @@ package cn.lili.modules.wallet.service; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.wallet.entity.dos.MemberWallet; -import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; import cn.lili.modules.wallet.entity.vo.MemberWalletVO; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.bind.annotation.RequestParam; /** * 会员预存款业务层 @@ -80,7 +80,7 @@ public interface MemberWalletService extends IService { Boolean checkPassword(); /** - * 会员注册添加会员预存款 + * 会员注册添加会员余额钱包 * * @param memberId 会员id * @param memberName 会员名称 @@ -92,16 +92,18 @@ public interface MemberWalletService extends IService { * 用户提现 * * @param price 提现金额 + * @param realName 真实姓名 + * @param connectNumber 第三方账号 * @return 是否提现成功 */ - Boolean applyWithdrawal(Double price); + Boolean applyWithdrawal(Double price, String realName, String connectNumber); /** - * 提现公共方法,此方法供前端用户提现和后端提现使用 + * 提现公共方法 * - * @param memberWithdrawApply 会员零钱提现申请 + * @param withdrawApplyId 会员零钱提现Id * @return 操作状态 */ - Boolean withdrawal(MemberWithdrawApply memberWithdrawApply); + Boolean withdrawal(String withdrawApplyId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java index 4ea20933..266619fb 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java @@ -23,7 +23,6 @@ import cn.lili.modules.wallet.entity.dos.WalletLog; import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; -import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum; import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; import cn.lili.modules.wallet.entity.vo.MemberWalletVO; import cn.lili.modules.wallet.mapper.MemberWalletMapper; @@ -248,71 +247,105 @@ public class MemberWalletServiceImpl extends ServiceImpl corporateBankInit(int i) { - corporateBankService.init(i); return ResultUtil.success(); } @Autowired From 8d8cffca7113204a64e214e9db530fbb41a2a6e2 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Thu, 2 Mar 2023 10:45:43 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=9B=86=E6=88=90unionID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectBuyerWebController.java | 16 +- config/application.yml | 28 +-- .../lili/event/MemberConnectLoginEvent.java | 21 ++ .../cn/lili/event/impl/MemberExecute.java | 26 +- .../lili/listener/MemberMessageListener.java | 21 +- .../connect/config/ConnectAuthEnum.java | 5 +- .../connect/entity/dto/ConnectAuthUser.java | 15 ++ .../entity/dto/MemberConnectLoginMessage.java | 14 ++ .../connect/entity/enums/ConnectEnum.java | 2 - .../connect/entity/enums/SourceEnum.java | 24 ++ .../request/BaseAuthWeChatPCRequest.java | 6 +- .../request/BaseAuthWeChatRequest.java | 6 +- .../connect/service/ConnectService.java | 32 +-- .../serviceimpl/ConnectServiceImpl.java | 223 ++++++++---------- .../modules/connect/util/ConnectUtil.java | 17 +- .../modules/member/service/MemberService.java | 15 +- .../member/serviceimpl/MemberServiceImpl.java | 112 ++++----- .../cn/lili/rocketmq/tags/MemberTagsEnum.java | 6 +- 18 files changed, 323 insertions(+), 266 deletions(-) create mode 100644 consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java create mode 100644 framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java create mode 100644 framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index fa99b2fe..af2eec2b 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -47,7 +47,7 @@ public class ConnectBuyerWebController { @GetMapping("/login/web/{type}") - @ApiOperation(value = "WEB信任登录授权") + @ApiOperation(value = "WEB信任登录授权,包含PC、WAP") @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "登录方式:QQ,微信,微信_PC", allowableValues = "QQ,WECHAT,WECHAT_PC", paramType = "path") @@ -75,12 +75,12 @@ public class ConnectBuyerWebController { return connectUtil.getResult(state); } - @GetMapping("/register/auto") - @ApiOperation(value = "WEB信任登录授权") - public ResultMessage webAuthorize() { - Token token = memberService.autoRegister(); - return ResultUtil.data(token); - } +// @GetMapping("/register/auto") +// @ApiOperation(value = "WEB信任登录授权") +// public ResultMessage webAuthorize() { +// Token token = memberService.autoRegister(); +// return ResultUtil.data(token); +// } @ApiOperation(value = "unionID登录") @ApiImplicitParams({ @@ -92,7 +92,7 @@ public class ConnectBuyerWebController { @GetMapping("/app/login") public ResultMessage unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { try { - return ResultUtil.data(connectService.appLoginCallback(authUser, uuid)); + return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid)); } catch (Exception e) { log.error("unionID登录错误", e); } diff --git a/config/application.yml b/config/application.yml index 201f837f..4e5c9dac 100644 --- a/config/application.yml +++ b/config/application.yml @@ -24,13 +24,13 @@ spring: boot: admin: client: - url: http://192.168.0.116:8000 + url: http://192.168.0.108:8000 cache: type: redis # Redis redis: - host: 127.0.0.1 - port: 6379 + host: 192.168.0.108 + port: 30379 password: lilishop lettuce: pool: @@ -60,7 +60,7 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://192.168.0.108:30306/kuaidi100?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop maxActive: 50 @@ -241,16 +241,16 @@ lili: sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 #域名 domain: - pc: http://192.168.0.116:8888 - wap: http://192.168.0.116:8888 - seller: http://192.168.0.116:8888 - admin: http://192.168.0.116:8888 + pc: http://192.168.0.108:8888 + wap: http://192.168.0.108:8888 + seller: http://192.168.0.108:8888 + admin: http://192.168.0.108:8888 #api地址 api: buyer: https://z171l91606.51mypc.cn - base: http://192.168.0.116:8888 - manager: http://192.168.0.116:8888 - seller: http://192.168.0.116:8888 + base: http://192.168.0.108:8888 + manager: http://192.168.0.108:8888 + seller: http://192.168.0.108:8888 # jwt 细节设定 jwt-setting: @@ -269,7 +269,7 @@ lili: data: elasticsearch: cluster-name: elasticsearch - cluster-nodes: 127.0.0.1:9200 + cluster-nodes: 192.168.0.108:30920 index: number-of-replicas: 0 number-of-shards: 3 @@ -301,7 +301,7 @@ lili: after-sale-topic: lili_after_sale_topic after-sale-group: lili_after_sale_group rocketmq: - name-server: 127.0.0.1:9876 + name-server: 192.168.0.108:30876 isVIPChannel: false producer: group: lili_group @@ -310,7 +310,7 @@ rocketmq: xxl: job: admin: - addresses: http://127.0.0.1:9001/xxl-job-admin + addresses: http://192.168.0.108:9001/xxl-job-admin executor: appname: xxl-job-executor-lilishop address: diff --git a/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java b/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java new file mode 100644 index 00000000..b103e214 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java @@ -0,0 +1,21 @@ +package cn.lili.event; + +import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.member.entity.dos.Member; + +/** + * 会员联合登录消息 + * + * @author Chopper + * @since 2020/11/17 7:13 下午 + */ +public interface MemberConnectLoginEvent { + + /** + * 会员联合登录 + * + * @param member 会员 + * @param authUser 第三方登录 + */ + void memberConnectLogin(Member member, ConnectAuthUser authUser); +} diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java index 57e4c2fb..6fc02177 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java @@ -1,25 +1,49 @@ package cn.lili.event.impl; +import cn.hutool.core.util.StrUtil; +import cn.lili.event.MemberConnectLoginEvent; import cn.lili.event.MemberLoginEvent; +import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.system.service.SettingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 会员自身业务 + * 会员登录,会员第三方登录 * * @author Chopper * @version v1.0 * 2022-01-11 11:08 */ @Service -public class MemberExecute implements MemberLoginEvent { +public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent { @Autowired private MemberService memberService; + @Autowired + private ConnectService connectService; + @Autowired + private SettingService settingService; @Override public void memberLogin(Member member) { memberService.updateMemberLoginTime(member.getId()); } + + @Override + public void memberConnectLogin(Member member, ConnectAuthUser authUser) { + + //保存UnionID + if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { + connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getType()); + } + //保存OpenID + if (StrUtil.isNotBlank(authUser.getUuid())) { + connectService.loginBindUser(member.getId(), authUser.getUuid(), authUser.getType()); + } + + } } diff --git a/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java b/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java index 2e384744..05a928c7 100644 --- a/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java @@ -3,6 +3,7 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; import cn.lili.event.*; import cn.lili.event.impl.ImTalkExecute; +import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberSign; import cn.lili.modules.member.entity.dto.MemberPointMessage; @@ -55,10 +56,10 @@ public class MemberMessageListener implements RocketMQListener { */ @Autowired private List memberLoginEvents; - @Autowired private List memberInfoChangeEvents; - + @Autowired + private List memberConnectLoginEvents; @Override public void onMessage(MessageExt messageExt) { @@ -77,7 +78,7 @@ public class MemberMessageListener implements RocketMQListener { } } break; - + //用户登录 case MEMBER_LOGIN: for (MemberLoginEvent memberLoginEvent : memberLoginEvents) { @@ -139,6 +140,20 @@ public class MemberMessageListener implements RocketMQListener { } } break; + //用户第三方登录 + case MEMBER_CONNECT_LOGIN: + for (MemberConnectLoginEvent memberConnectLoginEvent : memberConnectLoginEvents) { + try { + MemberConnectLoginMessage memberConnectLoginMessage = JSONUtil.toBean(new String(messageExt.getBody()), MemberConnectLoginMessage.class); + memberConnectLoginEvent.memberConnectLogin(memberConnectLoginMessage.getMember(), memberConnectLoginMessage.getConnectAuthUser()); + } catch (Exception e) { + log.error("会员{},在{}业务中,状态修改事件执行异常", + new String(messageExt.getBody()), + memberConnectLoginEvent.getClass().getName(), + e); + } + } + break; default: break; } diff --git a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java index 1e6facdb..201c49b2 100644 --- a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java @@ -11,9 +11,9 @@ package cn.lili.modules.connect.config; public enum ConnectAuthEnum implements ConnectAuth { /** - * 微信开放平台 + * 微信公众号登录 */ - WECHAT { + WECHAT_WAP { @Override public String authorize() { return "https://open.weixin.qq.com/connect/oauth2/authorize"; @@ -32,6 +32,7 @@ public enum ConnectAuthEnum implements ConnectAuth { /** * 微信开放平台 + * 微信PC登录 */ WECHAT_PC { @Override diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java index d9e5522d..66373c55 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java @@ -67,6 +67,16 @@ public class ConnectAuthUser implements Serializable { * 用户来源 */ private String source; + /** + * 用户来源 + * 例如:微信、支付宝、微博 + */ + private String source1; + /** + * 类型 + * 例如:PC、WAP、小程序 + */ + private String type; /** * 用户授权的token信息 */ @@ -81,4 +91,9 @@ public class ConnectAuthUser implements Serializable { */ private ConnectAuthEnum connectEnum; + /** + * 手机号 + */ + private String phone; + } diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java new file mode 100644 index 00000000..4e7198fd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java @@ -0,0 +1,14 @@ +package cn.lili.modules.connect.entity.dto; + +import cn.lili.modules.member.entity.dos.Member; +import lombok.Data; + +/** + * 会员联合登录消息 + */ +@Data +public class MemberConnectLoginMessage { + + private Member member; + private ConnectAuthUser connectAuthUser; +} diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java index 04d17aab..162bac7a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java @@ -15,8 +15,6 @@ public enum ConnectEnum { WEIBO("微博联合登录"), //只存放unionid WECHAT("微信联合登录"), - WECHAT_OPEN_ID("微信openid登录"), - WECHAT_MP_OPEN_ID("微信openid登录"), ALIPAY("支付宝登录"), APPLE("苹果登录"); diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java new file mode 100644 index 00000000..685468f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java @@ -0,0 +1,24 @@ +package cn.lili.modules.connect.entity.enums; + +/** + * 联合登陆-渠道枚举 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/25 18:20 + */ +public enum SourceEnum { + + WECHAT_PC_OPEN_ID("微信PC应用 openid登录"), + WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"), + WECHAT_MP_OPEN_ID("微信小程序 openid登录"), + WECHAT_APP_OPEN_ID("微信APP openid登录"), + ; + + + private final String description; + + SourceEnum(String description) { + this.description = description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java index 5d0bfd0c..615fee93 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java @@ -10,6 +10,8 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.common.utils.HttpUtils; import com.alibaba.fastjson.JSONObject; @@ -56,10 +58,12 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest { .nickname(object.getString("nickname")) .avatar(object.getString("headimgurl")) .location(location) - .uuid(authToken.getUnionId()) + .uuid(authToken.getOpenId()) .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) .source(source.toString()) + .source1(ConnectEnum.WECHAT.name()) + .type(SourceEnum.WECHAT_PC_OPEN_ID.name()) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index eb146d7c..f703f937 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -10,6 +10,8 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.GlobalAuthUtils; import cn.lili.common.utils.HttpUtils; @@ -23,7 +25,7 @@ import com.alibaba.fastjson.JSONObject; */ public class BaseAuthWeChatRequest extends BaseAuthRequest { public BaseAuthWeChatRequest(AuthConfig config, Cache cache) { - super(config, ConnectAuthEnum.WECHAT, cache); + super(config, ConnectAuthEnum.WECHAT_WAP, cache); } /** @@ -62,6 +64,8 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest { .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) .source(source.toString()) + .source1(ConnectEnum.WECHAT.name()) + .type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java b/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java index 9aef44aa..94fc5694 100644 --- a/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java +++ b/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java @@ -28,27 +28,14 @@ public interface ConnectService extends IService { */ String CONNECT_TYPE = "CONNECT_TYPE"; - /** - * 联合登陆 - * - * @param type 类型 - * @param unionid unionid - * @param longTerm 是否长时间有效 - * @param uuid UUID - * @return token - * @throws NoPermissionException 不允许操作 - */ - Token unionLoginCallback(String type, String unionid, String uuid, boolean longTerm) throws NoPermissionException; - /** * 联合登陆对象直接登录 * - * @param type 第三方登录类型 * @param authUser 第三方登录返回封装类 * @param uuid 用户uuid * @return token */ - Token unionLoginCallback(String type, ConnectAuthUser authUser, String uuid); + Token unionLoginCallback(ConnectAuthUser authUser, String uuid); /** * 绑定 @@ -86,15 +73,6 @@ public interface ConnectService extends IService { return CachePrefix.CONNECT_AUTH.getPrefix() + type + uuid; } - /** - * app联合登录 回调 - * - * @param authUser 登录对象 - * @param uuid uuid - * @return token - */ - Token appLoginCallback(ConnectAuthUser authUser, String uuid); - /** * 微信一键登录 @@ -119,4 +97,12 @@ public interface ConnectService extends IService { * @param userId 会员id */ void deleteByMemberId(String userId); + + /** + * 绑定第三方平台用户 + * @param userId 用户ID + * @param unionId 第三方平台用户ID + * @param type 平台类型 + */ + void loginBindUser(String userId, String unionId, String type); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index 3b7a9577..e8888c9a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -18,6 +18,7 @@ import cn.lili.common.utils.CookieUtil; import cn.lili.common.utils.HttpUtils; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.mapper.ConnectMapper; @@ -31,10 +32,13 @@ import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; @@ -71,65 +75,21 @@ public class ConnectServiceImpl extends ServiceImpl impl @Autowired private Cache cache; /** - * RocketMQ 配置 + * RocketMQ + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * RocketMQ配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; - @Autowired - private ApplicationEventPublisher applicationEventPublisher; - @Override @Transactional(rollbackFor = Exception.class) - public Token unionLoginCallback(String type, String unionid, String uuid, boolean longTerm) throws NoPermissionException { + public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) { - try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUnionId, unionid); - queryWrapper.eq(Connect::getUnionType, type); - //查询绑定关系 - Connect connect = this.getOne(queryWrapper); - if (connect == null) { - throw new NoPermissionException("未绑定用户"); - } - //查询会员 - Member member = memberService.getById(connect.getUserId()); - //如果未绑定会员,则把刚才查询到的联合登录表数据删除 - if (member == null) { - this.remove(queryWrapper); - throw new NoPermissionException("未绑定用户"); - } - return memberTokenGenerate.createToken(member, longTerm); - } catch (NoPermissionException e) { - log.error("联合登陆失败:", e); - throw e; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Token unionLoginCallback(String type, ConnectAuthUser authUser, String uuid) { - - Token token; - try { - token = this.unionLoginCallback(type, authUser.getUuid(), uuid, false); - } catch (NoPermissionException e) { - if (AUTO_REGION) { - token = memberService.autoRegister(authUser); - return token; - } else { - //写入cookie - CookieUtil.addCookie(CONNECT_COOKIE, uuid, 1800, ThreadContextHolder.getHttpResponse()); - CookieUtil.addCookie(CONNECT_TYPE, type, 1800, ThreadContextHolder.getHttpResponse()); - //自动登录失败,则把信息缓存起来 - cache.put(ConnectService.cacheKey(type, uuid), authUser, 30L, TimeUnit.MINUTES); - throw new ServiceException(ResultCode.USER_NOT_BINDING); - } - } catch (Exception e) { - log.error("联合登陆异常:", e); - throw new ServiceException(ResultCode.ERROR); - } - return token; + return this.unionLoginCallback(authUser, false); } @Override @@ -137,6 +97,8 @@ public class ConnectServiceImpl extends ServiceImpl impl AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); Connect connect = new Connect(authUser.getId(), unionId, type); this.save(connect); + + } @Override @@ -161,16 +123,6 @@ public class ConnectServiceImpl extends ServiceImpl impl return keys; } - @Override - @Transactional(rollbackFor = Exception.class) - public Token appLoginCallback(ConnectAuthUser authUser, String uuid) { - try { - return this.unionLoginCallback(authUser.getSource(), authUser.getUuid(), uuid, true); - } catch (NoPermissionException e) { - return memberService.autoRegister(authUser); - } - } - @Override @Transactional @@ -226,40 +178,24 @@ public class ConnectServiceImpl extends ServiceImpl impl */ @Transactional(rollbackFor = Exception.class) public Token phoneMpBindAndLogin(String sessionKey, WechatMPLoginParams params, String openId, String unionId) { - String encryptedData = params.getEncryptedData(); - String iv = params.getIv(); - JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv); - log.info("联合登陆返回:{}", userInfo.toString()); - String phone = (String) userInfo.get("purePhoneNumber"); + try { + String encryptedData = params.getEncryptedData(); + String iv = params.getIv(); + JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv); + log.info("联合登陆返回:{}", userInfo.toString()); + String phone = (String) userInfo.get("purePhoneNumber"); - //手机号登录 - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(Member::getMobile, phone); - Member member = memberService.getOne(lambdaQueryWrapper); - //如果不存在会员,则进行绑定微信openid 和 unionid,并且登录 - if (member != null) { - bindMpMember(openId, unionId, member); - return memberTokenGenerate.createToken(member, true); + ConnectAuthUser connectAuthUser = new ConnectAuthUser(); + connectAuthUser.setUuid(openId); + connectAuthUser.setNickname(params.getNickName()); + connectAuthUser.setAvatar(params.getImage()); + connectAuthUser.setUsername("m" + phone); + connectAuthUser.setPhone(phone); + return this.unionLoginCallback(connectAuthUser, true); + } catch (Exception e) { + e.printStackTrace(); } - - //如果没有会员,则根据手机号注册会员 - Member newMember = new Member("m" + phone, "111111", phone, params.getNickName(), params.getImage()); - memberService.save(newMember); - newMember = memberService.findByUsername(newMember.getUsername()); - - //判定有没有邀请人并且写入 - UserContext.settingInviter(newMember.getId(), cache); - - bindMpMember(openId, unionId, newMember); - - - //判定有没有邀请人并且写入 - UserContext.settingInviter(newMember.getId(), cache); - - - // 发送会员注册信息 - applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("new member register", rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_REGISTER.name(), newMember)); - return memberTokenGenerate.createToken(newMember, true); + return null; } @Override @@ -280,47 +216,72 @@ public class ConnectServiceImpl extends ServiceImpl impl } /** - * 会员绑定 绑定微信小程序 - *

- * 如果openid 已经绑定其他账号,则这里不作处理,如果未绑定,则绑定最新的会员 - * 这样,微信小程序注册之后,其他app 公众号页面,都可以实现绑定自动登录功能 - *

+ * 成功登录,则检测cookie中的信息,进行会员绑定 * - * @param openId 微信openid - * @param unionId 微信unionid - * @param member 会员 + * @param userId 用户ID + * @param unionId 第三方用户ID + * @param type 类型 */ - private void bindMpMember(String openId, String unionId, Member member) { - - - //如果unionid 不为空 则为账号绑定unionid - if (CharSequenceUtil.isNotEmpty(unionId)) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); - lambdaQueryWrapper.eq(Connect::getUnionId, unionId); - lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT.name()); - List connects = this.list(lambdaQueryWrapper); - if (connects.isEmpty()) { - Connect connect = new Connect(); - connect.setUnionId(unionId); - connect.setUserId(member.getId()); - connect.setUnionType(ConnectEnum.WECHAT.name()); - this.save(connect); - } - }//如果openid 不为空 则为账号绑定openid - if (CharSequenceUtil.isNotEmpty(openId)) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(Connect::getUnionId, openId); - lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name()); - List connects = this.list(lambdaQueryWrapper); - if (connects.isEmpty()) { - Connect connect = new Connect(); - connect.setUnionId(openId); - connect.setUserId(member.getId()); - connect.setUnionType(ConnectEnum.WECHAT_MP_OPEN_ID.name()); - this.save(connect); - } + @Override + public void loginBindUser(String userId, String unionId, String type) { + Connect connect = this.queryConnect( + ConnectQueryDTO.builder().unionId(unionId).unionType(type).build() + ); + if (connect == null) { + connect = new Connect(userId, unionId, type); + this.save(connect); } + } + + /** + * 第三方联合登陆 + * 1.判断是否使用开放平台 + * 1.1如果使用开放平台则使用UnionId进行登录 + * 1.2如果不适用开放平台则使用OpenId进行登录 + *

+ * 2.用户登录后判断绑定OpenId + * + * @param authUser 第三方登录封装类 + * @param longTerm 是否长时间有效 + * @return token + * @throws NoPermissionException 不允许操作 + */ + private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) { + + //使用UnionId登录 + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(Connect::getUnionId, authUser.getToken().getUnionId()) + .eq(Connect::getUnionType, authUser.getSource1()); + //查询绑定关系 + Connect connect = this.getOne(queryWrapper); + Member member = new Member(); + if (connect == null) { + member = memberService.autoRegister(authUser); + } else { + //查询会员 + member = memberService.getById(connect.getUserId()); + //如果未绑定会员,则把刚才查询到的联合登录表数据删除 + if (member == null) { + this.remove(queryWrapper); + member = memberService.autoRegister(authUser); + } + } + + //发送用户第三方登录消息 + MemberConnectLoginMessage memberConnectLoginMessage = new MemberConnectLoginMessage(); + memberConnectLoginMessage.setMember(member); + memberConnectLoginMessage.setConnectAuthUser(authUser); + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_CONNECT_LOGIN.name(); + //发送用户第三方登录消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(memberConnectLoginMessage), RocketmqSendCallbackBuilder.commonCallback()); + + return memberTokenGenerate.createToken(member, longTerm); + } catch (Exception e) { + log.error("联合登陆失败:", e); + throw e; + } } /** diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index 272ad84e..6c79c608 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -66,6 +66,7 @@ public class ConnectUtil { /** * 回调地址获取 + * * @param connectAuthEnum 用户枚举 * @return 回调地址 */ @@ -75,9 +76,11 @@ public class ConnectUtil { /** * 登录回调 + * 此方法处理第三方登录回调 + * 场景:PC、WAP(微信公众号) * - * @param type - * @param callback + * @param type 类型 + * @param callback 回调参数 * @param httpServletResponse * @param httpServletRequest * @throws IOException @@ -89,9 +92,8 @@ public class ConnectUtil { //联合登陆处理,如果响应正常,则录入响应结果到redis if (response.ok()) { ConnectAuthUser authUser = response.getData(); - Token token; try { - token = connectService.unionLoginCallback(type, authUser, callback.getState()); + Token token = connectService.unionLoginCallback(authUser, callback.getState()); resultMessage = ResultUtil.data(token); } catch (ServiceException e) { throw new ServiceException(ResultCode.ERROR, e.getMessage()); @@ -112,7 +114,7 @@ public class ConnectUtil { try { httpServletResponse.sendRedirect(url); } catch (Exception e) { - log.error("登录回调错误",e); + log.error("登录回调错误", e); } } @@ -145,7 +147,7 @@ public class ConnectUtil { } AuthRequest authRequest = null; switch (authInterface) { - case WECHAT: { + case WECHAT_WAP: { //寻找配置 Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); @@ -165,6 +167,7 @@ public class ConnectUtil { //寻找配置 Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); + for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { if (wechatConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { authRequest = new BaseAuthWeChatPCRequest(AuthConfig.builder() @@ -178,10 +181,10 @@ public class ConnectUtil { break; } case QQ: - //寻找配置 Setting setting = settingService.get(SettingEnum.QQ_CONNECT.name()); QQConnectSetting qqConnectSetting = JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class); + for (QQConnectSettingItem qqConnectSettingItem : qqConnectSetting.getQqConnectSettingItemList()) { if (qqConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { authRequest = new BaseAuthQQRequest(AuthConfig.builder() diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java index 1b1d8be8..c5eb52a1 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java @@ -15,6 +15,7 @@ import cn.lili.modules.member.entity.vo.QRLoginResultVo; import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.elasticsearch.monitor.os.OsStats; import java.util.List; import java.util.Map; @@ -175,12 +176,12 @@ public interface MemberService extends IService { IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page); - /** - * 一键注册会员 - * - * @return - */ - Token autoRegister(); +// /** +// * 一键注册会员 +// * +// * @return +// */ +// Token autoRegister(); /** * 一键注册会员 @@ -188,7 +189,7 @@ public interface MemberService extends IService { * @param authUser 联合登录用户 * @return Token */ - Token autoRegister(ConnectAuthUser authUser); + Member autoRegister(ConnectAuthUser authUser); /** * 刷新token diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 4060e39c..6031e508 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -224,7 +224,7 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override @Transactional - public Token autoRegister(ConnectAuthUser authUser) { + public Member autoRegister(ConnectAuthUser authUser) { if (CharSequenceUtil.isEmpty(authUser.getNickname())) { authUser.setNickname("临时昵称"); @@ -236,11 +236,11 @@ public class MemberServiceImpl extends ServiceImpl impleme String username = UuidUtils.getUUID(); Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0); - registerHandler(member); member.setPassword(DEFAULT_PASSWORD); - //绑定登录方式 - loginBindUser(member, authUser.getUuid(), authUser.getSource()); - return memberTokenGenerate.createToken(member, false); + // 发送会员注册信息 + registerHandler(member); + + return member; } catch (ServiceException e) { log.error("自动注册服务抛出异常:", e); throw e; @@ -250,12 +250,12 @@ public class MemberServiceImpl extends ServiceImpl impleme } } - @Override - @Transactional - public Token autoRegister() { - ConnectAuthUser connectAuthUser = this.checkConnectUser(); - return this.autoRegister(connectAuthUser); - } +// @Override +// @Transactional +// public Token autoRegister() { +// ConnectAuthUser connectAuthUser = this.checkConnectUser(); +// return this.autoRegister(connectAuthUser); +// } @Override public Token refreshToken(String refreshToken) { @@ -293,7 +293,6 @@ public class MemberServiceImpl extends ServiceImpl impleme //保存会员 this.save(member); - // 发送会员注册信息 applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("new member register", rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_REGISTER.name(), member)); } @@ -557,23 +556,6 @@ public class MemberServiceImpl extends ServiceImpl impleme return null; } - /** - * 成功登录,则检测cookie中的信息,进行会员绑定 - * - * @param member 会员 - * @param unionId unionId - * @param type 状态 - */ - private void loginBindUser(Member member, String unionId, String type) { - Connect connect = connectService.queryConnect( - ConnectQueryDTO.builder().unionId(unionId).unionType(type).build() - ); - if (connect == null) { - connect = new Connect(member.getId(), unionId, type); - connectService.save(connect); - } - } - /** * 成功登录,则检测cookie中的信息,进行会员绑定 * @@ -612,42 +594,42 @@ public class MemberServiceImpl extends ServiceImpl impleme } - /** - * 检测是否可以绑定第三方联合登陆 - * 返回null原因 - * 包含原因1:redis中已经没有联合登陆信息 2:已绑定其他账号 - * - * @return 返回对象则代表可以进行绑定第三方会员,返回null则表示联合登陆无法继续 - */ - private ConnectAuthUser checkConnectUser() { - //获取cookie存储的信息 - String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); - String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); - - //如果联合登陆存储了信息 - if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { - //枚举 联合登陆类型获取 - ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(connectType); - - ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); - if (connectAuthUser == null) { - throw new ServiceException(ResultCode.USER_OVERDUE_CONNECT_ERROR); - } - //检测是否已经绑定过用户 - Connect connect = connectService.queryConnect( - ConnectQueryDTO.builder().unionType(connectType).unionId(connectAuthUser.getUuid()).build() - ); - //没有关联则返回true,表示可以继续绑定 - if (connect == null) { - connectAuthUser.setConnectEnum(authInterface); - return connectAuthUser; - } else { - throw new ServiceException(ResultCode.USER_CONNECT_BANDING_ERROR); - } - } else { - throw new ServiceException(ResultCode.USER_CONNECT_NOT_EXIST_ERROR); - } - } +// /** +// * 检测是否可以绑定第三方联合登陆 +// * 返回null原因 +// * 包含原因1:redis中已经没有联合登陆信息 2:已绑定其他账号 +// * +// * @return 返回对象则代表可以进行绑定第三方会员,返回null则表示联合登陆无法继续 +// */ +// private ConnectAuthUser checkConnectUser() { +// //获取cookie存储的信息 +// String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); +// String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); +// +// //如果联合登陆存储了信息 +// if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { +// //枚举 联合登陆类型获取 +// ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(connectType); +// +// ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); +// if (connectAuthUser == null) { +// throw new ServiceException(ResultCode.USER_OVERDUE_CONNECT_ERROR); +// } +// //检测是否已经绑定过用户 +// Connect connect = connectService.queryConnect( +// ConnectQueryDTO.builder().unionType(connectType).unionId(connectAuthUser.getUuid()).build() +// ); +// //没有关联则返回true,表示可以继续绑定 +// if (connect == null) { +// connectAuthUser.setConnectEnum(authInterface); +// return connectAuthUser; +// } else { +// throw new ServiceException(ResultCode.USER_CONNECT_BANDING_ERROR); +// } +// } else { +// throw new ServiceException(ResultCode.USER_CONNECT_NOT_EXIST_ERROR); +// } +// } @Override public long getMemberNum(MemberSearchVO memberSearchVO) { diff --git a/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java index bda332b7..2781da0a 100644 --- a/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java +++ b/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java @@ -30,7 +30,11 @@ public enum MemberTagsEnum { /** * 会员积分变动 */ - MEMBER_POINT_CHANGE("会员积分变动"); + MEMBER_POINT_CHANGE("会员积分变动"), + /** + * 会员使用联合登录 + */ + MEMBER_CONNECT_LOGIN("会员使用联合登录"); private final String description; From 6f746e3aff5a6c8bea2097bbf84eb547c4da99d9 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Wed, 8 Mar 2023 19:44:06 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E8=BF=9B=E8=A1=8C=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kit/plugin/wechat/WechatPlugin.java | 32 +++++++++++++++++-- .../system/entity/dto/WithdrawalSetting.java | 2 +- .../system/entity/vo/WithdrawalSettingVO.java | 4 +++ .../wechat/util/WechatMessageUtil.java | 3 +- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java index a4cbbd4e..9601eb25 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java @@ -18,6 +18,7 @@ import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dto.ConnectQueryDTO; import cn.lili.modules.order.order.service.OrderService; @@ -40,6 +41,8 @@ import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.WithdrawalSetting; +import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; +import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; @@ -47,6 +50,7 @@ import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.atp.Switch; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -380,7 +384,7 @@ public class WechatPlugin implements Payment { try { Connect connect = connectService.queryConnect( - ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(ConnectEnum.WECHAT_MP_OPEN_ID.name()).build() + ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(SourceEnum.WECHAT_MP_OPEN_ID.name()).build() ); if (connect == null) { return null; @@ -478,16 +482,38 @@ public class WechatPlugin implements Payment { */ @Override public boolean transfer(MemberWithdrawApply memberWithdrawApply) { - try { //获取提现设置 WithdrawalSetting withdrawalSetting = new Gson().fromJson(settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()).getSettingValue(), WithdrawalSetting.class); + + //获取用户OPENID + WechatConnectSetting wechatConnectSetting = new Gson().fromJson(settingService.get(SettingEnum.WECHAT_CONNECT.name()).getSettingValue(), WechatConnectSetting.class); + String source = ""; + for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { + if (wechatConnectSettingItem.getAppId().equals(withdrawalSetting.getWechatAppId())) { + switch (wechatConnectSettingItem.getClientType()) { + case "PC": + source = SourceEnum.WECHAT_PC_OPEN_ID.name(); + break; + case "H5": + source = SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name(); + break; + case "MP": + source = SourceEnum.WECHAT_MP_OPEN_ID.name(); + break; + case "APP": + source = SourceEnum.WECHAT_APP_OPEN_ID.name(); + break; + } + } + } + //获取微信设置 WechatPaymentSetting wechatPaymentSetting = wechatPaymentSetting(); //获取用户openId Connect connect = connectService.queryConnect( ConnectQueryDTO.builder().userId(memberWithdrawApply.getMemberId()) - .unionType(ConnectEnum.WECHAT_OPEN_ID.name()).build() + .unionType(source).build() ); //构建提现,发起申请 TransferModel transferModel = new TransferModel() diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java index bb916e2c..76b7737c 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java @@ -32,7 +32,7 @@ public class WithdrawalSetting implements Serializable { private Boolean apply; /** - * 微信提现使用的APPID + * 微信提现-渠道使用的APPID */ private String wechatAppId; /** diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java index 2c1d9545..813ac13c 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java @@ -1,5 +1,6 @@ package cn.lili.modules.system.entity.vo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -14,14 +15,17 @@ public class WithdrawalSettingVO { /** * 提现最低金额 */ + @ApiModelProperty(value = "minPrice") private Double minPrice; /** * 提现手续费 */ + @ApiModelProperty(value = "提现手续费") private Double fee; /** * 提现类型 WECHAT\ALI */ + @ApiModelProperty(value = "提现类型 WECHAT、ALI") private String type; } diff --git a/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java index da0dfc45..311fc66e 100644 --- a/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java +++ b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java @@ -11,6 +11,7 @@ import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.StringUtils; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dto.ConnectQueryDTO; import cn.lili.modules.order.order.entity.dos.Order; @@ -146,7 +147,7 @@ public class WechatMessageUtil { } Connect connect = connectService.queryConnect( - ConnectQueryDTO.builder().userId(order.getMemberId()).unionType(ConnectEnum.WECHAT_MP_OPEN_ID.name()).build() + ConnectQueryDTO.builder().userId(order.getMemberId()).unionType(SourceEnum.WECHAT_MP_OPEN_ID.name()).build() ); if (connect == null) { return; From f506fa86ccc813a1f4badf9f789b5c2bc5d7a0a0 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Thu, 9 Mar 2023 15:39:50 +0800 Subject: [PATCH 04/10] =?UTF-8?q?APP=E7=AC=AC=E4=B8=89=E6=96=B9=E4=BF=A1?= =?UTF-8?q?=E4=BB=BB=E7=99=BB=E5=BD=95=E9=80=9A=E8=BF=87unionid=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectBuyerWebController.java | 17 ++------- .../cn/lili/event/impl/MemberExecute.java | 8 +++- .../cn/lili/common/enums/ClientTypeEnum.java | 2 +- .../connect/entity/dto/ConnectAuthUser.java | 6 +-- .../connect/entity/enums/SourceEnum.java | 38 +++++++++++++++++++ .../connect/request/BaseAuthQQRequest.java | 7 +++- .../request/BaseAuthWeChatPCRequest.java | 8 ++-- .../request/BaseAuthWeChatRequest.java | 7 ++-- .../serviceimpl/ConnectServiceImpl.java | 28 ++++++++------ 9 files changed, 80 insertions(+), 41 deletions(-) diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index af2eec2b..ddc5629d 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -75,25 +75,14 @@ public class ConnectBuyerWebController { return connectUtil.getResult(state); } -// @GetMapping("/register/auto") -// @ApiOperation(value = "WEB信任登录授权") -// public ResultMessage webAuthorize() { -// Token token = memberService.autoRegister(); -// return ResultUtil.data(token); -// } - - @ApiOperation(value = "unionID登录") - @ApiImplicitParams({ - @ApiImplicitParam(name = "openId", value = "openid", required = true, paramType = "query"), - @ApiImplicitParam(name = "type", value = "联合类型", required = true, - allowableValues = "WECHAT,QQ,ALIPAY,WEIBO,APPLE", paramType = "query"), - @ApiImplicitParam(name = "uniAccessToken", value = "联合登陆返回的accessToken", required = true, paramType = "query") - }) + @ApiOperation(value = "APP-unionID登录") @GetMapping("/app/login") public ResultMessage unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { try { + System.out.println(1); return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid)); } catch (Exception e) { + e.printStackTrace(); log.error("unionID登录错误", e); } return null; diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java index 6fc02177..1ec23a5b 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java @@ -1,9 +1,12 @@ package cn.lili.event.impl; import cn.hutool.core.util.StrUtil; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.event.MemberConnectLoginEvent; import cn.lili.event.MemberLoginEvent; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; @@ -38,11 +41,12 @@ public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent //保存UnionID if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { - connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getType()); + connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getSource()); } //保存OpenID if (StrUtil.isNotBlank(authUser.getUuid())) { - connectService.loginBindUser(member.getId(), authUser.getUuid(), authUser.getType()); + SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getSource()), ClientTypeEnum.valueOf(authUser.getType())); + connectService.loginBindUser(member.getId(), authUser.getUuid(), sourceEnum.name()); } } diff --git a/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java b/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java index 78bbdf75..6ba9190f 100644 --- a/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java +++ b/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java @@ -31,7 +31,7 @@ public enum ClientTypeEnum { */ UNKNOWN("未知"); - private final String clientName; + private String clientName; ClientTypeEnum(String des) { this.clientName = des; diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java index 66373c55..a3b011d3 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java @@ -67,11 +67,7 @@ public class ConnectAuthUser implements Serializable { * 用户来源 */ private String source; - /** - * 用户来源 - * 例如:微信、支付宝、微博 - */ - private String source1; + /** * 类型 * 例如:PC、WAP、小程序 diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java index 685468f7..847db2c7 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java @@ -1,5 +1,7 @@ package cn.lili.modules.connect.entity.enums; +import cn.lili.common.enums.ClientTypeEnum; + /** * 联合登陆-渠道枚举 * @@ -13,6 +15,12 @@ public enum SourceEnum { WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"), WECHAT_MP_OPEN_ID("微信小程序 openid登录"), WECHAT_APP_OPEN_ID("微信APP openid登录"), + + QQ_APP_OPEN_ID("QQ APP openid登录"), + QQ_PC_OPEN_ID("QQ PC应用 openid登录"), + QQ_H5_OPEN_ID("QQ H5应用 openid登录"), + + APPLE_OPEN_ID("苹果 openid登录"), ; @@ -21,4 +29,34 @@ public enum SourceEnum { SourceEnum(String description) { this.description = description; } + + public static SourceEnum getSourceEnum(ConnectEnum source, ClientTypeEnum type) { + switch (source) { + case WECHAT: + switch (type) { + case APP: + return WECHAT_APP_OPEN_ID; + case WECHAT_MP: + return WECHAT_MP_OPEN_ID; + case PC: + return WECHAT_PC_OPEN_ID; + case H5: + return WECHAT_OFFIACCOUNT_OPEN_ID; + } + break; + case QQ: + switch (type) { + case APP: + return QQ_APP_OPEN_ID; + case PC: + return QQ_PC_OPEN_ID; + case H5: + return QQ_H5_OPEN_ID; + } + break; + case APPLE: + return APPLE_OPEN_ID; + } + return null; + } } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java index 3578f157..4cf53b78 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java @@ -2,6 +2,8 @@ package cn.lili.modules.connect.request; import cn.hutool.core.convert.Convert; import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; @@ -12,9 +14,9 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.GlobalAuthUtils; -import cn.lili.common.utils.HttpUtils; import com.alibaba.fastjson.JSONObject; import java.util.Map; @@ -67,7 +69,8 @@ public class BaseAuthQQRequest extends BaseAuthRequest { .uuid(openId) .gender(AuthUserGender.getRealGender(object.getString("gender"))) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.QQ.name()) + .type(ClientTypeEnum.PC.name()) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java index 615fee93..36f68f56 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java @@ -1,6 +1,8 @@ package cn.lili.modules.connect.request; import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -13,7 +15,6 @@ import cn.lili.modules.connect.entity.enums.AuthUserGender; import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; -import cn.lili.common.utils.HttpUtils; import com.alibaba.fastjson.JSONObject; /** @@ -61,8 +62,8 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest { .uuid(authToken.getOpenId()) .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) - .source(source.toString()) - .source1(ConnectEnum.WECHAT.name()) + .source(ConnectEnum.WECHAT.name()) + .type(ClientTypeEnum.H5.name()) .type(SourceEnum.WECHAT_PC_OPEN_ID.name()) .build(); } @@ -116,6 +117,7 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest { */ @Override public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) .queryParam("response_type", "code") .queryParam("appid", config.getClientId()) diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index f703f937..a430101f 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -1,6 +1,8 @@ package cn.lili.modules.connect.request; import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -14,7 +16,6 @@ import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.GlobalAuthUtils; -import cn.lili.common.utils.HttpUtils; import com.alibaba.fastjson.JSONObject; /** @@ -63,8 +64,8 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest { .uuid(openId) .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) - .source(source.toString()) - .source1(ConnectEnum.WECHAT.name()) + .source(ConnectEnum.WECHAT.name()) + .type(ClientTypeEnum.H5.name()) .type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index e8888c9a..b75f55cc 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -1,26 +1,25 @@ package cn.lili.modules.connect.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; -import cn.lili.common.context.ThreadContextHolder; import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; -import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.token.Token; -import cn.lili.common.utils.CookieUtil; import cn.lili.common.utils.HttpUtils; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.mapper.ConnectMapper; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dos.Member; @@ -33,7 +32,6 @@ import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -41,7 +39,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -53,7 +50,6 @@ import java.nio.charset.StandardCharsets; import java.security.AlgorithmParameters; import java.security.Security; import java.util.*; -import java.util.concurrent.TimeUnit; /** * 联合登陆接口实现 @@ -88,7 +84,6 @@ public class ConnectServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) { - return this.unionLoginCallback(authUser, false); } @@ -249,11 +244,20 @@ public class ConnectServiceImpl extends ServiceImpl impl */ private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) { - //使用UnionId登录 + try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(Connect::getUnionId, authUser.getToken().getUnionId()) - .eq(Connect::getUnionType, authUser.getSource1()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + //使用UnionId登录 + if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { + queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId()) + .eq(Connect::getUnionType, authUser.getSource()); + } else { + //使用OpenID登录 + SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getType()), ClientTypeEnum.valueOf(authUser.getSource())); + queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId()) + .eq(Connect::getUnionType, sourceEnum.name()); + } + //查询绑定关系 Connect connect = this.getOne(queryWrapper); Member member = new Member(); @@ -353,4 +357,6 @@ public class ConnectServiceImpl extends ServiceImpl impl } throw new ServiceException(ResultCode.USER_CONNECT_ERROR); } + + } \ No newline at end of file From 0261b7e9abcf8818895be57b2f80b02cf042ee6e Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 06:20:14 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=B5=8B?= =?UTF-8?q?=E5=80=BCunionId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/modules/connect/serviceimpl/ConnectServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index b75f55cc..e01b65c5 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -15,6 +15,7 @@ import cn.lili.common.security.context.UserContext; import cn.lili.common.security.token.Token; import cn.lili.common.utils.HttpUtils; import cn.lili.modules.connect.entity.Connect; +import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; @@ -186,6 +187,10 @@ public class ConnectServiceImpl extends ServiceImpl impl connectAuthUser.setAvatar(params.getImage()); connectAuthUser.setUsername("m" + phone); connectAuthUser.setPhone(phone); + + AuthToken authToken=new AuthToken(); + authToken.setUnionId(unionId); + connectAuthUser.setToken(authToken); return this.unionLoginCallback(connectAuthUser, true); } catch (Exception e) { e.printStackTrace(); From 606f9d2ccf1e8b08c27c48fbb0c03450e3d1dbd6 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 06:46:21 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E7=99=BB=E5=BD=95=EF=BC=8C=E5=88=A4=E6=96=AD=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=B8=BA=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/lili/event/impl/MemberExecute.java | 7 ++++++- .../modules/connect/serviceimpl/ConnectServiceImpl.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java index 1ec23a5b..27ce3bf7 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java @@ -11,6 +11,7 @@ import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,6 +23,7 @@ import org.springframework.stereotype.Service; * @version v1.0 * 2022-01-11 11:08 */ +@Slf4j @Service public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent { @Autowired @@ -38,13 +40,16 @@ public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent @Override public void memberConnectLogin(Member member, ConnectAuthUser authUser) { - + log.info("unionid:"+authUser.getToken().getUnionId()); + log.info("openid:"+authUser.getUuid()); //保存UnionID if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getSource()); } //保存OpenID if (StrUtil.isNotBlank(authUser.getUuid())) { + log.info("authUser.getSource():"+authUser.getSource()); + log.info("authUser.getType():"+authUser.getType()); SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getSource()), ClientTypeEnum.valueOf(authUser.getType())); connectService.loginBindUser(member.getId(), authUser.getUuid(), sourceEnum.name()); } diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index e01b65c5..ed8ee89d 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -188,7 +188,7 @@ public class ConnectServiceImpl extends ServiceImpl impl connectAuthUser.setUsername("m" + phone); connectAuthUser.setPhone(phone); - AuthToken authToken=new AuthToken(); + AuthToken authToken = new AuthToken(); authToken.setUnionId(unionId); connectAuthUser.setToken(authToken); return this.unionLoginCallback(connectAuthUser, true); @@ -227,9 +227,14 @@ public class ConnectServiceImpl extends ServiceImpl impl Connect connect = this.queryConnect( ConnectQueryDTO.builder().unionId(unionId).unionType(type).build() ); + //如果未绑定则直接绑定 if (connect == null) { connect = new Connect(userId, unionId, type); this.save(connect); + //如果已绑定不是当前用户信息则删除绑定信息,重新绑定 + } else if (!connect.getUserId().equals(userId)) { + this.removeById(connect.getId()); + this.loginBindUser(userId, unionId, type); } } From 72f63e7e316b10c9f75f0449934a25afbb4c3c44 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 07:14:23 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95(=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=EF=BC=89=E9=87=8D=E5=A4=8D=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/modules/connect/request/BaseAuthWeChatPCRequest.java | 3 +-- .../cn/lili/modules/connect/request/BaseAuthWeChatRequest.java | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java index 36f68f56..43aa3e06 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java @@ -63,8 +63,7 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest { .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) .source(ConnectEnum.WECHAT.name()) - .type(ClientTypeEnum.H5.name()) - .type(SourceEnum.WECHAT_PC_OPEN_ID.name()) + .type(ClientTypeEnum.PC.name()) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index a430101f..c915d956 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -66,7 +66,6 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest { .token(authToken) .source(ConnectEnum.WECHAT.name()) .type(ClientTypeEnum.H5.name()) - .type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()) .build(); } From 256f2ba4804e47d58daf6c48c3402b7c8dff88ec Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 07:25:06 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=BE=AE=E4=BF=A1-=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E7=99=BB=E5=BD=95=EF=BC=8C=E8=BF=98=E5=8E=9F=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/lili/modules/connect/config/ConnectAuthEnum.java | 2 +- .../cn/lili/modules/connect/request/BaseAuthWeChatRequest.java | 2 +- .../src/main/java/cn/lili/modules/connect/util/ConnectUtil.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java index 201c49b2..009e4482 100644 --- a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java @@ -13,7 +13,7 @@ public enum ConnectAuthEnum implements ConnectAuth { /** * 微信公众号登录 */ - WECHAT_WAP { + WECHAT { @Override public String authorize() { return "https://open.weixin.qq.com/connect/oauth2/authorize"; diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index c915d956..283a07f5 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -26,7 +26,7 @@ import com.alibaba.fastjson.JSONObject; */ public class BaseAuthWeChatRequest extends BaseAuthRequest { public BaseAuthWeChatRequest(AuthConfig config, Cache cache) { - super(config, ConnectAuthEnum.WECHAT_WAP, cache); + super(config, ConnectAuthEnum.WECHAT, cache); } /** diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index 6c79c608..c2f9c5d5 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -147,7 +147,7 @@ public class ConnectUtil { } AuthRequest authRequest = null; switch (authInterface) { - case WECHAT_WAP: { + case WECHAT: { //寻找配置 Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); From 7e1b7f2725d8e55f33ef382a8b0419051de3f998 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 07:32:30 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/modules/connect/serviceimpl/ConnectServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index ed8ee89d..46c0c5b3 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -187,6 +187,8 @@ public class ConnectServiceImpl extends ServiceImpl impl connectAuthUser.setAvatar(params.getImage()); connectAuthUser.setUsername("m" + phone); connectAuthUser.setPhone(phone); + connectAuthUser.setSource(ConnectEnum.WECHAT.name()); + connectAuthUser.setType(ClientTypeEnum.WECHAT_MP.name()); AuthToken authToken = new AuthToken(); authToken.setUnionId(unionId); @@ -231,7 +233,7 @@ public class ConnectServiceImpl extends ServiceImpl impl if (connect == null) { connect = new Connect(userId, unionId, type); this.save(connect); - //如果已绑定不是当前用户信息则删除绑定信息,重新绑定 + //如果已绑定不是当前用户信息则删除绑定信息,重新绑定 } else if (!connect.getUserId().equals(userId)) { this.removeById(connect.getId()); this.loginBindUser(userId, unionId, type); From 674e585eff666243ea02ada73711c35efcc7829f Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Fri, 10 Mar 2023 07:45:56 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/passport/connect/ConnectBuyerWebController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index ddc5629d..bbe988ea 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -79,7 +79,6 @@ public class ConnectBuyerWebController { @GetMapping("/app/login") public ResultMessage unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { try { - System.out.println(1); return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid)); } catch (Exception e) { e.printStackTrace();