wenhongquan 1 anno fa
parent
commit
6f2a4d9bdc

+ 7 - 0
ruoyi-admin/pom.xml

@@ -101,6 +101,13 @@
         </dependency>
 
 
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.6.7.B</version>
+        </dependency>
+
+
         <!-- skywalking 整合 logback -->
 <!--        <dependency>-->
 <!--            <groupId>org.apache.skywalking</groupId>-->

+ 86 - 4
ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java

@@ -1,19 +1,33 @@
 package org.dromara.web.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResource;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONUtil;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.zhyd.oauth.model.AuthCallback;
 import me.zhyd.oauth.model.AuthResponse;
 import me.zhyd.oauth.model.AuthUser;
 import me.zhyd.oauth.request.AuthRequest;
 import me.zhyd.oauth.utils.AuthStateUtils;
+import me.zhyd.oauth.utils.UuidUtils;
 import org.dromara.common.core.constant.UserConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.RegisterBody;
 import org.dromara.common.core.domain.model.SocialLoginBody;
 import org.dromara.common.core.utils.*;
@@ -26,12 +40,12 @@ import org.dromara.common.social.utils.SocialUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.websocket.utils.WebSocketUtils;
 import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.bo.SysSocialBo;
 import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.domain.vo.SysSocialVo;
 import org.dromara.system.domain.vo.SysTenantVo;
-import org.dromara.system.service.ISysClientService;
-import org.dromara.system.service.ISysConfigService;
-import org.dromara.system.service.ISysSocialService;
-import org.dromara.system.service.ISysTenantService;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.service.*;
 import org.dromara.web.domain.vo.LoginTenantVo;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.domain.vo.TenantListVo;
@@ -43,6 +57,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.net.URL;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
@@ -67,6 +82,10 @@ public class AuthController {
     private final ISysClientService clientService;
     private final ScheduledExecutorService scheduledExecutorService;
 
+    private final WxMaService wxMaService;
+    private final ISysSocialService sysSocialService;
+    private final ISysUserService sysUserService;
+
 
 
 
@@ -188,6 +207,69 @@ public class AuthController {
         return R.ok();
     }
 
+    @PostMapping("/loginByPhoneCodeAndLoginCode")
+    public R<LoginVo> registerByPhonecode(@RequestParam String logincode,@RequestParam String phonecode) throws WxErrorException {
+
+        AuthRequest authRequest = SocialUtils.getAuthRequest("wechat_mini_program", socialProperties);
+        AuthResponse<AuthUser> response = authRequest.login(AuthCallback.builder().code(logincode).build());
+        AuthUser authUserData = response.getData();
+        if (!response.ok()) {
+            return R.fail(response.getMsg());
+        }
+        WxMaPhoneNumberInfo phone = wxMaService.getUserService().getPhoneNumber(phonecode);
+        SysUserVo userVo = sysUserService.selectUserByUserName(phone.getPhoneNumber());
+        if(userVo==null){
+            //注册
+            RegisterBody user = new RegisterBody();
+            user.setUsername(phone.getPhoneNumber());
+            user.setPassword(UuidUtils.getUUID().substring(0,6));
+            user.setUserType("app_user");
+            user.setPhonenumber(phone.getPhoneNumber());
+            registerService.register(user);
+            userVo =  sysUserService.selectUserByUserName(phone.getPhoneNumber());
+        }
+
+        //绑定微信
+        SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class);
+        String authId = authUserData.getSource() + authUserData.getUuid();
+        BeanUtil.copyProperties(authUserData.getToken(), bo);
+        bo.setUserId(userVo.getUserId());
+        bo.setAuthId(authId);
+        bo.setOpenId(authUserData.getUuid());
+        bo.setUserName(authUserData.getUsername());
+        bo.setNickName(authUserData.getNickname());
+        // 查询是否已经绑定用户
+        List<SysSocialVo> list = sysSocialService.selectByAuthId(authId);
+        if (CollUtil.isEmpty(list)) {
+            // 没有绑定用户, 新增用户信息
+            sysSocialService.insertByBo(bo);
+        } else {
+            // 更新用户信息
+            bo.setId(list.get(0).getId());
+            sysSocialService.updateByBo(bo);
+        }
+
+        SysClient client = clientService.queryByClientId("39769a71109d3579c97f2e007f8afdaf");
+        LoginUser loginUser = loginService.buildLoginUser(userVo);
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(client.getClientId());
+
+        return R.ok(loginVo);
+
+    }
+
     /**
      * 登录页面租户下拉框
      *

+ 3 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java

@@ -56,6 +56,9 @@ public class SysRegisterService {
         SysUserBo sysUser = new SysUserBo();
         sysUser.setUserName(username);
         sysUser.setNickName(username);
+        if(registerBody.getPhonenumber()!=null){
+            sysUser.setPhonenumber(registerBody.getPhonenumber());
+        }
         sysUser.setPassword(BCrypt.hashpw(password));
         sysUser.setUserType(userType);
 

+ 132 - 0
ruoyi-admin/src/main/java/org/dromara/web/util/WxMaConfiguration.java

@@ -0,0 +1,132 @@
+package org.dromara.web.util;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import cn.binarywang.wx.miniapp.config.impl.WxMaRedisConfigImpl;
+import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
+import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.error.WxRuntimeException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.File;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ */
+@Slf4j
+@Configuration
+@EnableConfigurationProperties(WxMaProperties.class)
+public class WxMaConfiguration {
+    private final WxMaProperties properties;
+
+    @Autowired
+    public WxMaConfiguration(WxMaProperties properties) {
+        this.properties = properties;
+    }
+
+    @Bean
+    public WxMaService wxMaService() {
+        List<WxMaProperties.Config> configs = this.properties.getConfigs();
+        if (configs == null) {
+            throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");
+        }
+        WxMaService maService = new WxMaServiceImpl();
+        maService.setMultiConfigs(
+            configs.stream()
+                .map(a -> {
+                    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
+                    // 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常
+                    config.setAppid(a.getAppid());
+                    config.setSecret(a.getSecret());
+                    config.setToken(a.getToken());
+                    config.setAesKey(a.getAesKey());
+                    config.setMsgDataFormat(a.getMsgDataFormat());
+                    return config;
+                }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o)));
+        return maService;
+    }
+
+    @Bean
+    public WxMaMessageRouter wxMaMessageRouter(WxMaService wxMaService) {
+        final WxMaMessageRouter router = new WxMaMessageRouter(wxMaService);
+        router
+            .rule().handler(logHandler).next()
+            .rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end()
+            .rule().async(false).content("文本").handler(textHandler).end()
+            .rule().async(false).content("图片").handler(picHandler).end()
+            .rule().async(false).content("二维码").handler(qrcodeHandler).end();
+        return router;
+    }
+
+    private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {
+        service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder()
+            .templateId("此处更换为自己的模板id")
+            .data(Lists.newArrayList(
+                new WxMaSubscribeMessage.MsgData("keyword1", "339208499")))
+            .toUser(wxMessage.getFromUser())
+            .build());
+        return null;
+    };
+
+    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
+        log.info("收到消息:" + wxMessage.toString());
+        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
+            .toUser(wxMessage.getFromUser()).build());
+        return null;
+    };
+
+    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {
+        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
+            .toUser(wxMessage.getFromUser()).build());
+        return null;
+    };
+
+    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
+        try {
+            WxMediaUploadResult uploadResult = service.getMediaService()
+                .uploadMedia("image", "png",
+                    ClassLoader.getSystemResourceAsStream("tmp.png"));
+            service.getMsgService().sendKefuMsg(
+                WxMaKefuMessage
+                    .newImageBuilder()
+                    .mediaId(uploadResult.getMediaId())
+                    .toUser(wxMessage.getFromUser())
+                    .build());
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    };
+
+    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
+        try {
+            final File file = service.getQrcodeService().createQrcode("123", 430);
+            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
+            service.getMsgService().sendKefuMsg(
+                WxMaKefuMessage
+                    .newImageBuilder()
+                    .mediaId(uploadResult.getMediaId())
+                    .toUser(wxMessage.getFromUser())
+                    .build());
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    };
+
+}

