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

来源:互联网 发布:重庆外包网络推广 编辑:程序博客网 时间:2024/06/15 01:35

之前没有接触过微信开发,出来工作后第一份工作是做微信开发,我的任务只是写一个接口。

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

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());@Autowiredprivate 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

原创粉丝点击