From c3d5fb8eab40b2257df4d6d5384a23cf12032446 Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期六, 17 八月 2024 13:59:13 +0800 Subject: [PATCH] 微信小程序登录,获取用户信息 --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java | 67 +++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java | 58 ++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java | 4 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java | 2 ruoyi-service/ruoyi-account/pom.xml | 6 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java | 10 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxUtils.java | 175 ++++++++++++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/model/AliProperties.java | 70 +++++ ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java | 10 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/Constant/AliConstant.java | 10 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java | 91 +++++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java | 3 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java | 79 ++++++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java | 37 +++ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java | 35 -- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java | 2 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java | 2 23 files changed, 623 insertions(+), 50 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java index bd1a6e3..a7161a4 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java @@ -28,7 +28,7 @@ private Long userId; /** - * 用户名 + * 用户手机号 */ private String phone; /** @@ -45,4 +45,12 @@ * 登录IP地址 */ private String ipaddr; + /** + * 头像 + */ + private String avatar; + /** + * 地址 + */ + private String address; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java new file mode 100644 index 0000000..dad1f6e --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java @@ -0,0 +1,79 @@ +package com.ruoyi.system.api.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.web.domain.BasePojo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * <p> + * + * </p> + * + * @author luodangjia + * @since 2024-08-06 + */ +@Data +public class TAppUserLoginInfo extends BasePojo { + + private static final long serialVersionUID = 1L; + private Long id; + + @ApiModelProperty(value = "用户") + private String name; + + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "会员id") + private Integer vipId; + + @ApiModelProperty(value = "会员到期时间") + private LocalDateTime vipEndTime; + + @ApiModelProperty(value = "单位id") + private Integer companyId; + + @ApiModelProperty(value = "身份证号") + private String idCard; + + @ApiModelProperty(value = "认证状态(0=否,1=是)") + private Integer authStatus; + + @ApiModelProperty(value = "微信openid") + private String wxOpenid; + + @ApiModelProperty(value = "支付宝openid") + private String aliOpenid; + + @ApiModelProperty(value = "积分") + private Integer points; + + @ApiModelProperty(value = "省名称") + private String province; + + @ApiModelProperty(value = "省区划代码") + private String provinceCode; + + @ApiModelProperty(value = "市名称") + private String city; + + @ApiModelProperty(value = "市区划代码") + private String cityCode; + + @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)") + private Integer status; + + @ApiModelProperty(value = "最后一次登录时间") + private LocalDateTime lastLoginTime; + +} diff --git a/ruoyi-service/ruoyi-account/pom.xml b/ruoyi-service/ruoyi-account/pom.xml index 435d4bc..0390101 100644 --- a/ruoyi-service/ruoyi-account/pom.xml +++ b/ruoyi-service/ruoyi-account/pom.xml @@ -137,6 +137,12 @@ <scope>compile</scope> </dependency> + <dependency> + <groupId>com.alipay.sdk</groupId> + <artifactId>alipay-sdk-java</artifactId> + <version>4.38.10.ALL</version> + </dependency> + </dependencies> <build> diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/Constant/AliConstant.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/Constant/AliConstant.java new file mode 100644 index 0000000..8cb6198 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/Constant/AliConstant.java @@ -0,0 +1,10 @@ +package com.ruoyi.account.ali.Constant; + +public class AliConstant { + + /** + * 支付宝配置 + */ + public static final String GRANT_TYPE = "authorization_code"; + +} diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/model/AliProperties.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/model/AliProperties.java new file mode 100644 index 0000000..679e7dc --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/model/AliProperties.java @@ -0,0 +1,70 @@ +package com.ruoyi.account.ali.model; + +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author xiaochen + * @ClassName ALiProperties + * @Description + * @date 2024-08-14 13:55 + */ +@ToString +@Component +@ConfigurationProperties(prefix = "ali.conf") +public class AliProperties { + + + /** + * 商户私钥,您的PKCS8格式RSA2私钥 + */ + private String privateKey; + /** + * 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 + */ + private String alipayPublicKey; + /** + * 应用ID,您的APPID。 + */ + private String appId; + + /** + * HTTP(S) 连接超时时间,单位毫秒 + * + */ + public int getHttpConnectTimeoutMs() { + return 6 * 1000; + } + + /** + * HTTP(S) 读数据超时时间,单位毫秒 + */ + public int getHttpReadTimeoutMs() { + return 8 * 1000; + } + + public String getPrivateKey() { + return privateKey; + } + + public void setPrivateKey(String privateKey) { + this.privateKey = privateKey; + } + + public String getAlipayPublicKey() { + return alipayPublicKey; + } + + public void setAlipayPublicKey(String alipayPublicKey) { + this.alipayPublicKey = alipayPublicKey; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } +} diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java new file mode 100644 index 0000000..52d54d7 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java @@ -0,0 +1,37 @@ +package com.ruoyi.account.ali.tools; + +import com.alipay.api.AlipayConfig; +import com.ruoyi.account.ali.model.AliProperties; +import lombok.extern.slf4j.Slf4j; + +/** + * @author xiaochen + * @ClassName WxAppletTools + * @Description + * @date 2024-8-04 13:55 + */ +@Slf4j +public class AliAppletTools { + + private static final String SERVER_URL = "https://openapi.alipay.com/gateway.do"; + + private AliProperties aliProperties; + + public AliAppletTools(AliProperties aliProperties) { + this.aliProperties = aliProperties; + } + + /** + * 初始化支付宝配置 + * @return + */ + public AlipayConfig getAlipayConfig() { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl(SERVER_URL); + alipayConfig.setAppId(aliProperties.getAppId()); + alipayConfig.setPrivateKey(aliProperties.getPrivateKey()); + alipayConfig.setAlipayPublicKey(aliProperties.getAlipayPublicKey()); + return alipayConfig; + } + +} diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java new file mode 100644 index 0000000..b574502 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java @@ -0,0 +1,91 @@ +package com.ruoyi.account.controller; + +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.diagnosis.DiagnosisUtils; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import com.alipay.api.response.AlipaySystemOauthTokenResponse; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.account.ali.Constant.AliConstant; +import com.ruoyi.account.ali.model.AliProperties; +import com.ruoyi.account.ali.tools.AliAppletTools; +import com.ruoyi.account.api.model.TAppUser; +import com.ruoyi.account.service.TAppUserService; +import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.system.api.model.LoginUserApplet; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * <p> + * 支付宝小程序登录 前端控制器 + * </p> + * + * @author xiaochen + * @since 2024-08-06 + */ +@Slf4j +@RestController +@RequestMapping("/aliLogin") +public class AliLoginController { + + @Autowired + private AliProperties aliProperties; + @Autowired + private TAppUserService appUserService; + @Autowired + private TokenService tokenService; + @ApiOperation(value = "通过code获得openid",tags = {"支付宝小程序登录"}) + @GetMapping("/openIdByJsCode") + public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestParam(name = "code")@ApiParam(value = "code", required = true) String code) throws AlipayApiException { + log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", code); + // 初始化SDK + AlipayClient alipayClient = new DefaultAlipayClient(new AliAppletTools(aliProperties).getAlipayConfig()); + // 构造请求参数以调用接口 + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + // 设置授权码 + request.setCode(code); + // 设置授权方式 + request.setGrantType(AliConstant.GRANT_TYPE); + AlipaySystemOauthTokenResponse response = alipayClient.execute(request); + TAppUser appUser = null; + if (response.isSuccess()) { + String openId = response.getOpenId(); + appUser = appUserService.getOne(Wrappers.lambdaQuery(TAppUser.class).eq(TAppUser::getAliOpenid, openId).last("limit 1")); + if (Objects.isNull(appUser)) { + appUser = new TAppUser(); + appUser.setWxOpenid(openId); + appUserService.save(appUser); + } + log.info("支付宝小程序登录调用成功"); + } else { + String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); + log.warn("诊断结果:{}",diagnosisUrl); + throw new ServiceException("支付宝小程序登录失败"); + } + LoginUserApplet loginUserApplet = new LoginUserApplet(); + if(ObjectUtils.isNotNull(appUser)){ + loginUserApplet.setUserId(appUser.getId()); + } + HashMap<String, Object> tokenInfos = new HashMap<>(); + tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); + tokenInfos.put("info",loginUserApplet); + return AjaxResult.ok(tokenInfos); + } + +} diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java index 0a12801..217799e 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java @@ -78,41 +78,6 @@ @Resource private ExchangeOrderClient exchangeOrderClient; - @Autowired - private TokenService tokenService; - @Autowired - private RedisService redisService; - @Autowired - private WeixinProperties wxConfig; - @Autowired - private RestTemplate wxRestTemplate; - @ApiOperation(value = "通过code获得openid, 1 --->对应的appid:wx4c405fa42539fc21 2---->对应的appid:wx02d9f6c92e6d3c86") - @GetMapping("openId-by-jscode2session/{code}") - public AjaxResult<Map<String, Object>> jscode2session(@PathVariable String code) { - log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", code); - WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig); - Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(code)); - String openid = body.getOpenid(); - String sessionKey = body.getSessionKey(); - TAppUser appUser = appUserService.getOne(Wrappers.lambdaQuery(TAppUser.class).eq(TAppUser::getWxOpenid, openid).last("limit 1")); - if (Objects.isNull(appUser)) { - appUser = new TAppUser(); - appUser.setWxOpenid(openid); - appUserService.save(appUser); - } - // 提前对sessionKey进行删除 - log.info("换取sessionKey:{}", sessionKey); - // 将sessionKey进行存储,后续获取信息需要 - redisService.setCacheObject(openid, sessionKey); - LoginUserApplet loginUserApplet = new LoginUserApplet(); - if(ObjectUtils.isNotNull(appUser)){ - loginUserApplet.setUserId(appUser.getId()); - } - HashMap<String, Object> tokenInfos = new HashMap<>(); - tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); - tokenInfos.put("info",loginUserApplet); - return AjaxResult.ok(tokenInfos); - } @ApiOperation(value = "管理后台-根据手机号查询用户ids", tags = {"管理后台-活动费用统计"}) @PostMapping(value = "/user/getUserIdsByPhone") diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java new file mode 100644 index 0000000..e3444f7 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java @@ -0,0 +1,67 @@ +package com.ruoyi.account.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.account.api.model.TAppUser; +import com.ruoyi.account.service.TAppUserService; +import com.ruoyi.account.wx.body.resp.Code2SessionRespBody; +import com.ruoyi.account.wx.body.resq.Code2SessionResqBody; +import com.ruoyi.account.wx.model.WeixinProperties; +import com.ruoyi.account.wx.pojo.AppletUserDecodeData; +import com.ruoyi.account.wx.pojo.AppletUserEncrypteData; +import com.ruoyi.account.wx.tools.WxAppletTools; +import com.ruoyi.account.wx.tools.WxUtils; +import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.system.api.model.LoginUserApplet; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +/** + * <p> + * 微信小程序登录 前端控制器 + * </p> + * + * @author xiaochen + * @since 2024-08-06 + */ +@Slf4j +@RestController +@RequestMapping("/wxLogin") +public class WxLoginController { + @Autowired + private TAppUserService appUserService; + @Autowired + private WeixinProperties wxConfig; + @Autowired + private RestTemplate wxRestTemplate; + @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"}) + @PostMapping("/openIdByJsCode") + public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) { + log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode()); + WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig); + Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode())); + String openid = body.getOpenid(); + String sessionKey = body.getSessionKey(); + // 用户信息解密 数据验签 + if (StringUtils.isNotBlank(data.getSignature())) { + WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature()); + } + AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey, data.getIv()); + appletUserDecodeData.setOpenId(openid); + return AjaxResult.ok(appUserService.login(appletUserDecodeData)); + } +} diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java index 600895f..11fec43 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java @@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.TAppUser; +import com.ruoyi.account.wx.pojo.AppletUserDecodeData; + +import java.util.Map; /** * <p> @@ -13,4 +16,11 @@ */ public interface TAppUserService extends IService<TAppUser> { + /** + * 微信小程序登录用户封装 + * @param appletUserDecodeData + * @return + */ + Map<String, Object> login(AppletUserDecodeData appletUserDecodeData); + } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java index 3e3b665..912a5e0 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java @@ -1,10 +1,23 @@ package com.ruoyi.account.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.mapper.TAppUserMapper; import com.ruoyi.account.service.TAppUserService; +import com.ruoyi.account.wx.model.WeixinProperties; +import com.ruoyi.account.wx.pojo.AppletUserDecodeData; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.system.api.model.LoginUserApplet; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; /** * <p> @@ -16,5 +29,48 @@ */ @Service public class TAppUserServiceImpl extends ServiceImpl<TAppUserMapper, TAppUser> implements TAppUserService { - + @Autowired + private TokenService tokenService; + @Override + public Map<String, Object> login(AppletUserDecodeData appletUserDecodeData) { + // 通过手机号查询用户,是否已存在手动导入用户 + TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class) + .eq(TAppUser::getPhone, appletUserDecodeData.getPhoneNumber()) + .isNull(TAppUser::getWxOpenid) + .last("LIMIT 1")); + LambdaQueryWrapper<TAppUser> wrapper = Wrappers.lambdaQuery(TAppUser.class) + .eq(TAppUser::getWxOpenid, appletUserDecodeData.getOpenId()); + if(Objects.isNull(appUser)){ + // 先使用openId和当前手机号进行查询 + wrapper.eq(TAppUser::getPhone, appletUserDecodeData.getPhoneNumber()) + .last("LIMIT 1"); + appUser = this.getOne(wrapper); + if(Objects.isNull(appUser)){ + appUser = new TAppUser(); + appUser.setPhone(appletUserDecodeData.getPhoneNumber()); + } + }else { + wrapper.last("LIMIT 1"); + // 删除小程序原有授权用户 + this.remove(wrapper); + } + appUser.setAvatar(appletUserDecodeData.getAvatarUrl()); + appUser.setCity(appletUserDecodeData.getCity()); + appUser.setName(appletUserDecodeData.getNickName()); + appUser.setProvince(appletUserDecodeData.getProvince()); + appUser.setWxOpenid(appletUserDecodeData.getOpenId()); + this.saveOrUpdate(appUser); + LoginUserApplet loginUserApplet = new LoginUserApplet(); + if(ObjectUtils.isNotNull(appUser)){ + loginUserApplet.setUserId(appUser.getId()); + loginUserApplet.setName(appUser.getName()); + loginUserApplet.setPhone(appUser.getPhone()); + loginUserApplet.setAvatar(appUser.getAvatar()); + loginUserApplet.setAddress(appUser.getProvince()+appUser.getCity()); + } + Map<String, Object> tokenInfos = new HashMap<>(); + tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet)); + tokenInfos.put("info",loginUserApplet); + return tokenInfos; + } } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java index 01d0d17..abc6b3c 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/AccessTokenRespBody.java @@ -9,7 +9,7 @@ /** * AccessToken 全局唯一 * - * @author liheng + * @author xiaochen */ @Data public class AccessTokenRespBody extends RespBody implements Serializable { diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java index 8e4747e..0dcd69a 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/Code2SessionRespBody.java @@ -4,7 +4,7 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName Code2SessionRespBody * @Description * @date 2021-07-28 12:35 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java index ebbbf09..4056d18 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resp/RespBody.java @@ -4,7 +4,7 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName RespBody * @Description * @date 2021-07-28 11:44 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java index 0eaf985..193f47f 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/body/resq/Code2SessionResqBody.java @@ -4,7 +4,7 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName Code2SessionResqBody * @Description * @date 2021-07-28 11:47 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java index 6817942..8e48fcc 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletPhoneEncrypteData.java @@ -3,7 +3,7 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName AppletUserDecodeData * @Description * @date 2021-08-13 17:46 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java index 6f42090..6040fe9 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserDecodeData.java @@ -3,10 +3,9 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName AppletUserDecodeData * @Description - * @date 2021-08-13 17:46 * 用户主体信息部分 * { * "openId": "OPENID", diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java index 18d8970..45884a8 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/pojo/AppletUserEncrypteData.java @@ -3,10 +3,9 @@ import lombok.Data; /** - * @author liheng + * @author xiaochen * @ClassName AppletUserDecodeData * @Description - * @date 2021-08-13 17:46 * 小程序加密数据体 * */ @@ -14,4 +13,5 @@ public class AppletUserEncrypteData extends AppletPhoneEncrypteData { private String rawData; private String signature; + private String code; } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java index f1fb657..69966eb 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WebUtils.java @@ -8,7 +8,7 @@ import javax.servlet.http.HttpSession; /** - * @Author liheng + * @Author xiaochen * @Date 2019/08/26 10:28 AM * @Description */ diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java index 23382ad..a8b3560 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCache.java @@ -5,7 +5,7 @@ /** * 缓存 * - * @author liheng + * @author xiaochen */ class WxCache { /** diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java index 39157a9..fa43614 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCacheTemplate.java @@ -1,7 +1,7 @@ package com.ruoyi.account.wx.tools; /** - * @author liheng + * @author xiaochen * @ClassName WxCacheTemplate * @Description * @date 2021-01-11 11:27 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java index f23973e..5c40a14 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java @@ -7,7 +7,7 @@ import java.util.concurrent.TimeUnit; /** - * @author liheng + * @author xiaochen * @ClassName AbstractCaffineCache * @Description * @date 2021-01-11 11:27 diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxUtils.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxUtils.java new file mode 100644 index 0000000..47bd8c8 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxUtils.java @@ -0,0 +1,175 @@ +package com.ruoyi.account.wx.tools; + +import com.ruoyi.account.wx.pojo.AppletUserDecodeData; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.CharEncoding; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.AlgorithmParameters; +import java.security.Security; +import java.util.Arrays; + +/** + * @Description 获取用户信息工具类 + * @Author xiaochen + * @Date 2021/8/12 15:45 + */ +@Slf4j +public class WxUtils { + + /** + * 微信小程序API 用户数据的解密 + * + * @param encryptedData + * @param sessionKey + * @param iv + * @return + */ + public static AppletUserDecodeData encryptedData(String encryptedData, String sessionKey, String iv) { + // 被加密的数据 + byte[] dataByte = Base64.decode(encryptedData); + // 加密秘钥 + byte[] keyByte = Base64.decode(sessionKey); + // 偏移量 + byte[] ivByte = Base64.decode(iv); + try { + // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 + int base = 16; + if (keyByte.length % base != 0) { + int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyByte, 0, temp, 0, keyByte.length); + keyByte = temp; + } + // 初始化 + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); + SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); + AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); + parameters.init(new IvParameterSpec(ivByte)); + cipher.init(Cipher.DECRYPT_MODE, spec, parameters); + byte[] resultByte = cipher.doFinal(dataByte); + if (null != resultByte && resultByte.length > 0) { + String result = new String(resultByte, CharEncoding.UTF_8); + log.info("解密原串:{}", result); + return WxJsonUtils.parseObject(result, AppletUserDecodeData.class); + } + throw new RuntimeException("解密的数据为空"); + } catch (Exception e) { + log.error("解密失败. error = {}", e.getMessage(), e); + throw new RuntimeException(e.getMessage()); + } + } + + /** + * 微信小程序API 用户数据的签名验证 + * signature = sha1( rawData + session_key ) + * + * @param rawData 不包括敏感信息的原始数据字符串,用于计算签名。 + * @param sessionKey + */ + public static void verifySignature(String rawData, String sessionKey, String signature) { + String serverSignature = SHA1.getSHA1(rawData + sessionKey); + log.info(rawData + ">>>>>>:" + sessionKey + " === " + serverSignature + " ======" + signature); + if (!signature.equals(serverSignature)) { + throw new RuntimeException("数据验签不通过"); + } + } + + /** + * 根据流接收请求数据 + * + * @param request + * @return + */ + public static String streamBodyByReceive(HttpServletRequest request) throws IOException { + log.info("微信异步回调地址:{}", request.getRequestURL()); + StringBuffer buffer = new StringBuffer(); + InputStream inputStream = request.getInputStream(); + InputStreamReader reader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(reader); + String body = null; + while ((body = bufferedReader.readLine()) != null) { + buffer.append(body); + } + String data = buffer.toString(); + reader.close(); + inputStream.close(); + log.info("微信异步回调数据:{}", data); + return data; + } + + /** + * 日志 + * + * @return + */ + public static Logger getLogger() { + Logger logger = LoggerFactory.getLogger("wxpay java sdk"); + return logger; + } + + /** + * debug + * + * @param msg + * @param args + */ + public static void debug(String msg, Object... args) { + Logger log = getLogger(); + if (log.isDebugEnabled()) { + log.debug(msg, args); + } + } + + /** + * info + * + * @param msg + * @param args + */ + public static void info(String msg, Object... args) { + Logger log = getLogger(); + if (log.isInfoEnabled()) { + log.info(msg, args); + } + } + + /** + * warn + * + * @param msg + * @param args + */ + public static void warn(String msg, Object... args) { + Logger log = getLogger(); + if (log.isWarnEnabled()) { + log.warn(msg, args); + } + } + + /** + * error + * + * @param msg + * @param args + */ + public static void error(String msg, Object... args) { + Logger log = getLogger(); + if (log.isErrorEnabled()) { + log.error(msg, args); + } + } +} -- Gitblit v1.7.1