最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

接入微信登錄可以通過微信開放平臺的授權(quán)登錄功能實現(xiàn),如何實現(xiàn)微信小程序使用微信登錄案例

注冊微信開放平臺賬號并創(chuàng)建應(yīng)用:

首先注冊微信開放平臺賬號,并在開發(fā)者中心創(chuàng)建一個應(yīng)用,獲取到AppID和AppSecret。

配置Spring Boot項目:

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 - 微信小程序手機登錄 Request VO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AppAuthWeixinMiniAppLoginReqVO {
    @Schema(description = "手機 code,小程序通過 wx.getPhoneNumber 方法獲得", requiredMode = Schema.RequiredMode.REQUIRED, example = "hello")
    @NotEmpty(message = "手機 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 {
    /**
     * 手機 + 密碼登錄
     *
     * @param reqVO 登錄信息
     * @return 登錄結(jié)果
     */
    AppAuthLoginRespVO login(@Valid AppAuthLoginReqVO reqVO);
    /**
     * 基于 token 退出登錄
     *
     * @param token token
     */
    void logout(String token);
    /**
     * 手機 + 驗證碼登陸
     *
     * @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)的手機號信息
        SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
                UserTypeEnum.COOPERATIVE.getValue(), reqVO.getPhoneCode());
        Assert.notNull(phoneNumberInfo, "獲得手機信息失敗,結(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;
    /**
     * 過期時間
     */
    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;
    /**
     * 過期時間
     */
    private LocalDateTime expiresTime;
}

到此這篇關(guān)于Springboot項目中實現(xiàn)微信小程序登錄案例的文章就介紹到這了,更多相關(guān)Springboot微信小程序登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Scala方法與函數(shù)使用和定義詳解

    Scala方法與函數(shù)使用和定義詳解

    這個章節(jié)會很燒腦,需要認(rèn)真研讀,我會盡量寫的詳細(xì)一些。 方法和函數(shù),看似是兩個概念,其實他嚴(yán)格來說也是兩個概念,但我們大可以理解成是同一個概念,在使用時只有語法上的細(xì)微差別,是很類似的,都理解為function即可
    2022-12-12
  • spring boot優(yōu)雅集成redisson詳解

    spring boot優(yōu)雅集成redisson詳解

    這篇文章主要為大家介紹了spring boot優(yōu)雅集成redisson詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 淺談SpringBoot優(yōu)化技巧

    淺談SpringBoot優(yōu)化技巧

    這篇文章主要介紹了淺談SpringBoot優(yōu)化技巧,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot中的多個事務(wù)管理詳解

    SpringBoot中的多個事務(wù)管理詳解

    這篇文章主要介紹了SpringBoot中的多個事務(wù)管理詳解,事務(wù)管理是一種組織和協(xié)調(diào)各種活動和資源的方法,以實現(xiàn)特定目標(biāo),它涉及規(guī)劃、執(zhí)行和監(jiān)控各種任務(wù),以確保項目或組織的順利運行,需要的朋友可以參考下
    2023-10-10
  • eclipse項目在IDEA中打開并運行的詳細(xì)圖文教程

    eclipse項目在IDEA中打開并運行的詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于eclipse項目在IDEA中打開并運行的詳細(xì)圖文教程,至從使用IDEA開發(fā)工具以來,不少次有使用IDEA運行Eclipse項目或非Maven項目,所以這里給大家總結(jié)下,需要的朋友可以參考下
    2023-09-09
  • Java實現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例

    Java實現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)使用Websocket發(fā)送消息的相關(guān)資料,WebSocket是一種協(xié)議,用于在Web應(yīng)用程序和服務(wù)器之間建立實時、雙向的通信連接,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 在Ubuntu上部署SpringBoot應(yīng)用的操作步驟

    在Ubuntu上部署SpringBoot應(yīng)用的操作步驟

    隨著云計算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺之一,Java 作為一種跨平臺的編程語言,具有廣泛的應(yīng)用場景,本文將詳細(xì)介紹如何在 Ubuntu 服務(wù)器上部署 Java 應(yīng)用,需要的朋友可以參考下
    2025-01-01
  • Java畢業(yè)設(shè)計之多用戶宿舍管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計之多用戶宿舍管理系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了基于Java實現(xiàn)的多用戶宿舍管理系統(tǒng),本文采用了jsp、servlet、jdbc等技術(shù),文中示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02
  • MyBatis Generator配置入門

    MyBatis Generator配置入門

    本文主要介紹了MyBatis Generator配置入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot--- SpringSecurity進(jìn)行注銷權(quán)限控制的配置方法

    SpringBoot--- SpringSecurity進(jìn)行注銷權(quán)限控制的配置方法

    這篇文章主要介紹了SpringBoot--- SpringSecurity進(jìn)行注銷,權(quán)限控制,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論

仁化县| 浦县| 万全县| 沙雅县| 进贤县| 渭南市| 通州区| 余姚市| 威远县| 兰坪| 襄城县| 平武县| 伊通| 富源县| 合阳县| 伊春市| 尚义县| 池州市| 沁水县| 镇安县| 荃湾区| 泰安市| 西华县| 万安县| 佛坪县| 余庆县| 渭源县| 三穗县| 宝应县| 任丘市| 通河县| 苍梧县| 广州市| 甘德县| 贺州市| 肇东市| 许昌县| 电白县| 汪清县| 兴义市| 原阳县|