文档章节

利用Spring Social轻松搞定微信授权登录

LarrySu
 LarrySu
发布于 2018/12/13 07:09
字数 939
阅读 2230
收藏 31

微信第三方登录有两种方式:扫码登录(微信开放平台)和公众号登录(微信公众平台)

扫码登录可以用于PC等跨平台应用,而公众平台必须在微信app内使用,且必须关注公众号.

下面以公众平台为例,介绍如何基于Spring Social实现微信用户授权并获取到用户信息(微信开放平台类似).


第一步:到微信公众平台后台注册应用并进行相关设置

微信公众平台后台地址: https://mp.weixin.qq.com/

也可以先注册一个测试号: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

用微信扫码登录后台后可以看到如下页面:

其中的"appID"和"appsecret"需要记录下来,一会要用到.

滑到下方找到"网页授权获取用户基本信息",点击"修改",将自己测试服务器的域名或IP填上去:

修改页面:


第二步:添加相关代码

我们假设服务端是基于springboot。

1.增加spring-social-wechat依赖:

Maven:

<dependency>
    <groupId>com.ikasoa</groupId>
    <artifactId>spring-social-wechat</artifactId>
    <version>1.3.1</version>
</dependency>

或者Gradle:

compile 'com.ikasoa:spring-social-wechat:1.3.1'

2.增加配置项

application.yml:

spring:
  social:
    wechatmp:
      app-id: [appID]
      app-secret: [appsecret]

或者application.properties:

spring.social.wechatmp.app-id=[appID]
spring.social.wechatmp.app-secret=[appsecret]

其中"appID"和"appsecret"可以从微信公众平台后台得到.

3.修改Application.java

增加注解@EnableSocial,并引用自动配置类(WechatMpAutoConfiguration.class):

Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
import org.springframework.social.config.annotation.EnableSocial;
import org.springframework.social.wechat.autoconfigurer.WechatMpAutoConfiguration;

@SpringBootApplication
@EnableSocial
@Import(WechatMpAutoConfiguration.class)
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

4.增加SignInAdapter并注册ProviderSignInController

SignInAdapter用来处理微信授权成功后的相关操作,例如:

WechatSignInAdapter.java

import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionKey;
import org.springframework.social.connect.web.SignInAdapter;
import org.springframework.social.wechat.api.User;
import org.springframework.social.wechat.api.Wechat;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.NativeWebRequest;

@Component
public class WechatSignInAdapter implements SignInAdapter {

    @Override
    public String signIn(String openId, Connection<?> connection, NativeWebRequest request) {
        ConnectionKey key = connection.getKey();
        // 通过providerId判断是否为微信公众平台授权
        if ("wechatmp".equalsIgnoreCase(key.getProviderId())) {
            // 通过微信openId获取到用户详细信息
            User user = ((Wechat)connection.getApi()).userOperations().getUserProfile(openId);
            // 微信用户详细信息,可以记录到数据库.这里直接打印到后台
            System.out.println(user);
            return “/success.htm”; // 返回登录成功后跳转的url
        }
        return “/error.htm”;
    }

}

将WechatSignInAdapter注入到ProviderSignInController中:

