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

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

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

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

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

Java—发送HTTPS请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值