工具类(一)-----微信工具类

前些天做微信授权登录用到了一些关于调用微信接口的东西,写了个工具类分享给大家,如有问题欢迎大家批评指正!!!

package com.iyiqiba.utility;

import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.iyiqiba.common.WChartUser;
import com.iyiqiba.common.OAuthAccessToken;

/**
 * 微信工具类
 * @author ZSQ 2017年6月4日20:49:34
 *
 */
public class WChartUtils {

    private static Logger log = LoggerFactory.getLogger(WChartUtils.class);

    public final static String APPID = "wx6a42b00945e04c";

    public final static String APPSECRET = "05e78940a491423c47185e7ccb8ee"; 

    //获取用户详细信息
    public final static String SCOPE_INFO = "snsapi_userinfo";

    //近获取用户open_id
    public final static String SCOPE_BASE = "snsapi_base";

    //微信请求接口地址  
    //获取access_token 接口地址   Get
    public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    //获取网页授权登录access_token 接口地址Get
    public final static String OAUTH_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

    //获取授权登录用户信息 接口地址Get
    public final static String OAUTH_WCHAT_USER_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";

    public final static String OAUTH_LOGIN_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

    //access_token有效时间 时间有时间是7200 为了防止延时导致获取access_token的间断
    public static long expires_in = 7100;

    //上次获取access_token时间
    private static Long lastGetAccessTokenTime = 0L;

    //当前access_token值
    private static String access_token = null;

    /***
     * 获取access_token 
     * @return access_token
     * @throws IOException
     */
    public static String getAccessToken() throws IOException{
        if (access_token == null) {//当前没有获取access_token
            access_token = refreshAccessToken();
        }else {//已经获取过access_token
            Long curTime = System.currentTimeMillis();
            if ((curTime-lastGetAccessTokenTime)/1000 >= expires_in) {
                access_token = refreshAccessToken();
            }
        }       
        return access_token;
    }

    /***
     * 刷新access_token 
     * @return access_token
     * @throws IOException
     */
    public static String refreshAccessToken() throws IOException{
        lastGetAccessTokenTime = System.currentTimeMillis();
        String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);  
        String result = HttpsRequest.sendGet(url);
        JSONObject json = JSONObject.parseObject(result);
        String token = (String) json.get("access_token");       
        if (token == null) {
            String errorCode = (String) json.get("errcode");
            String errorMsg = (String) json.get("errmsg");
            log.error("获取access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
        }   
        return token;
    }

    /**
     * 获取授权登录access_token
     * @param code
     * @return
     * @throws IOException
     */
    public static OAuthAccessToken getOAuthAccessToken(String code) throws IOException{
        String url = OAUTH_ACCESS_TOKEN_URL.replace("APPID", APPID).replace("SECRET", APPSECRET).replace("CODE", code); 
        String result = HttpsRequest.sendGet(url);
        JSONObject json= JSONObject.parseObject(result);
        String token = json.getString("access_token");

        if(token == null){
            String errorCode = json.getString("errcode");
            String errorMsg = json.getString("errmsg");
            System.out.println(json.toString());
            log.error("获取授权登录access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
            return null;
        }       

        OAuthAccessToken accessToken = (OAuthAccessToken) JSONObject.parseObject(result, OAuthAccessToken.class);
        return accessToken;
    }

    /**
     * 获取用户信息 
     * @return 
     * @throws IOException
     */
    public static WChartUser getOAuthUserInfo(String code) throws IOException{
        OAuthAccessToken accessToken = WChartUtils.getOAuthAccessToken(code);
        if (accessToken == null) {
            return null;
        }
        String token = accessToken.getAccess_token();
        String openid = accessToken.getOpenid();
        String url = OAUTH_WCHAT_USER_URL.replace("ACCESS_TOKEN", token).replace("OPENID", openid);
        String result = HttpsRequest.sendGet(url);
        JSONObject jsonObject = JSONObject.parseObject(result);
        openid = jsonObject.getString("openid");

        if(openid == null){
            String errorCode = jsonObject.getString("errcode");
            String errorMsg = jsonObject.getString("errmsg");
            System.out.println(jsonObject.toString());
            log.error("获取access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
            return null;
        }

        WChartUser user = JSONObject.parseObject(result, WChartUser.class);
        return user;
    }   

    public static String getOAuthLoginUrl(String redirectUrl, String scope){
        return OAUTH_LOGIN_URL.replace("APPID", APPID).replace("REDIRECT_URI", redirectUrl)
                .replace("SCOPE", scope);
    } 

    public static void main(String []args) throws Exception{
        //WChartUtils.getOAuthUserInfo("123");
//      String result = "{ \"access_token\":\"ACCESS_TOKEN\", \"expires_in\":7200, \"refresh_token\":\"REFRESH_TOKEN\", \"openid\":\"OPENID\", \"scope\":\"SCOPE\" }";
//      System.out.println(result);
//      OAuthAccessToken accessToken = JSONObject.parseObject(result, OAuthAccessToken.class);
//      System.out.println(accessToken.getOpenid());
//      System.out.println(accessToken.getAccess_token());
        System.out.println(WChartUtils.getAccessToken());
    }   
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值