前面在写微信公众号开发的时候,我一直有提到一个问题,那就是域名的问题,然后在补充下一个问题是,如果你看了 爱慕课上面讲的网页授权还是发现成功不了,那就可能是HTTPS请求的方式有问题了
目前以测试号为例
这个域名相对于来说就没有那么多的要求,就会简单很多
而关于这个域名,就不要出现二级域名的情况,避免跨域请求的出现;
如果你的域名不对的话可能会出现的问题:微信公众号—-多次请求,状态码(40001)
近段时间通过慕课的伙伴还发现一个这种问题,就是当你和慕课上面的代码一模一样的话,可能这个问题也会存在,就是微信公众号—-多次请求,状态码(40001)
debug了下发现问题出现在HTTPS请求这边,可以用这篇文章中HTTPS请求进行代替慕课网中的请求:Java—发送HTTPS请求
下面我贴一下我的代码:
接口配置信息的URL:花生壳
网页授权回调页面域名:NATAPP
jar包
代码结构:
util:
util里面的代码:Java—发送HTTPS请求这里面的是一样的
pojo:
Info.java
package pojo;
import java.util.List;
/**
* 通过网页授权获取用户信息
* Created by admin on 2017/11/15.
*/
public class Info {
// 用户标识
private String openid;
// 用户昵称
private String nickname;
// 性别(1是男性,2是女性,0是未知)
private int sex;
// 国家
private String country;
// 省份
private String province;
// 城市
private String city;
// 用户头像链接
private String headimgurl;
// 用户特权信息
private List<String> privilege;
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public List<String> getPrivilege() {
return privilege;
}
public void setPrivilege(List<String> privilege) {
this.privilege = privilege;
}
@Override
public String toString() {
return "Info{" +
"openid='" + openid + '\'' +
", nickname='" + nickname + '\'' +
", sex=" + sex +
", country='" + country + '\'' +
", province='" + province + '\'' +
", city='" + city + '\'' +
", headimgurl='" + headimgurl + '\'' +
", privilege=" + privilege +
'}';
}
}
Token.java
package pojo;
/**
* 网页授权信息
* Created by admin on 2017/11/15.
*/
public class Token {
// 网页授权接口调用凭证
private String access_token;
// 凭证有效时长
private int expires_in;
// 用于刷新凭证
private String refresh_token;
// 用户标识
private String openid;
// 用户授权作用域
private String scope;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public int getExpires_in() {
return expires_in;
}
public void setExpires_in(int expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
@Override
public String toString() {
return "Token{" +
"access_token='" + access_token + '\'' +
", expires_in=" + expires_in +
", refresh_token='" + refresh_token + '\'' +
", openid='" + openid + '\'' +
", scope='" + scope + '\'' +
'}';
}
}
servlet:
BaseServlet.java
package servlet;
import com.google.gson.Gson;
import javax.servlet.http.HttpServlet;
/**
* Created by admin on 2017/12/7.
*/
public class BaseServlet extends HttpServlet {
private String APPID = "wx2e****a800****";
private String APPSECET = "4****34****e****0c2****4f5****";
Gson gson = new Gson();
public String getAPPID() {
return APPID;
}
public String getAPPSECET() {
return APPSECET;
}
}
LoginServlet.java
package servlet;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/wxLogin")
public class LoginServlet extends BaseServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String backUrl = "http://dqvzxy.natappfree.cc/WeixinAuth/callBack";
String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+getAPPID()
+ "&redirect_uri="+URLEncoder.encode(backUrl)
+ "&response_type=code"
+ "&scope=snsapi_userinfo"
+ "&state=STATE#wechat_redirect";
resp.sendRedirect(url);
}
}
CallBackServlet.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pojo.Info;
import pojo.Token;
import util.HttpsREQUEST;
@WebServlet("/callBack")
public class CallBackServlet extends BaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String code = req.getParameter("code");
System.out.println("....." + code);
// 页面授权第二步,通过code换取 access_token openid
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + getAPPID()
+ "&secret=" + getAPPSECET()
+ "&code=" + code
+ "&grant_type=authorization_code";
String s = null;
try {
// 发送HTTPS请求, GET请求这个文档有写,然后注意是GET或者POST都是大写 没有参数所以最后一个为null,
s = HttpsREQUEST.HttpsRequest(url, "GET", null);
} catch (Exception e) {
e.printStackTrace();
}
// Gson的使用 : Json字符串转化为到java实体的
Token token = gson.fromJson(s, Token.class);
// 实体类的封装获取
String access_token = token.getAccess_token();
String openid = token.getOpenid();
// 页面授权第四步,通过 access_token openid 换取 用户信息 下面就和上面的一样了
String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token
+ "&openid=" + openid
+ "&lang=zh_CN ";
String info = null;
try {
info = HttpsREQUEST.HttpsRequest(infoUrl, "GET", null);
} catch (Exception e) {
e.printStackTrace();
}
Info infos = gson.fromJson(info, Info.class);
//1、使用用户信息直接登录,无需注册和绑定
req.setAttribute("info", infos);
req.getRequestDispatcher("/newjsp.jsp").forward(req, resp);
}
}
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device--width,initial-scale=1.0">
<title>JSP Page</title>
</head>
<body style="font-size: 40px;text-align: center">
<a href="/WeixinAuth/wxLogin">微信登录</a>
</body>
</html>
newjsp.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
登录成功!
<div>用户昵称${info.nickname}</div>
<div>用户头像<img style="vertical-align: top;" width="100px" height="100px" alt="" src="${info.headimgurl}"></div>
</body>
</html>
网页授权大概就到这里了,后续有机会的话应该会帖微信支付的代码