时间: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文件如下
<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>
完成后的项目结构如下
说明:由于条件限制,此项目代码均没有进行测试,这里只是显示大概开发过程。
代码演示:
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/
注册并登录成功后,需进行开发者认证
第五章:基于开放平台登录
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字段进行绑定即可。