Springboot項(xiàng)目中實(shí)現(xiàn)微信小程序登錄案例(最新推薦)
接入微信登錄可以通過微信開放平臺的授權(quán)登錄功能實(shí)現(xiàn),如何實(shí)現(xiàn)微信小程序使用微信登錄案例
注冊微信開放平臺賬號并創(chuàng)建應(yīng)用:
首先注冊微信開放平臺賬號,并在開發(fā)者中心創(chuàng)建一個(gè)應(yīng)用,獲取到AppID和AppSecret。
配置Spring Boot項(xiàng)目:
在application.properties
或application.yml
中配置微信登錄的相關(guān)信息:
wechat.appId=your_app_id wechat.appSecret=your_app_secret wechat.redirectUrl=http://localhost:8080/login/wechat/callback
創(chuàng)建微信登錄控制器:
@PostMapping("/weixin-mini-app-login") @Operation(summary = "微信小程序的一鍵登錄") @PermitAll public CommonResult<AppAuthLoginRespVO> weixinMiniAppLogin(@RequestBody @Valid AppAuthWeixinMiniAppLoginReqVO reqVO) { return success(authService.weixinMiniAppLogin(reqVO)); }
@Schema(description = "用戶 APP - 微信小程序手機(jī)登錄 Request VO") @Data @NoArgsConstructor @AllArgsConstructor @Builder public class AppAuthWeixinMiniAppLoginReqVO { @Schema(description = "手機(jī) code,小程序通過 wx.getPhoneNumber 方法獲得", requiredMode = Schema.RequiredMode.REQUIRED, example = "hello") @NotEmpty(message = "手機(jī) code 不能為空") private String phoneCode; @Schema(description = "登錄 code,小程序通過 wx.login 方法獲得", requiredMode = Schema.RequiredMode.REQUIRED, example = "word") @NotEmpty(message = "登錄 code 不能為空") private String loginCode; @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") @NotEmpty(message = "state 不能為空") private String state; }
public interface MemberAuthService { /** * 手機(jī) + 密碼登錄 * * @param reqVO 登錄信息 * @return 登錄結(jié)果 */ AppAuthLoginRespVO login(@Valid AppAuthLoginReqVO reqVO); /** * 基于 token 退出登錄 * * @param token token */ void logout(String token); /** * 手機(jī) + 驗(yàn)證碼登陸 * * @param reqVO 登陸信息 * @return 登錄結(jié)果 */ AppAuthLoginRespVO smsLogin(@Valid AppAuthSmsLoginReqVO reqVO); /** * 社交登錄,使用 code 授權(quán)碼 * * @param reqVO 登錄信息 * @return 登錄結(jié)果 */ AppAuthLoginRespVO socialLogin(@Valid AppAuthSocialLoginReqVO reqVO); /** * 微信小程序的一鍵登錄 * * @param reqVO 登錄信息 * @return 登錄結(jié)果 */ AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO); /**
@Override public AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO) { // 獲得對應(yīng)的手機(jī)號信息 SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo( UserTypeEnum.COOPERATIVE.getValue(), reqVO.getPhoneCode()); Assert.notNull(phoneNumberInfo, "獲得手機(jī)信息失敗,結(jié)果為空"); // 獲得獲得注冊用戶 MemberUserDO user = userService.createUserIfAbsent(phoneNumberInfo.getPurePhoneNumber(), getClientIP(), TerminalEnum.WECHAT_MINI_PROGRAM.getTerminal()); Assert.notNull(user, "獲取用戶失敗,結(jié)果為空"); // 綁定社交用戶 String openid = socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), SocialTypeEnum.WECHAT_MINI_APP.getType(), reqVO.getLoginCode(), reqVO.getState())); // 創(chuàng)建 Token 令牌,記錄登錄日志 return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid); }
private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile, LoginLogTypeEnum logType, String openid) { // 插入登陸日志 createLoginLog(user.getId(), mobile, logType, LoginResultEnum.SUCCESS); // 創(chuàng)建 Token 令牌 OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(new OAuth2AccessTokenCreateReqDTO() .setUserId(user.getId()).setUserType(getUserType().getValue()) .setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT)); // 構(gòu)建返回結(jié)果 return AuthConvert.INSTANCE.convert(accessTokenRespDTO, openid); }
@Override public OAuth2AccessTokenRespDTO createAccessToken(OAuth2AccessTokenCreateReqDTO reqDTO) { OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getTenantId(), reqDTO.getScopes()); return BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class); }
public interface OAuth2TokenService { /** * 創(chuàng)建訪問令牌 * 注意:該流程中,會包含創(chuàng)建刷新令牌的創(chuàng)建 * * 參考 DefaultTokenServices 的 createAccessToken 方法 * * @param userId 用戶編號 * @param userType 用戶類型 * @param clientId 客戶端編號 * @param scopes 授權(quán)范圍 * @return 訪問令牌的信息 */ OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes); OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, Long tenantId, List<String> scopes);
@Override @Transactional(rollbackFor = Exception.class) public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, Long tenantId, List<String> scopes) { OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); // 創(chuàng)建刷新令牌 OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, tenantId, clientDO, scopes); // 創(chuàng)建訪問令牌 return createOAuth2AccessToken(refreshTokenDO, clientDO); }
private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, Long tenantId, OAuth2ClientDO clientDO, List<String> scopes) { OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) .setUserId(userId).setUserType(userType) .setClientId(clientDO.getClientId()).setScopes(scopes) .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())); refreshToken.setTenantId(tenantId); oauth2RefreshTokenMapper.insert(refreshToken); return refreshToken; }
@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 數(shù)據(jù)庫的主鍵自增。如果是 MySQL 等數(shù)據(jù)庫,可不寫。 @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) public class OAuth2RefreshTokenDO extends TenantBaseDO { /** * 編號,數(shù)據(jù)庫字典 */ private Long id; /** * 刷新令牌 */ private String refreshToken; /** * 用戶編號 */ private Long userId; /** * 用戶類型 * * 枚舉 {@link UserTypeEnum} */ private Integer userType; /** * 客戶端編號 * * 關(guān)聯(lián) {@link OAuth2ClientDO#getId()} */ private String clientId; /** * 授權(quán)范圍 */ @TableField(typeHandler = JacksonTypeHandler.class) private List<String> scopes; /** * 過期時(shí)間 */ private LocalDateTime expiresTime; }
public class OAuth2AccessTokenDO extends TenantBaseDO { /** * 編號,數(shù)據(jù)庫遞增 */ @TableId private Long id; /** * 訪問令牌 */ private String accessToken; /** * 刷新令牌 */ private String refreshToken; /** * 用戶編號 */ private Long userId; /** * 用戶類型 * * 枚舉 {@link UserTypeEnum} */ private Integer userType; /** * 用戶信息 */ @TableField(typeHandler = JacksonTypeHandler.class) private Map<String, String> userInfo; /** * 客戶端編號 * * 關(guān)聯(lián) {@link OAuth2ClientDO#getId()} */ private String clientId; /** * 授權(quán)范圍 */ @TableField(typeHandler = JacksonTypeHandler.class) private List<String> scopes; /** * 過期時(shí)間 */ private LocalDateTime expiresTime; }
到此這篇關(guān)于Springboot項(xiàng)目中實(shí)現(xiàn)微信小程序登錄案例的文章就介紹到這了,更多相關(guān)Springboot微信小程序登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Mybatis-Plus實(shí)現(xiàn)微信注冊登錄的示例代碼
- 微信小程序使用uni-app和springboot實(shí)現(xiàn)一鍵登錄功能(JWT鑒權(quán))
- springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐
- springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
- 詳解SpringBoot如何實(shí)現(xiàn)整合微信登錄
- 一篇文章帶你入門Springboot整合微信登錄與微信支付(附源碼)
- springboot 微信授權(quán)網(wǎng)頁登錄操作流程
- SpringBoot實(shí)現(xiàn)微信掃碼登錄的示例代碼
相關(guān)文章
mybatis-plus讀取JSON類型的方法實(shí)現(xiàn)
這篇文章主要介紹了mybatis-plus讀取JSON類型的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09使用Postman自動生成Cookie并轉(zhuǎn)換為Java代碼的實(shí)現(xiàn)
在接口測試中,有時(shí)候需要在請求中攜帶Cookie信息,為了方便測試,我們可以使用Postman來自動生成Cookie,并將其轉(zhuǎn)換為Java代碼,以便在自動化測試中使用,下面將介紹如何實(shí)現(xiàn)這一功能,需要的朋友可以參考下2024-11-11Java使用ArrayList實(shí)現(xiàn)撲克牌的示例代碼
學(xué)習(xí)了關(guān)于集合類的知識,我們可以做一個(gè)小項(xiàng)目來加深對集合類知識的學(xué)習(xí)!本文就來利用ArrayList實(shí)現(xiàn)撲克牌發(fā)牌洗牌效果,需要的可以參考一下2022-10-10Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例
今天小編就為大家分享一篇關(guān)于Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程詳細(xì)講解
這篇文章主要介紹了Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程,事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性,感興趣想要詳細(xì)了解可以參考下文2023-05-05