diff --git a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java index 9c5e8bd..5053ed5 100644 --- a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java +++ b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/controller/app/auth/AppAuthController.java @@ -135,6 +135,16 @@ public class AppAuthController { ,appWxMiniLoginVO.getOpenid())); } + @GetMapping("/auth-wechat-login") + @Operation(summary = "社交授权的跳转") + @Parameters({ + @Parameter(name = "code", description = "code码", required = true) + }) + public CommonResult wechatAuth(@RequestParam("code") String code) { + System.out.println("code:"+code); + return CommonResult.success(authService.wechatAuth(code)); + } + } diff --git a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthService.java b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthService.java index 878a5a3..365a193 100644 --- a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthService.java +++ b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthService.java @@ -71,6 +71,14 @@ public interface MemberAuthService { */ AppAuthLoginRespVO weixinMiniAppLogin3(String encryptedData, String iv, String openid); + /** + * 微信公众号的一键登录 + * + * @param code code + * @return 登录结果 + */ + AppAuthLoginRespVO wechatAuth(String code); + /** * 获得社交认证 URL diff --git a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java index 76ff989..78d4813 100644 --- a/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yshop-drink-boot3/yshop-module-member/yshop-module-member-biz/src/main/java/co/yixiang/yshop/module/member/service/auth/MemberAuthServiceImpl.java @@ -35,6 +35,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.annotations.VisibleForTesting; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import org.springframework.security.crypto.password.PasswordEncoder; @@ -271,6 +273,46 @@ public class MemberAuthServiceImpl implements MemberAuthService { return appAuthLoginRespVO; } + /** + * 微信公众号登录 + * @param code code + * @return + */ + @Override + public AppAuthLoginRespVO wechatAuth(String code) { + WxOAuth2AccessToken wxMpOAuth2AccessToken = null; + MemberUserDO memberUserDO = null; + try { + wxMpOAuth2AccessToken = mpService.getOAuth2Service().getAccessToken(code); + WxOAuth2UserInfo wxMpUser = mpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null); + String openid = wxMpUser.getOpenid(); + //根据openid查用户是否存在 + memberUserDO = userMapper.selectOne(new LambdaQueryWrapper() + .eq(MemberUserDO::getOpenid,openid)); + if (memberUserDO == null) { + // 获得获得注册用户 + memberUserDO = userService.createUserIfAbsent("", getClientIP(), + LoginTypeEnum.WECHAT.getValue()); + //过滤掉表情 + String nickname = wxMpUser.getNickname(); + memberUserDO.setOpenid(openid); + memberUserDO.setNickname(nickname); + memberUserDO.setAvatar(wxMpUser.getHeadImgUrl()); + memberUserDO.setUsername(openid); + userMapper.updateById(memberUserDO); + } + }catch (WxErrorException e) { + log.error(e.getMessage()); + throw exception(MINI_AUTH_LOGIN_BAD); + } + + // 创建 Token 令牌,记录登录日志 + AppAuthLoginRespVO appAuthLoginRespVO = createTokenAfterLoginSuccess(memberUserDO, memberUserDO.getNickname(), + LoginLogTypeEnum.LOGIN_SOCIAL); + appAuthLoginRespVO.setOpenId(memberUserDO.getOpenid()); + appAuthLoginRespVO.setUserInfo(UserConvert.INSTANCE.convert3(memberUserDO)); + return appAuthLoginRespVO; + } private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile, LoginLogTypeEnum logType) { // 插入登陆日志 diff --git a/yshop-drink-uniapp-vue3/App.vue b/yshop-drink-uniapp-vue3/App.vue index 621f350..d0d91fc 100644 --- a/yshop-drink-uniapp-vue3/App.vue +++ b/yshop-drink-uniapp-vue3/App.vue @@ -21,7 +21,7 @@ onShow(() => { // 检查用户登录情况 // #ifdef H5 if(isWeixin()){ - + oAuth() // H5编译的代码 // 判断是否是微信浏览器 } @@ -55,6 +55,56 @@ const wechatMiniLogin = () => { }); } +const getAuthUrl = (appId) => { + // #ifdef H5 + // #endif + cookie.set('redirect', window.location.href) + const url = `${location.origin}/h5/#/pages/index/index` + cookie.set('index_url',url) + let redirect_uri = encodeURIComponent(url) + + const state = 'STATE' + return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect` + } + +const oAuth = async() => { + const WX_AUTH = 'wx_auth' + return new Promise((resolve, reject) => { + + const accessToken = uni.getStorageSync('accessToken'); + if (cookie.has('wx_auth') && accessToken && main.isLogin) { + reject() + return + } + const { code } = parseQuery() + if (!code) { + //公众号appid + const appid = APP_ID; + location.href = getAuthUrl(appid) + return + } else { + auth(code) + } + resolve() + }).catch(error => { + console.log(error) + }) +} + +const auth = async(code) => { + console.log('获取微信授权:',code) + let data = await wechatAuth({'code':code}) + cookie.set('wx_auth', code) + if (data) { + main.SET_OPENID(data.openId) + main.SET_MEMBER(data.userInfo); + main.SET_TOKEN(data.accessToken); + + + } + +} + diff --git a/yshop-drink-uniapp-vue3/config/index.js b/yshop-drink-uniapp-vue3/config/index.js index 1b4d3dd..6de8a6a 100644 --- a/yshop-drink-uniapp-vue3/config/index.js +++ b/yshop-drink-uniapp-vue3/config/index.js @@ -2,7 +2,7 @@ export const VUE_APP_API_URL = 'http://localhost:48081/app-api' //export const VUE_APP_API_URL = 'https://apidc.yixiang.co/app-api' export const VUE_APP_RESOURCES_URL = 'https://h5.yixiang.co/static' export const VUE_APP_UPLOAD_URL = VUE_APP_API_URL + '/infra/file/upload' -export const APP_ID = 'wxc061dee8806ff712' +export const APP_ID = 'wxdbdbc123c8c30b45' const orderListStatus = {}