......
@Bean
public ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository, WechatSignInAdapter wechatSignInAdapter) {
    ((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp((Connection<?> connection) -> connection.getKey().getProviderUserId());
    return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, wechatSignInAdapter);
}
......

其中InMemoryUsersConnectionRepository是基于内存存储用户信息的实现(UsersConnectionRepository),也是默认的实现.此外SpringSocial还提供了JDBC的实现可选.


第三步:启动并测试

在测试页面里添加一个微信授权入口:

......
<form action="/signin/wechatmp" method="POST">
    <button type="submit">微信授权登录</button>
</form>
......

启动springboot,在微信app中打开测试页面点击测试button.

测试页面的域名必须与公众平台后台"网页授权获取用户基本信息"中设置的域名相同.

如果一切顺利,服务端后台就会打印该微信用户的详细信息:

页面会跳转到"/success.htm",也就是在WechatSignInAdapter.signIn中返回的地址.

注意,测试账号需要先关注微信测试公众号(测试号后台扫二维码可以关注),否则会报错"ErrorCode:10006".

微信登录实现已全部完成.


关于微信开放平台登录(扫码登录)与此类似,需要在微信开放平台后台申请"appID"和"appsecret",并将上面例子中的"wechatmp"改为"wechat"即可.

完整的例子代码:

spring-social-wechat-sample

关于Spring Social项目

spring-social


star

© 著作权归作者所有

LarrySu

LarrySu

粉丝 4
博文 6
码字总数 3481
作品 2
其它
其他
私信 提问
基于 Spring Social 的微信授权实现 - Spring Social Wechat

基于Spring Social开发的微信授权实现,对OAuth2进行封装,支持spring boot autoconfigure自动配置,可用于微信开放平台和微信公众平台第三方登录授权及获取用户信息。 可直接从Maven中央库获...

LarrySu
01/08
0
0
让应用和社交系统交互-spring social介绍

需求:使用spring social facebook;集成多个社会化组件,如 Twitter等 解决方案: 问题一:仅使用spring social facebook 1)下载相关包http://www.springsource.org/spring-social/ 2)解决...

fir01
2012/08/01
0
0
Spring for Android 将 Spring 引到 Android 上

近日,SpringSource发布了Spring for Android 1.0。Spring for Android是Spring Framework的扩展,有助于简化原生Android应用的开发。此次发布最为引入关注之处是提供了一个REST客户端(Res...

墙头草
2012/07/09
4.5K
4
YurunOAuthLogin v1.2.5 新增支持 OSC 等 5 个登录接口

YurunOAuthLogin 是一个 PHP 第三方登录授权 SDK,集成了QQ、微信、微博、Github等常用接口。内置了多域名回调解决方案,可以在多个域名下使用同一个应用进行登录授权! YurunOAuthLogin 可以...

宇润
2018/01/19
704
2
YurunOAuthLogin v1.2.4 新增第三方登录多域名解决方案

YurunOAuthLogin 是一个PHP 第三方登录授权 SDK,集成了QQ、微信、微博、Github。可以轻松嵌入支持 PHP >= 5.4 的任何系统中。 距离上次发布版本时隔了 3 个月,主要是新增了一个第三方登录多...

宇润
2018/01/15
815
10

没有更多内容

加载失败,请刷新页面

加载更多

ContentProvider和数据库的区别

大家好,今天我们来讲解ContentProvider和数据库的区别是他们之间的联系. 四大组件之一 1.ContentProvider是如何实现数据共享的? 1.在Android中,为了把自己程序的数据(一般是数据库)提供给其他...

天王盖地虎626
54分钟前
1
0
前端搜索

思路:使用indexOf或正则表达式

单线程生物
今天
1
0
Navicat Premium 12破解激活

本文转载自:https://www.cnblogs.com/joyny/p/9536006.html 下载Navicat Premium 12并安装; 链接:https://pan.baidu.com/s/1mN-urlh--SX1vbq7hi81Ww 密码:menk 重要提示:该注册机来源于...

Ygam
今天
2
0
ThreadGroup 线程组

在看tomcat源码时,TaskThreadFactory这个线程工厂类中用到ThreadGroup这个类,之前没有用到过,所以就特地查了一下 ThreadGroup这个属于java元老级的类,在java1.0版本中就出现了,里面还有...

二两豆腐
今天
2
0
在 CentOS 或 RHEL 系统上检查可用的安全更新的方法

当你更新系统时,根据你所在公司的安全策略,有时候可能只需要打上与安全相关的补丁。大多数情况下,这应该是出于程序兼容性方面的考量。那该怎样实践呢?有没有办法让 yum 只安装安全补丁呢...

xiangyunyan
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部