慕课网_《微信授权登录》学习总结

时间:2017年08月12日星期六
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...

第一章:课程介绍

1-1 课程介绍

课程内容

课程介绍
登录方式介绍
基于微信公众号授权登录
微信开放平台介绍
基于微信开放平台实现授权登录
微信公众号与微信开放平台关联整合

第二章:登录方式介绍

2-1 登录方式介绍

微信登录介绍

微信开放平台
微信公众号(微信公众平台)

手机授权登录页

clipboard.png

实现方式

没有自己的账号体系,直接拉取微信用户信息来进行网站登录。
有自己的账号体系,授权成功后需要绑定自己的账号。

第三章:基于公众号的登录

3-1 公众号授权登录

接口文档

路径:微信网页开发》微信网页授权
地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

创建名为wxdevauth的maven项目,POM文件如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myimooc</groupId>
    <artifactId>wxdevauth</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>wxdevauth</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.36</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        
        <dependency>
          <groupId>commons-codec</groupId>
          <artifactId>commons-codec</artifactId>
            </dependency>
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

完成后的项目结构如下

clipboard.png

说明:由于条件限制,此项目代码均没有进行测试,这里只是显示大概开发过程。

代码演示:

1.编写User类

package com.myimooc.wxdevauth.wxauth.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * 自有用户账号体系
 * @author ZhangCheng on 2017-08-12
 *
 */
@Entity
public class User {
    
    @Id
    @GeneratedValue
    private Long id;
    private String account;
    private String password;
    private String nickname;
    private String openid;
    private String unionid;
    
    @Override
    public String toString() {
        return "User [id=" + id + ", account=" + account + ", password=" + password + ", nickname=" + nickname
                + ", openid=" + openid + "]";
    }
    
    public String getUnionid() {
        return unionid;
    }

    public void setUnionid(String unionid) {
        this.unionid = unionid;
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getOpenid() {
        return openid;
    }
    public void setOpenid(String openid) {
        this.openid = openid;
    }
    
    
    
}

2.编写UserRepository类

package com.myimooc.wxdevauth.wxauth.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.myimooc.wxdevauth.wxauth.domain.User;

/**
 * 用户相关资源类
 * @author ZhangCheng on 2017-08-12
 *
 */
public interface UserRepository extends JpaRepository<User, Long> {
    
    User findByunionid(String unionid);
    
}

3.编写AuthUtils类

package com.myimooc.wxdevauth.wxauth.util;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONObject;

/**
 * 使用Http进行认证请求
 * @author ZhangCheng on 2017-08-12
 *
 */
public class AuthUtils {
    
    public static final String APPID="dsadqawer2124a5wdqw1";
    public static final String APPSECRET = "dsadaq875w5edqwd58qwdqwbgthr4t5qa";
    private static final String CHARSET_FORMAT = "UTF-8";
    
    /**
     * 发起GET请求,并将响应数据封装为JSON
     */
    public static JSONObject doGetJson(String url) throws Exception{
        JSONObject jsonObject = null;
        HttpClientBuilder  builder = HttpClientBuilder.create();
        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = builder.build().execute(httpGet);
        HttpEntity entity = response.getEntity();
        if(null != entity){
            String result = EntityUtils.toString(entity,CHARSET_FORMAT);
            jsonObject = JSONObject.parseObject(result);
        }
        return jsonObject;
    }
    
}

4.编写LoginRest类

package com.myimooc.wxdevauth.wxauth.rest;

import java.net.URLEncoder;
import java.util.Objects;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSONObject;
import com.myimooc.wxdevauth.wxauth.domain.User;
import com.myimooc.wxdevauth.wxauth.repository.UserRepository;
import com.myimooc.wxdevauth.wxauth.util.AuthUtils;

/**
 * 登录认证REST
 * @author ZhangCheng on 2017-08-12
 *
 */
@Controller
public class LoginRest {
    
    @Autowired
    private UserRepository userRepository;
    
    @RequestMapping(value={"/","","/index"})
    public ModelAndView index(){
        return new ModelAndView("index");
    }
    
