您的位置:首页 > 移动开发 > 微信开发

Java微信公众号--3--网页授权的一些问题

2017-12-13 10:38 453 查看
前面在写微信公众号开发的时候,我一直有提到一个问题,那就是域名的问题,然后在补充下一个问题是,如果你看了 爱慕课上面讲的网页授权还是发现成功不了,那就可能是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/1
4000
5.
*/
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>


网页授权大概就到这里了,后续有机会的话应该会帖微信支付的代码

Java微信公众号–1–基本配置接入开发者模式

Java微信公众号–2–微信菜单和消息管理

Java—发送HTTPS请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信 java