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