资讯专栏INFORMATION COLUMN

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

coordinate35 / 405人阅读

摘要:时间年月日星期六说明本文部分内容均来自慕课网。第六章公众号与开发平台关联公众号与开放平台关联情景说明当使用端进行微信授权登录时,得到的和公众号授权登录时得到的不一样。

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

第一章:课程介绍 1-1 课程介绍

课程内容

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

微信登录介绍

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

手机授权登录页

实现方式

没有自己的账号体系,直接拉取微信用户信息来进行网站登录。
有自己的账号体系,授权成功后需要绑定自己的账号。
第三章:基于公众号的登录 3-1 公众号授权登录

接口文档

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

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


    4.0.0

    com.myimooc
    wxdevauth
    0.0.1-SNAPSHOT
    jar

    wxdevauth
    http://maven.apache.org

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.1.RELEASE
         
    

    
        UTF-8
        UTF-8
    

    
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            mysql
            mysql-connector-java
        
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
        
            com.alibaba
            fastjson
            1.2.36
        
        
        
            org.apache.httpcomponents
            httpclient
        
        
        
          commons-codec
          commons-codec
            
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    

完成后的项目结构如下

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

代码演示:

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

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

第五章:基于开放平台登录 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。它们两个是完全独立的,即微信公众号与开放平台之间是相互独立的,它们之间并没有关联关系。

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

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

使用UnionID机制

什么是UnionID机制

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

如何识别是同一个企业

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67599.html

相关文章

  • 课网_《Spring Boot 发送邮件》学习总结

    摘要:慕课网发送邮件学习总结时间年月日星期六说明本文部分内容均来自慕课网。 慕课网《Spring Boot 发送邮件》学习总结 时间:2018年09月08日星期六 说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com 教学源码:https://github.com/ityouknow/... 学习源码:https://github.com/zccoder...

    Meathill 评论0 收藏0
  • 课网_《初识Java微信公众号开发》学习总结

    摘要:时间年月日星期五说明本文部分内容均来自慕课网。本套课程介绍微信公众号开发,主要涉及公众号介绍编辑模式介绍开发模式介绍等。慕课网是垂直的互联网技能免费学习网站。 时间:2017年08月11日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github...

    PrototypeZ 评论0 收藏0
  • 课网_《Java图片验证码》学习总结

    时间:2017年07月09日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 课程概述 主要内容 验证码历史 课程内容 不同方案对比 设计与实现 总结 1-2 验证码历史 验证码历史 无验证码:垃圾骚扰 Luis von Ahn:Captcha 不断...

    haitiancoder 评论0 收藏0
  • 课网_《Docker入门》学习总结

    摘要:时间年月日星期六说明本文部分内容均来自慕课网。必填用于执行命令,当执行完毕后,将产生一个新的文件层。可选指定此镜像启动时默认执行命令。可选用于指定需要暴露的网络端口号。可选向镜像中挂载一个卷组。 时间:2017年09月16日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com 教学源码:无 学习源码:无 第一章:课程简介 1-1 课程介绍 Docke...

    CoorChice 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<