admin管理员组

文章数量:1559067

微信公众号中使用oauth2.0进行授权,获取用户的基本信息的过程。详细的开发文档可查看微信的官方文档。
微信公众平台开发者文档:
http://mp.weixin.qq/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
首先要配置一下我们的公众号:
1、配置回调函数
  我们在微信客户端访问第三方网页(即我们自己的网页)的时候,我们可以通过微信网页授权机制,回调的域名设置,即用户授权后,页面会跳转到哪里。具体的配置如下:
  在接口权限,有一个“网页授权获取用户基本信息”,点击后面的修改
  填写回调的域名
  注意一下:这里填写的是域名(是一个字符串),而不是url,请勿加http://等协议头
   现在我们的重头戏来了
   微信授权登录并获取用户基本信息
  微信授权使用的是oauth2.0授权的方式。主要有以下简略步骤:

  • 第一步:用户同意授权,获取code
  • 第二步:通过code换取网页授权access_token
  • 第三步:刷新access_token(如果需要)
  • 第四步:拉取用户信息(需scope为 snsapi_userinfo)
    1)、用户授权并获取code
    首先引导用户进入授权界面(比如可以点击菜单栏的按钮触发)
function(data){
				var appid = data.appid;
				//声明授权后要跳转的方法链接
				var redirect_uri = encodeuricomponent('http://xxxxx.do);
				//引导用户进入授权界面
				var url='https://open.weixin.qq/connect/oauth2/authorize?appid='  appid 
					'&redirect_uri='  redirect_uri  
					'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect';
		    	location.href = url; 
			}


code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
如果用户同意授权,页面将跳转至 redirect_uri/?code=code&state=state。
2)、通过code换取网页授权access_token

@requestmapping(value = "/auth", method = requestmethod.get)
	public modelandview auth(@requestparam("code") string code, string view, httpsession session) {
//		system.out.println(code);
		// 第三方用户唯一凭证
		string appid = jsdkcommonutil.getprojsdk().getproperty("appid");
		// 第三方用户唯一凭证密钥
		string appsecret = jsdkcommonutil.getprojsdk().getproperty("appsecret");
		//获取网页授权access_token
		string url = "https://api.weixin.qq/sns/oauth2/access_token?appid="  appid  "&secret="  appsecret  "&code="
				 code  "&grant_type=authorization_code";
		resttemplate resttemplate = new resttemplate();
		string openid = "";
		try {
			string response = resttemplate.getforobject(url, string.class);
			string[] info = response.split(":");
			openid = response.split(":")[4].split(",")[0].replaceall("\"", "");
//			system.out.println(openid);
		} catch (exception e) {
			system.out.println("233333");
		}

工具类

package com.gx.util;
import java.io.ioexception;
import java.util.hashmap;
import java.util.iterator;
import java.util.map;
import java.util.properties;
import java.util.uuid;
import com.gx.vo.jsdkparam;
import com.gx.web.test;
import net.sf.json.jsonobject;
public class jsdkcommonutil {
       
	private static properties projsdk=null;
	public static final properties getprojsdk() {
		return projsdk;
	}
	public static final void setprojsdk(properties projsdk) {
		jsdkcommonutil.projsdk = projsdk;
	}
	static{
		projsdk=new properties();
		try {
			
			projsdk.load(thread.currentthread().getcontextclassloader().getresourceasstream("jdbc.properties"));
		} catch (ioexception e) {
			// todo auto-generated catch block
			e.printstacktrace();
		} 
	}
     //获取
	 public object returnjsdkapi(string url){
		 string xml = httpxmlclient.get("https://api.weixin.qq/cgi-bin/ticket/getticket?access_token=" test.access_token "&type=jsapi");
			jsonobject jsonmap  = jsonobject.fromobject(xml);
			map<string, string> map = new hashmap<string, string>();
	        iterator<string> it = jsonmap.keys();
	        while(it.hasnext()) {  
	            string key = (string) it.next();  
	            string u = jsonmap.get(key).tostring();
	            map.put(key, u);  
	        }
	        string jsapi_ticket = map.get("ticket");
	        //获取签名signature
	        string noncestr = uuid.randomuuid().tostring();
	        string timestamp = long.tostring(system.currenttimemillis() / 1000);
	        string str = "jsapi_ticket="  jsapi_ticket 
	                "&noncestr="  noncestr 
	                "×tamp="  timestamp 
	                "&url="  url;
	        //sha1加密
	        string signature = httpxmlclient.sha1(str);
	        jsdkparam jsdkparam=new jsdkparam();
	        jsdkparam.setappid(projsdk.getproperty("appid"));
	        jsdkparam.setnoncestr(noncestr);//自定义随机字符串
	        jsdkparam.setsignature(signature);//签名
	        jsdkparam.settimestamp(timestamp);//时间截
	        return jsdkparam;
 
	 }
	 
	 
	 public string returnaccesstoken() {
        stringbuilder stringbuilder=new stringbuilder("https://api.weixin.qq/cgi-bin/token?grant_type=client_credential&appid=");
        stringbuilder.append(projsdk.getproperty("appid"));
        stringbuilder.append("&secret=");
        stringbuilder.append(projsdk.getproperty("appsecret"));
        string xml = httpxmlclient.get(stringbuilder.tostring());
        jsonobject jsonmap  = jsonobject.fromobject(xml);
        map<string, string> map = new hashmap<string, string>();
        iterator<string> it = jsonmap.keys();
        while(it.hasnext()) {  
            string key = (string) it.next();  
            string u = jsonmap.get(key).tostring();
            map.put(key, u);  
        }
        //获取access_token
        string access_token = map.get("access_token");
       return access_token;
		
	 }
	
	
	
}

3)、刷新access_token(如果需要)
这个比较简单就不细说了。
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

