微信开发获取access_token接口的详解

在微信开发中,就有一些接口会涉及到获取接口凭证的接口,开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

比如我们在微信公众号创建菜单中就会有获取接口凭证要去,还有就是微信小程序在做消息推送功能时也会有调用access_token获取微信接口凭证的要求

获取access_token:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数:

grant_type:默认添client_credential

appid:第三方用户唯一凭证 (微信后台中获取)(微信用户唯一的)

secret:第三方用户唯一凭证密钥,即appsecret(微信后台中获取)(微信用户唯一的)

返回过来的参数:

access_token:获取到的凭证(这个凭证是需要保存起来,获取的次数是有限制的)

expires_in:凭证的时间

这个接口凭证,我自己是获取当前的时间搓加上凭证时间保存在数据库中,当使用时凭证时,都会去数据库中查询,用时间去进行比较看是否过期,过期就重新调用接口凭证,除了这种还可以放到Redis缓存中进行保存

代码实例:

Httprequests.java(发送请求的工具类)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
/**
 * <p>User: qrn
 * <p>Date: 14-1-28
 * <p>Version: 1.0
 * 描述: http发起请求:
 */
public class Httprequests {


    public static void main(String[] aegs) {
        String string = Httprequests.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o","");
        System.out.print(string);
    }

    public static String  sendGet (String url,String param) {
        String result ="";
        BufferedReader in  =null;
        try {
            String urlNameString = url +"?" +param;
            System.out.println("发送的链接请求:"+urlNameString);
            URL reaurl = new URL(urlNameString);

            URLConnection connection  = reaurl.openConnection();

            //设置通用
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

            //建立实际的连接
            connection.connect();

            Map<String, List<String>> map = connection.getHeaderFields();
            //定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 向指定 URL 发送POST方法的请求
     * @param url 发送请求的 URL
     * @param param 参数
     * @return String 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 拿到ip
     * @param req request作用域:
     * @return String
     */
    public static String getRemoteIP(HttpServletRequest req) {
        String ip = req.getHeader("X-Real-IP");

        if (ip == null || ("").equals(ip)) {
            ip = req.getRemoteAddr() == null ? "127.0.0.1" : req.getRemoteAddr();
        }
        return ip;
    }

    /**
     *  生成
     * @param num 参数
     * @return String
     */
    public static String getPamens(Integer num){
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < num; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
}

TokenServiceImpl.java(获取接口):

    /**
     * 接口凭证:
     */
    @Override
    public Map<String, Object> access_token() {
         String param="grant_type="+WeChatTool.access_token_grant_type+"&appid="+WeChatTool.wxspAppid+"&secret="+WeChatTool.wxspSecret;
          //获取接口凭证
                 String sendGet=Httprequests.sendGet(WeChatTool.select_access_token,param);
                 System.out.println("发送git请求的返回值:"+sendGet);
                 JSONObject json = JSONObject.fromObject(sendGet);       
                 String access_token=json.getString("access_token"); //凭证
                 System.out.println("获取的access_token:"+access_token);
                 int expires_in= json.getInt("expires_in"); //凭证有效时间,单位:秒
                 System.out.println("有效的时间:"+expires_in);
                 System.out.print("获取凭证成功");
                 System.out.println("返回的数据:"+access_token);
                 Map<String, Object> map = new HashMap<String, Object>();
                 map.put("access_token", access_token);
                 map.put("expires_in", expires_in);
                 return map;
    }

这样就可以获取到接口凭证了,希望都微信开发的朋友会有一点帮助,如果有疑问请在下发评论。

猜你喜欢

转载自blog.csdn.net/qq_41971087/article/details/82559144