亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Springboot項(xiàng)目中實(shí)現(xiàn)微信小程序登錄案例(最新推薦)

 更新時(shí)間:2025年02月15日 14:06:58   作者:典龍330  
文章介紹了如何通過微信開放平臺的授權(quán)登錄功能實(shí)現(xiàn)Spring Boot項(xiàng)目與微信小程序的微信登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

接入微信登錄可以通過微信開放平臺的授權(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.propertiesapplication.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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus讀取JSON類型的方法實(shí)現(xià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)

    使用Postman自動生成Cookie并轉(zhuǎn)換為Java代碼的實(shí)現(xiàn)

    在接口測試中,有時(shí)候需要在請求中攜帶Cookie信息,為了方便測試,我們可以使用Postman來自動生成Cookie,并將其轉(zhuǎn)換為Java代碼,以便在自動化測試中使用,下面將介紹如何實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-11-11
  • Java使用ArrayList實(shí)現(xiàn)撲克牌的示例代碼

    Java使用ArrayList實(shí)現(xiàn)撲克牌的示例代碼

    學(xué)習(xí)了關(guān)于集合類的知識,我們可以做一個(gè)小項(xiàng)目來加深對集合類知識的學(xué)習(xí)!本文就來利用ArrayList實(shí)現(xiàn)撲克牌發(fā)牌洗牌效果,需要的可以參考一下
    2022-10-10
  • 淺析Java中clone()方法淺克隆與深度克隆

    淺析Java中clone()方法淺克隆與深度克隆

    Java克隆(Clone)是Java語言的特性之一,本篇文章主要介紹了Java中的Clone機(jī)制是如何工作的,需要的朋友可以參考下
    2017-04-04
  • Java讀寫文件方法總結(jié)(推薦)

    Java讀寫文件方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫ava讀寫文件方法總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • Java不能真正泛型的原因是什么?

    Java不能真正泛型的原因是什么?

    今天我來給大家講一下,Java 不能實(shí)現(xiàn)真正泛型的原因是什么?感興趣的朋友可以看一下,如果能給你到來一些幫助,請關(guān)注小編的其他內(nèi)容
    2021-08-08
  • Spring詳細(xì)講解@Autowired注解

    Spring詳細(xì)講解@Autowired注解

    @Autowired注解可以用在類屬性,構(gòu)造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準(zhǔn)確地控制bean在何處如何自動裝配的過程。在默認(rèn)情況下,該注解是類型驅(qū)動的注入
    2022-06-06
  • Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例

    Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例

    今天小編就為大家分享一篇關(guān)于Spring Boot單元測試中使用mockito框架mock掉整個(gè)RedisTemplate的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程詳細(xì)講解

    Spring基于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
  • 基于SpringBoot制作一個(gè)PDF切圖小工具

    基于SpringBoot制作一個(gè)PDF切圖小工具

    這篇文章主要為大家詳細(xì)介紹了如何基于SpringBoot制作一個(gè)PDF切圖小工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01

最新評論