1. 注册一个微信订阅号。https://mp.weixin.qq.com。进入【开发者工具】,然后进入【公众平台测试账号】。
2. 在开发者工具里面获取APPID和appsecret。
3. 扫描关注测试号二维码。
4. 网页授权获取用户基本信息,点击修改,这个域名是填写你内网穿透的外网访问域名,不允许前面带http和带端口之类的。
5. 使用内网穿透,我之前使用花生壳,有个坑,卖了6元内网穿透免费版,这个是非80端口的,外网访问地址是带端口号的。而上面第四步填写的授权回调页面域名不能带端口的外网访问地址,这样就导致无法跳转,需要使用80端口,这样外网访问地址不带端口号,花生壳的80端口太贵了。
后来改用nat123,界面风格丑了点,但是80端口不算贵,充值了8元。内网地址填写你的电脑IP地址。
6. 进入官方开发者文档,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
进入【微信网页授权】。
第一步:用户同意授权,获取code。
直接复制上面的链接,填写的顺序不能调整。
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
直接复制链接,填写上面传回来的code,APPID和appsecret,
把格式转换成JSON格式后,获取到access_token和openid,下面会用到。
第三步:刷新access_token(如果需要)略
第四步:拉取用户信息(需scope为 snsapi_userinfo)
直接复制链接,填写上面获取到的access_token和openid。
转换成JSON格式,里面包含了用户的信息,输入到页面上就可以。
代码如下:
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"}正确。
8. 如果是JSONObject["access_token"] not found.这个报错,有可能没设置ip白名单,进入基本配置,设置一下ip白名单
第一次接触微信开发,借鉴了很多前辈的东西。