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

微信开发(1)-获取openid和userinfo

2017-07-15 00:54 603 查看
之前没有接触过微信开发,出来工作后第一份工作是做微信开发,我的任务只是写一个接口。

进入正题,微信开发,本文的微信开发是指微信公众号开发,本文从微信开发的最基础部分做一个简单的记录,并且附上自己写的一段代码。

openid:openid其实就是一个数据库主键,是腾讯为每个公众号的唯一标识

userinfo:其实就是用户信息,这些可以授权获取到的信息及其有限,就是用户名性别地址之类的

其实微信开发文档写得很清楚了,本人啰嗦了点所以记下来了

一般我们进入一个公众号,它可能会让我们授权,其实这样他就获取到我们的信息,他可以保存到数据库,作为会员信息,这样就省去了注册的一个步骤

首先获取授权这一步,其实是开发者后台获取用户code的一个手段,code可以干嘛?code可以作为一个钥匙,通过微信提供的接口,携带着开发者的appid和秘钥,以及code

就可以获取到用户的openid和accesstoken,其实获取到这2个没什么卵用,然后你可以利用openid和accesstoken通过另外一个接口获取到用户信息,这就有用啦。

以下附上自己写的菜得抠脚的代码,还忘个各位大佬完善一些细节

package wechat.Common;

/**
* Created by sam on 2017/7/13.
*/

/**
* 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
* 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),
* snsapi_userinfo (弹出授权页面可通过openid拿到昵称、性别、所在地。
* 并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
*/
public class URLBean {
public static final String appid = "这个写自己的";
public static final String appsecret = "这个写自己的";
public static final String GETCODE
= "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE#wechat_redirect";
public static final String GETACCESSTOKENANDID
= "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
public static final String REFRESHTOKEN
= "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN ";
//需要用get访问,https协议
public static final String USERINFO
= "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
public static final String BASEURL = "/grant/getCode?visitUrl=VISIT";
public static final String PROJECT_URL = "http://2691670703.tunnel.qydev.com/WeChat";
}

package wechat.Common;

import org.apache.log4j.Logger;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;

/**
* Created by sam on 2017/7/13.
*/
public class WechatFilter implements Filter{

private Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());

public void init(FilterConfig filterConfig) throws ServletException {
//
}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
HttpSession session = request.getSession();
String openId = (String) session.getAttribute("openid");
String URL = request.getRequestURI();
if(isNeedGrant(URL)){
if(openId!=null){
filterChain.doFilter(request,response);
}else{
String queryString = request.getQueryString();
String redirect_url = "";
if(queryString!=null) {
redirect_url = request.getRequestURL().toString()+"?"+queryString;
}else {
redirect_url = request.getRequestURL().toString();
}
String url  = URLBean.PROJECT_URL+URLBean.BASEURL.replace("VISIT",URLEncoder.encode(redirect_url, "UTF-8"));
String target = URLBean.GETCODE.
replace("APPID",URLBean.appid).
replace("SCOPE","snsapi_userinfo").
replace("REDIRECT_URI", url);
response.sendRedirect(target);
}
}else{
filterChain.doFilter(request,response);
}

}

public void destroy() {
//
}
/**
* 需要判断是否拉取openid不然它会无限循环进来
*/
public boolean isNeedGrant(String url){
//判断是否是正在走向我定义好的接口
//		if (url.contains("/grant/getCode")){
//			return true;
//		}
//		return false;
return true;
}
}

package wechat.Common;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import wechat.Entity.WeChatUser;
import wechat.Service.WeChatUserService;

import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
* Created by sam on 2017/7/13.
*/
@Controller
@RequestMapping("/grant")
public class Grant {
private Logger logger = Logger.getLogger(this.getClass());
@Autowired
private WeChatUserService weChatUserService;
//Illegal character in scheme name at index 0
@RequestMapping("/getCode")
public void getCode(HttpServletRequest HttpServletRequest,
HttpServletResponse httpServletResponse)throws Exception{
//这里拉取code,然后重定向到获取openId和accessToken的地址
HttpSession httpSession =  HttpServletRequest.getSession();
String code = HttpServletRequest.getParameter("code");
String redirect_url = HttpServletRequest.getParameter("visitUrl");
redirect_url = URLDecoder.decode(redirect_url,"UTF-8");
String url = URLBean.GETACCESSTOKENANDID.replace("APPID", URLBean.appid).
replace("SECRET", URLBean.appsecret).replace("CODE", code);
String resp = HttpClientUtil.doGet(url);
AccessTokenOpenId ao = JsonUtils.jsonToPojo(resp, AccessTokenOpenId.class);
String openId = ao.getOpenid();
httpSession.setAttribute("openid", openId);
WeChatUser chatUser = weChatUserService.getWeChatUserByOpenId(openId);
if(chatUser==null) {
String userinfojson = HttpClientUtil.doGet(URLBean.USERINFO
.replace("ACCESS_TOKEN",ao.getAccess_token()).replace("OPENID", ao.getOpenid()));
chatUser = JsonUtils.jsonToPojo(userinfojson, WeChatUser.class);
weChatUserService.insert(chatUser);
}
httpSession.setAttribute("user",chatUser);
httpServletResponse.sendRedirect(URLDecoder.decode(redirect_url, "UTF-8"));//跳转用户最原始访问的连接
}

}

里面有一些需要完善的地方,需要各位大佬自己修改一下,我写不出优雅的代码,就这样吧,仅此记录而已 --Sam
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: