1.      注册一个微信订阅号。https://mp.weixin.qq.com。进入【开发者工具】,然后进入【公众平台测试账号】。

Java版的pureMVC JAVA版的微信还可以登录么_Java微信登陆

2.      在开发者工具里面获取APPID和appsecret。

Java版的pureMVC JAVA版的微信还可以登录么_Java版的pureMVC_02

3.      扫描关注测试号二维码。

Java版的pureMVC JAVA版的微信还可以登录么_Java_03

4.      网页授权获取用户基本信息,点击修改,这个域名是填写你内网穿透的外网访问域名,不允许前面带http和带端口之类的。

Java版的pureMVC JAVA版的微信还可以登录么_java_04

Java版的pureMVC JAVA版的微信还可以登录么_微信登陆_05

5.      使用内网穿透,我之前使用花生壳,有个坑,卖了6元内网穿透免费版,这个是非80端口的,外网访问地址是带端口号的。而上面第四步填写的授权回调页面域名不能带端口的外网访问地址,这样就导致无法跳转,需要使用80端口,这样外网访问地址不带端口号,花生壳的80端口太贵了。

Java版的pureMVC JAVA版的微信还可以登录么_Java微信登陆_06

后来改用nat123,界面风格丑了点,但是80端口不算贵,充值了8元。内网地址填写你的电脑IP地址。

Java版的pureMVC JAVA版的微信还可以登录么_微信登陆_07

6.      进入官方开发者文档,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

进入【微信网页授权】。

第一步:用户同意授权,获取code。

Java版的pureMVC JAVA版的微信还可以登录么_java_08

直接复制上面的链接,填写的顺序不能调整。

Java版的pureMVC JAVA版的微信还可以登录么_Java版的pureMVC_09

redirect_uri回调的地址,当点击授权后,会跳转到这个地址,填写你之前内网穿透的外网访问地址。

scope应用授权作用域,填写snsapi_userinfo,不然拿不到呢称等信息。

代码如下:

package cn.felix.wechat.web;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.felix.wechat.utils.WeChatUtils;
import javax.servlet.annotation.WebServlet;
/**
 * 微信登陆
 */
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //返回的回调地址,
        String redirectUri = "http://55095ba.nat123.cc/WeChat/callBack";
        
        /**
         * 1 第一步:用户同意授权,获取code,
         * redirect_uri,执行的回调地址
         */
        String codeurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+WeChatUtils.APPID
                + "&redirect_uri="+URLEncoder.encode(redirectUri)
                + "&response_type=code"
                + "&scope=snsapi_userinfo"
                + "&state=STATE#wechat_redirect";
        
        //重定向
        response.sendRedirect(codeurl);   
    }     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}


第二步:通过code换取网页授权access_token

Java版的pureMVC JAVA版的微信还可以登录么_微信登陆_10

直接复制链接,填写上面传回来的code,APPID和appsecret,

把格式转换成JSON格式后,获取到access_token和openid,下面会用到。

 

第三步:刷新access_token(如果需要)略

 

第四步:拉取用户信息(需scope为 snsapi_userinfo)

直接复制链接,填写上面获取到的access_token和openid。

转换成JSON格式,里面包含了用户的信息,输入到页面上就可以。

Java版的pureMVC JAVA版的微信还可以登录么_微信登陆_11

代码如下:

package cn.felix.wechat.web;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.felix.wechat.entity.User;
import cn.felix.wechat.service.LoginService;
import cn.felix.wechat.utils.WeChatUtils;
import net.sf.json.JSONObject;

/**
 * 
 */
public class CallBackServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("进入CallBackServlet");
		
		//用户授权后,获取微信返回的code的值
		String code = request.getParameter("code");
		
		//2 第二步:通过code换取网页授权access_token
		String access_tokenurl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WeChatUtils.APPID
				+ "&secret="+WeChatUtils.APPSECRET
				+ "&code="+code
				+ "&grant_type=authorization_code";
		
		//转化成JSON
		
		JSONObject jsonObject = WeChatUtils.getJSONObject(access_tokenurl);
		//获取地址中的access_token和openid
	     String access_token =jsonObject.getString("access_token");
	     String openid= jsonObject.getString("openid");
	     
	     System.out.println("access_token===="+access_token);
	     System.out.println("openid===="+openid);
	     
	     
	     //第四步:拉取用户信息(需scope为 snsapi_userinfo)
	     String snsapiUserinfo = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
	     		+ "&openid="+openid
	     		+ "&lang=zh_CN";
		//转换成JSON格式
	     
	     JSONObject userinfo = WeChatUtils.getJSONObject(snsapiUserinfo);
	     
	     System.out.println("userinfo====="+userinfo);
	     
	     //检验授权凭证(access_token)是否有效
	     String textUrl = "https://api.weixin.qq.com/sns/auth?access_token="+access_token
	    		 + "&openid="+openid;
	     System.out.println("textUrl===="+textUrl);
	    
	     /**
	      * 如果没有账号,直接获取微信账号登陆
	      * */
	     request.setAttribute("info", userinfo);
	     request.getRequestDispatcher("/info.jsp").forward(request, response);
	 }
}



7.      可以把access_token和openid填进测试的链接,返回{ "errcode":0,"errmsg":"ok"}正确。

Java版的pureMVC JAVA版的微信还可以登录么_Java版的pureMVC_12

 

8.      如果是JSONObject["access_token"] not found.这个报错,有可能没设置ip白名单,进入基本配置,设置一下ip白名单

Java版的pureMVC JAVA版的微信还可以登录么_微信登陆_13

Java版的pureMVC JAVA版的微信还可以登录么_Java_14

 第一次接触微信开发,借鉴了很多前辈的东西。