失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 微信公众测试号授权登录 学习笔记

微信公众测试号授权登录 学习笔记

时间:2022-07-04 20:43:48

相关推荐

微信公众测试号授权登录 学习笔记

先看看时序图

公众测试号申请网页登录授权步骤java登录案例第一步第二步第三步

公众测试号申请

这里以测试号为基础进行学习

首先微信进入微信公众平台

登录后填写接口配置信息,这步可以先不填,等后台写好代码再回来填写

点击接口权限表下的网页授权获取用户基本信息的修改,然后填写域名(请勿加 http:// 等协议头)

扫描关注

网页登录授权步骤

开始授权获取用户信息,具体而言,网页授权流程分为四步:

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、如果需要,开发者可以刷新网页授权access_token,避免过期

4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

具体步骤看 网页授权文档 按着他步骤来

我们以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。让用户点击以下链接或扫携带此连接的二维码,此链接要修改以下三处地方appid,redirect_uri,state

https://open./connect/oauth2/authorize?appid=自己的appID&redirect_uri=需要跳转的页面&response_type=code&scope=snsapi_userinfo&state=需要携带的参数#wechat_redirect用户同意授权后

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=携带的参数。

code说明 :

code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。获取code后,填写appid,secret,code参数,请求以下链接获取access_tokenopenid:https://api./sns/oauth2/access_token?appid=自己的appID&secret=自己公众测试号的appsecret&code=获取的code&grant_type=authorization_code通过access_token和openid获取用户信息

GET请求https://api./sns/userinfo?access_token=获取的ACCESS_TOKEN&openid=获取的OPENID&lang=zh_CN

请求成功后返回以下用户信息

java登录案例

第一步

我们得回到公众测试号申请第二步进行接口配置,具体查看 消息接口使用指南

以下是验证代码,访问以下接口,检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败

@Controllerpublic class WechatController {@GetMapping("/wechat")public void doGet(HttpServletRequest request, HttpServletResponse response) {// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败PrintWriter out = null;try {out = response.getWriter();if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {out.close();}}}}

微信请求校验工具类

/*** 微信请求校验工具类*/public class SignUtil {// 与接口配置信息中的Token要一致private static String token = "o2o";/*** 验证签名** @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[]{token, timestamp, nonce};// 将token、timestamp、nonce三个参数进行字典序排序Arrays.sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 将字节数组转换为十六进制字符串** @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串** @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}}

第二步

准备请求工具类,接收返回结果的实体类等等

上面网页登录授权的具体步骤:第四步中主要接收access_token和openid的实体类

/*** 用户授权token*/@Datapublic class UserAccessToken {// 获取到的凭证@JsonProperty("access_token")private String accessToken;// 凭证有效时间,单位:秒@JsonProperty("expires_in")private String expiresIn;// 表示更新令牌,用来获取下一次的访问令牌,这里没太大用处@JsonProperty("refresh_token")private String refreshToken;// 该用户在此公众号下的身份标识,对于此微信号具有唯一性@JsonProperty("openid")private String openId;// 表示权限范围,这里可省略@JsonProperty("scope")private String scope;}

最后返回的用户信息类

@Datapublic class WechatUser implements Serializable {private static final long serialVersionUID = 1L;// openId,标识该公众号下面的该用户的唯一Id@JsonProperty("openid")private String openId;// 用户昵称@JsonProperty("nickname")private String nickName;// 性别@JsonProperty("sex")private int sex;// 省份@JsonProperty("province")private String province;// 城市@JsonProperty("city")private String city;// 区@JsonProperty("country")private String country;// 头像图片地址@JsonProperty("headimgurl")private String headimgurl;// 语言@JsonProperty("language")private String language;// 用户权限,这里没什么作用@JsonProperty("privilege")private String[] privilege;}

证书信任管理器(用于https请求)

/*** 证书信任管理器(用于https请求)*/public class MyX509TrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}}

请求工具接收返回结果

public class WechatUtil {/*** 获取UserAccessToken实体类*/public static UserAccessToken getUserAccessToken(String code) throws IOException {// 测试号信息里的appIdString appId = "填上";// 测试号信息里的appsecretString appsecret = "填上";// 根据传入的code,拼接出访问微信定义好的接口的URLString url = "https://api./sns/oauth2/access_token?appid=" + appId + "&secret=" + appsecret+ "&code=" + code + "&grant_type=authorization_code";// 向相应URL发送请求获取token json字符串String tokenStr = httpsRequest(url, "GET", null);UserAccessToken token = new com.yhy.o2o.utils.weixin.message.pojo.UserAccessToken();ObjectMapper objectMapper = new ObjectMapper();try {// 将json字符串转换成相应对象token = objectMapper.readValue(tokenStr, UserAccessToken.class);} catch (Exception e) {e.printStackTrace();} if (token == null) {return null;}return token;}/*** 获取WechatUser实体类*/public static WechatUser getUserInfo(String accessToken, String openId) {// 根据传入的accessToken以及openId拼接出访问微信定义的端口并获取用户信息的URLString url = "https://api./sns/userinfo?access_token=" + accessToken + "&openid=" + openId+ "&lang=zh_CN";// 访问该URL获取用户信息json 字符串String userStr = httpsRequest(url, "GET", null);WechatUser user = new com.yhy.o2o.utils.weixin.WechatUser();ObjectMapper objectMapper = new ObjectMapper();try {// 将json字符串转换成相应对象user = objectMapper.readValue(userStr, com.yhy.o2o.utils.weixin.WechatUser.class);} catch (Exception e) {e.printStackTrace();} if (user == null) {return null;}return user;}/*** 发起https请求并获取结果** @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr提交的数据* @return json字符串*/public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {StringBuffer buffer = new StringBuffer();try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = {new com.yhy.o2o.utils.weixin.MyX509TrustManager()};SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod)) {httpUrlConn.connect();}// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();} catch (Exception e) {e.printStackTrace();}return buffer.toString();}}

第三步

用户开始请求登录,appid,redirect_uri都记得改,如果有参数记得携带上(修改state)

https://open./connect/oauth2/authorize?appid=自己的APPID&redirect_uri=/o2o/wechatlogin/logincheck&role_type=1&response_type=code&scope=snsapi_userinfo&state=参数#wechat_redirect

@Controller@RequestMapping("wechatlogin")@Slf4jpublic class WechatLoginController {@AutowiredWechatAuthService wechatAuthService;@Autowiredprivate ShopService shopService;private static final Integer FRONTEND = 1;private static final Integer SHOPEND = 2;@GetMapping("/logincheck")public String doGet(HttpServletRequest request, HttpServletResponse response) {// 获取微信公众号传输过来的code,通过code可获取access_token,进而获取用户信息String code = request.getParameter("code");// 这个state可以用来传我们自定义的信息,方便程序调用,这里也可以不用String roleType = request.getParameter("state");WechatUser user = null;String openId = null;if (null != code) {UserAccessToken token;try {// 通过code获取access_tokentoken = WechatUtil.getUserAccessToken(code);// 通过token获取accessTokenString accessToken = token.getAccessToken();// 通过token获取openIdopenId = token.getOpenId();// 通过access_token和openId获取用户昵称等信息user = WechatUtil.getUserInfo(accessToken, openId);} catch (IOException e) {e.printStackTrace();}}return null;}}

至此我们就获取到了微信用户信息,接下来去数据库查询相关信息,该登录的登录,注册的注册,存储的存储,进行逻辑编写。

如果觉得《微信公众测试号授权登录 学习笔记》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。