我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化
网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的。现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你。
请看流程图!看懂图,就懂了一半了:
其实整体流程大体只需三步:用户点击登录按钮(其实就相当于一个链接) ---》 用户点击授权登录 ----》 实现获取用户信息代码。
然后获取用户信息代码只需三步:获取code ----》 通过code获取access_token和openId ---》 通过access_token和openId获取用户信息(包含union)。
以上便是整体套路,当然官网上也有,但具体如何实现呢?
不着急,咱们一步一步来!
第一步:微信登录按钮
它其实就是一个连接,不过想得到这个链接,有一点点麻烦。
1、设置。 微信公众平台---》接口权限---》网页授权---》修改 ---》设置网页授权域名(域名,不含http://),其实就是微信调你的java方法的项目路径或项目域名,如:www.zzff.net/pp ---》点击设置后弹出页面(大致意思,将MP_verify_31qRIDcjN8ZD1lVJ.txt放在你项目路径下面,如:www.ffzz.net/pp/MP_verify_31qRIDcjN8ZD1lVJ.txt 能访问到) ---》点击确认,授权回调页面域名设置成功!
2、拼链接。 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx公众号IDxxxxx & redirect_uri = 授权回调页面域名/你的action(即微信授权后跳向的地址)
& response_type=code(固定的) & scope = snsapi_userinfo(或者snsapi_base默认授权) & state=STATE#wechat_redirect
如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
这个链接中参数的具体含义,官方解释如下:
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
第二步:授权确认登录
这一步最简单,第一步登录链接拼好后,在手机微信中打开,微信便会跳转到确认授权页面,点击确认授权即可。(这一步,不用开发者做处理!)
第三步:获取用户信息 (重点)
这一步便是真正的代码实现的地方。开篇便讲了,它只需三步:获取code ----》 通过code获取access_token和openId ---》 通过access_token和openId获取用户信息。
First: 获取code
Second: 获取网页授权access_token和openId
Third:通过access_token和openId获取用户信息。
关于union机制的细节:如果开发者需要公众号微信登录和APP微信登录共用一个微信ID,那个就需要union机制了。其实很简单,只需在微信开放平台(open.weixin.qq.com)绑定公众号,获取用户信息时就会返回union字段。
具体代码实现为:实体 ---- 方法 --- 工具
实体Oauth2Token:
1 package com.wfcm.wxUitls; 2 3 /** 4 * 类名: WeixinOauth2Token </br> 5 * 描述: 网页授权信息 </br> 6 * 创建时间: 2015-11-27 </br> 7 * 发布版本:V1.0 </br> 8 */ 9 public class Oauth2Token { 10 // 网页授权接口调用凭证 11 private String accessToken; 12 // 凭证有效时长 13 private int expiresIn; 14 // 用于刷新凭证 15 private String refreshToken; 16 // 用户标识 17 private String openId; 18 // 用户授权作用域 19 private String scope; 20 21 public String getAccessToken() { 22 return accessToken; 23 } 24 25 public void setAccessToken(String accessToken) { 26 this.accessToken = accessToken; 27 } 28 29 public int getExpiresIn() { 30 return expiresIn; 31 } 32 33 public void setExpiresIn(int expiresIn) { 34 this.expiresIn = expiresIn; 35 } 36 37 public String getRefreshToken() { 38 return refreshToken; 39 } 40 41 public void setRefreshToken(String refreshToken) { 42 this.refreshToken = refreshToken; 43 } 44 45 public String getOpenId() { 46 return openId; 47 } 48 49 public void setOpenId(String openId) { 50 this.openId = openId; 51 } 52 53 public String getScope() { 54 return scope; 55 } 56 57 public void setScope(String scope) { 58 this.scope = scope; 59 } 60 }
View Code
实体SNSUserInfo:
1 package com.wfcm.wxUitls; 2 3 import java.util.List; 4 5 /** 6 * 类名: SNSUserInfo </br> 7 * 描述: 通过网页授权获取的用户信息 </br> 8 * 开发人员: wzf </br> 9 * 创建时间: 2015-11-27 </br> 10 * 发布版本:V1.0 </br> 11 */ 12 public class SNSUserInfo { 13 // 用户标识 14 private String openId; 15 // 用户昵称 16 private String nickname; 17 // 性别(1是男性,2是女性,0是未知) 18 private int sex; 19 // 国家 20 private String country; 21 // 省份 22 private String province; 23 // 城市 24 private String city; 25 // 用户头像链接 26 private String headImgUrl; 27 // 用户特权信息