获取第二步的refresh_token后,请求以下链接获取access_token:
https://api.weixin.qq/sns/oauth2/refresh_token?appid=appid&grant_type=refresh_token&refresh_token=refresh_token
4)、拉取用户信息

  /**
   * 获取用户信息
   * @param accesstoken 接口访问凭证
   * @param openid 用户标识
   * @return weixinuserinfo
   */
  public static weixinuserinfo getuserinfo(string accesstoken, string openid) {
    weixinuserinfo weixinuserinfo = null;
    // 拼接请求地址
    string requesturl = "https://api.weixin.qq/cgi-bin/user/info?access_token=access_token&openid=openid";
    requesturl = requesturl.replace("access_token", accesstoken).replace("openid", openid);
    // 获取用户信息
    jsonobject jsonobject = commonutil.httpsrequest(requesturl, "get", null);
    if (null != jsonobject) {
      try {
        weixinuserinfo = new weixinuserinfo();
        // 用户的标识
        weixinuserinfo.setopenid(jsonobject.getstring("openid"));
        // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
        weixinuserinfo.setsubscribe(jsonobject.getint("subscribe"));
        // 用户关注时间
        weixinuserinfo.setsubscribetime(jsonobject.getstring("subscribe_time"));
        // 昵称
        weixinuserinfo.setnickname(jsonobject.getstring("nickname"));
        // 用户的性别(1是男性,2是女性,0是未知)
        weixinuserinfo.setsex(jsonobject.getint("sex"));
        // 用户所在国家
        weixinuserinfo.setcountry(jsonobject.getstring("country"));
        // 用户所在省份
        weixinuserinfo.setprovince(jsonobject.getstring("province"));
        // 用户所在城市
        weixinuserinfo.setcity(jsonobject.getstring("city"));
        // 用户的语言,简体中文为zh_cn
        weixinuserinfo.setlanguage(jsonobject.getstring("language"));
        // 用户头像
        weixinuserinfo.setheadimgurl(jsonobject.getstring("headimgurl"));
      } catch (exception e) {
        if (0 == weixinuserinfo.getsubscribe()) {
          log.error("用户{}已取消关注", weixinuserinfo.getopenid());
        } else {
          int errorcode = jsonobject.getint("errcode");
          string errormsg = jsonobject.getstring("errmsg");
          log.error("获取用户信息失败 errcode:{} errmsg:{}", errorcode, errormsg);
        }
      }
    }
    return weixinuserinfo;
  }
  
  public static void main(string args[]) {
	    // 获取接口访问凭证
	    //string accesstoken = commonutil.gettoken("wx25bbb38cfce0501c", "f7c03720d6fbbf2204fdd0bb084b12ca").getaccesstoken();
	    /**
	     * 获取用户信息
	     */
	    //weixinuserinfo user = getuserinfo(accesstoken, "otmv204lisf-epwei1n-_hqy07zs");
	    system.out.println("openid:"  user.getopenid());
	    system.out.println("关注状态:"  user.getsubscribe());
	    system.out.println("关注时间:"  user.getsubscribetime());
	    system.out.println("昵称:"  user.getnickname());
	    system.out.println("性别:"  user.getsex());
	    system.out.println("国家:"  user.getcountry());
	    system.out.println("省份:"  user.getprovince());
	    system.out.println("城市:"  user.getcity());
	    system.out.println("语言:"  user.getlanguage());
	    system.out.println("头像:"  user.getheadimgurl());
	  }

本文标签: 网页