业务需求就是生成微信二维码 微信扫维码关注公众号,已关注则跳转业务页面,没关注则跳转关注页面
1 生成需要扫的二维码
这个url 可以用草料二维码生成
scope =snsapi_base 这个是静默授权,就是用户扫码后默认获取一些用户信息,
state 这个参数可以带一些信息给业务页面
微信扫一扫后,微信的服务器将页面将跳转至 redirect_uri/?code=CODE&state=STATE。
这里的回调url要用https 不然腾讯的服务器会访问2次,导致第二次用同一个code 访问获取openid的接口出现40163的错误 code 已经使用 如果你用的是测试号不会出现这个问题。
2 获取参数code的值 get 请求到
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID &secret=SECRET&code=CODE&grant_type=authorization_code
3 获得response 的json ,解析出openid ,//这里响应中的access_token是网页授权的access_token 可以无限次调用,和下面的access_token不一样
4 //这步记得要设置服务器的ip 白名单
get 请求到 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET
获取响应中的 access_token 这个access_token 根据微信号的不同,我的测试号是2000次 认证后的号有10W次 可以在申请更多的次数,每次的有效期是7200s
5 获得到openid 和 access_token 后 get 的请求到
//这里的access_token每次请求都要最新的,也就是说调用下面这个接口的时候上面必须请求拿到最新的access_token
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
6 获得接口response 的json ,解析出subscribe
//关注
if(subscribe ==1){
转发到 业务页面 //这个页面要在你设置的域名下面
}else{
转发到关注页面
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU3MzQ1OTU2NQ==&scene=126&bizpsid=0#wechat_redirect
这个生成url 的步骤
点击公众号主页面,点击全部消息,右上角的。。。 复制链接 就是这个公众号的关注页面了
}
代码如下
这里用到是原生的servlet
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import util.PostAndGet;
import util.tokenUtil;
/**
* Servlet implementation class FollowService
*/
public class FollowService extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");//响应的字符集类型
PrintWriter out = response.getWriter();//设置输出流
String code=(String) request.getParameter("code");
String state=(String) request.getParameter("state");
String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID"
+ "&secret=SECRET&code="+code+"&grant_type=authorization_code";
JSONObject responseJson =PostAndGet.creatGetMsg(url);
//______________________________________________________________________________________________________
String openid = responseJson.get("openid").toString();
String access_token=tokenUtil.getNewToken();
String url2="https://api.weixin.qq.com/cgi-bin/user/info?"
+ "access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
JSONObject responseJson1 =PostAndGet.creatGetMsg(url2);
String subscribe=responseJson1.getString("subscribe");
//关注
if(subscribe.equals("1")) {
out.println("你已经关注了");
out.println(responseJson.toString());
out.println(responseJson1.toString());
}else {
response.sendRedirect
("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=BIZ&scene=126&bizpsid=0#wechat_redirect");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}