慕课网_《微信受权登陆》学习总结

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

第一章:课程介绍

1-1 课程介绍

课程内容mysql

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

第二章:登陆方式介绍

2-1 登陆方式介绍

微信登陆介绍git

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

手机受权登陆页github

clipboard.png

实现方式web

没有本身的帐号体系,直接拉取微信用户信息来进行网站登陆。
有本身的帐号体系,受权成功后须要绑定本身的帐号。

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

3-1 公众号受权登陆

接口文档spring

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

建立名为wxdevauth的maven项目,POM文件以下sql

<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>

完成后的项目结构以下apache

clipboard.png

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

代码演示:api

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字段进行绑定便可。

相关文章
相关标签/搜索