时间:2017年08月12日星期六
说明:本文部份内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...java
课程内容mysql
课程介绍 登陆方式介绍 基于微信公众号受权登陆 微信开放平台介绍 基于微信开放平台实现受权登陆 微信公众号与微信开放平台关联整合
微信登陆介绍git
微信开放平台 微信公众号(微信公众平台)
手机受权登陆页github
实现方式web
没有本身的帐号体系,直接拉取微信用户信息来进行网站登陆。 有本身的帐号体系,受权成功后须要绑定本身的帐号。
接口文档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
说明:因为条件限制,此项目代码均没有进行测试,这里只是显示大概开发过程。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 "帐号绑定成功"; } }
微信开放平台
地址:https://open.weixin.qq.com/
注册并登陆成功后,需进行开发者认证
接口文档
路径:网站应用》网站应用微信登陆开发指南 地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
开发方式与使用微信公众号登陆的方式相似,仅仅多是调用的微信接口地址不一样而已,就不提供代码演示了,源码请到个人github地址查看。
情景说明:
当使用pc端进行微信受权登陆时,获得的openid和公众号受权登陆时获得的openid不同。
为何不同
当咱们在微信公众号里面绑定了而且受权了应用A的时候,会产生一个openid。而在开放平台受权应用A的时候,又会参数另一个openid。它们两个是彻底独立的,即微信公众号与开放平台之间是相互独立的,它们之间并无关联关系。
在开放平台里面绑定公众帐号
开放平台与公众帐号之间的关系是如何体现的
使用UnionID机制
什么是UnionID机制
好比像万达集团,万达影业与万达百货但愿作到会员卡通用。 微信在这里作了一个打通机制,对于同一个企业,在用户属性里面加了一个企业属性(UnionID), 方便同一个企业在不一样的产品中识别到同一个用户。
如何识别是同一个企业
只要绑定在同一个开放平台下全部移动应用、网站应用、微信公众号都具有同一个UnionID
即在绑定微信帐号时,再也不使用openid字段进行绑定,使用unionid字段进行绑定便可。