+ 46 - 0
ruoyi-admin/src/main/java/org/dromara/web/util/WxMaProperties.java

@@ -0,0 +1,46 @@
+package org.dromara.web.util;
+
+import java.util.List;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import lombok.Data;
+
+/**
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "wx.miniapp")
+public class WxMaProperties {
+
+    private List<Config> configs;
+
+    @Data
+    public static class Config {
+        /**
+         * 设置微信小程序的appid
+         */
+        private String appid;
+
+        /**
+         * 设置微信小程序的Secret
+         */
+        private String secret;
+
+        /**
+         * 设置微信小程序消息服务器配置的token
+         */
+        private String token;
+
+        /**
+         * 设置微信小程序消息服务器配置的EncodingAESKey
+         */
+        private String aesKey;
+
+        /**
+         * 消息格式,XML或者JSON
+         */
+        private String msgDataFormat;
+    }
+
+}

+ 4 - 4
ruoyi-admin/src/main/resources/application.yml

@@ -277,9 +277,9 @@ forest:
 wx:
   miniapp:
     configs:
-       appid: wx01d09951c567089d #微信小程序的appid
-       secret: 079494f2fa6ecdc47c46f872bae769e7 #微信小程序的Secret
-       aesKey: 1KCaxm0aNaDljRKW+nFywcs6218h9k5Ek3Mj9u60HGU= #微信小程序消息服务器配置的EncodingAESKey
-       msgDataFormat: JSON
+      - appid: wx01d09951c567089d #微信小程序的appid
+        secret: 079494f2fa6ecdc47c46f872bae769e7 #微信小程序的Secret
+        aesKey: 1KCaxm0aNaDljRKW+nFywcs6218h9k5Ek3Mj9u60HGU= #微信小程序消息服务器配置的EncodingAESKey
+        msgDataFormat: JSON
 
 

+ 2 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java

@@ -32,4 +32,6 @@ public class RegisterBody extends LoginBody {
 
     private String userType;
 
+    private String phonenumber;
+
 }