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