    /**
     * 第一步:用户同意授权,获取code
     * 入口地址
     */
    @RequestMapping("wxlogin")
    public Object doLogin(HttpServletRequest req){
        // 用户授权后微信回调地址
        String backUrl = "/callback";
        @SuppressWarnings("deprecation")
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+AuthUtils.APPID
                + "&redirect_uri="+URLEncoder.encode(backUrl)
                + "&response_type=code"
                + "&scope=snsapi_userinfo "
                + "&state=STATE#wechat_redirect";
        
        return "redirect:"+url;
    }
    
    /**
     * 第二步:通过code换取网页授权access_token
     * 回调地址-得到code,从而去获得access_token 和 openid
     */
    @RequestMapping("/callback")
    public ModelAndView doCallBack(HttpServletRequest req)throws Exception{
        String code = req.getParameter("code");
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+AuthUtils.APPID
                + "&secret="+AuthUtils.APPSECRET
                + "&code="+code
                + "&grant_type=authorization_code";
        JSONObject jsonObject = AuthUtils.doGetJson(url);
        String openid = jsonObject.getString("openid");
        String access_token = jsonObject.getString("access_token");
        // 第三步:刷新access_token(如果需要)
        // 此处省略
        
        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
                + "&openid="+openid
                + "&lang=zh_CN";
        JSONObject userInfo = AuthUtils.doGetJson(infoUrl);
        System.out.println("用户信息:"+userInfo);
        ModelAndView mv = new ModelAndView("success");
        mv.addObject("info",userInfo);
        String unionid = userInfo.getString("unionid");
        
        // 1.使用微信用户信息直接登录,无须注册和绑定,直接跳转到登录成功界面
        //ModelAndView mv = new ModelAndView("success");
        //mv.addObject("info",userInfo);
        //return mv;
        
        // 2.将微信与当前系统的账号进行绑定,绑定后跳转到登录成功界面
        User user = userRepository.findByunionid(unionid);
        if(null != user && (!Objects.equals("", user.getNickname()))){
            // 已绑定,直接跳转绑定成功的页面
            mv.setViewName("bindsuccess");
            mv.addObject("nickname", user.getNickname());
            return mv;
        }else{
            // 未绑定,跳转到自己系统的登录页面
            mv.setViewName("login");
            mv.addObject("unionid", unionid);
            return mv;
        }
    }
    
    /**
     * 登录并绑定微信账号
     */
    @PostMapping("/bindwx")
    public Object bindwx(User user){
        userRepository.save(user);
        return "账号绑定成功";
    }
}

第四章:微信开放平台介绍

4-1 微信开放平台介绍

微信开放平台

地址:https://open.weixin.qq.com/

注册并登录成功后,需进行开发者认证

clipboard.png

第五章:基于开放平台登录

5-1 开放平台授权登录

接口文档

路径:网站应用》网站应用微信登录开发指南
地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

开发方式与使用微信公众号登录的方式类似,仅仅可能是调用的微信接口地址不同而已,就不提供代码演示了,源码请到我的github地址查看。

第六章:公众号与开发平台关联

6-1 公众号与开放平台关联

情景说明:

当使用pc端进行微信授权登录时,得到的openid和公众号授权登录时得到的openid不一样。

为什么不一样

当我们在微信公众号里面绑定了并且授权了应用A的时候,会产生一个openid。而在开放平台授权应用A的时候,又会参数另外一个openid。它们两个是完全独立的,即微信公众号与开放平台之间是相互独立的,它们之间并没有关联关系。

在开放平台里面绑定公众账号

clipboard.png

开放平台与公众账号之间的关系是如何体现的

使用UnionID机制

什么是UnionID机制

比如像万达集团,万达影业与万达百货希望做到会员卡通用。
微信在这里做了一个打通机制,对于同一个企业,在用户属性里面加了一个企业属性(UnionID),
方便同一个企业在不同的产品中识别到同一个用户。

如何识别是同一个企业

只要绑定在同一个开放平台下所有移动应用、网站应用、微信公众号都具备同一个UnionID

即在绑定微信账号时,不再使用openid字段进行绑定,使用unionid字段进行绑定即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值