微信企业号开发之获取AccessToken以及缓存处理

2017年09月22日 09:51 | 4152次浏览 作者原创 版权保护

微信企业号开发,需要调用微信企业号的相关接口,则必须使用AccessToken,但AccessToken需要corpid,corpsecret两个参数调用相关接口才能获取。

在申请token时并不是每发送一次消息就要申请一次token,因为token是有次数限制的,规则就是下面

主动调用的频率限制

当你获取到AccessToken时,你的应用就可以成功调用企业号后台所提供的各种接口以管理或访问企业号后台的资源或给企业号成员发消息。

为了防止企业应用的程序错误而引发企业号服务器负载异常,默认情况下,每个企业号调用接口都有一定的频率限制,当超过此限制时,调用对应接口会收到相应错误码。

以下是当前默认的频率限制,企业号后台可能会根据运营情况调整此阈值:

基础频率

每企业调用单个cgi/api不可超过1000次/分,30000次/小时

每ip调用单个cgi/api不可超过2000次/分,60000次/小时

第三方应用提供商由于需要同时服务于多个企业,ip频率限制如下:每ip调用单个cgi/api不可超过20000次/分,600000次/小时

发消息频率

每企业不可超过帐号上限数*30人次/天

创建帐号频率

每企业创建帐号数不可超过帐号上限数*3/月

创建应用频率

每企业最大应用数限制为30个,创建应用次数不可超过30*3/月

每一个AccessToken的有效期为7200秒,也就是两个小时,在有效期内调用接口,则自动续期

那么我们处理token的时候,就可以使用static进行处理,定义两个变量

<pre name="code" class="java">    //主动调用:发送消息获得token  
    public static String access_token;  
    //主动调用:请求token的时间  
    public static Date access_token_date;

在每次请求token的时候:

1、判断jsapi_ticket是否存在,不存在的话直接申请;

2、判断时间是否过期,过期(>=7000秒)则重新申请token,否则不用请求直接返回之前的token。

这样可以避免请求token频繁导致的系统不能使用的问题

实现代码:

 //V型知识库 www.vxzsk.com
 public JSONObject handleResponse(  
                        final HttpResponse response) throws ClientProtocolException, IOException {  
                    int status = response.getStatusLine().getStatusCode();  
                    if (status >= 200 && status < 300) {  
                        HttpEntity entity = response.getEntity();  
                        if(null!=entity){  
                            String result= EntityUtils.toString(entity);  
                            //根据字符串生成JSON对象  
                            JSONObject resultObj = JSONObject.fromObject(result);  
                            return resultObj;  
                        }else{  
                            return null;  
                        }  
                    } else {  
                        throw new ClientProtocolException("Unexpected response status: " + status);  
                    }  
                }  
  
            };  
            //返回的json对象  
            JSONObject responseBody = httpclient.execute(httpget, responseHandler);  
            if(null!=responseBody){  
                token= (String) responseBody.get("access_token");//返回token  
            }  
  
            httpclient.close();  
  
            //设置全局变量  
            access_token=token;  
            access_token_date=new Date();  
        }catch (Exception e) {  
            e.printStackTrace();  
        }   
       }else{  
        token=access_token;  
       }  
     return token;  
}

二、获取access_token实现代码:

在页面中通过get请求访问https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect,但是我在微信浏览器中测试了一下根本访问不了,最后发现是微信浏览器阻止了跨域访问,既然前台不能跨域那就只能放到后台访问,为此可以写一个springMvc的Controller,代码如下:

package com.weixin.qiye;
//V型知识库 www.vxzsk.com
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/qiye")
public class QiyeController {

	private static final String CORPID="wxf75e84161aaaaaaa";
	private static final String CORPSECRET="BkN0-Orh2d1GI9quC9GnG3KsmApLumgStJfmH29TzsekCWv4eO_8aR8KTZOVdOBh";
	
	@RequestMapping("/getAccessToken")
	public void getAccessToken(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String urlStr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+CORPID+"&corpsecret="+CORPSECRET;  
        <span style="white-space:pre">	</span>processUrl(response, urlStr);  
	}
	
	
	private void processUrl(HttpServletResponse response, String urlStr) {
		URL url;
		try {
			url = new URL(urlStr);
			URLConnection URLconnection = url.openConnection();  
			HttpURLConnection httpConnection = (HttpURLConnection)URLconnection;  
			int responseCode = httpConnection.getResponseCode();  
			if (responseCode == HttpURLConnection.HTTP_OK) {  
				InputStream urlStream = httpConnection.getInputStream();  
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlStream));  
				String sCurrentLine = "";  
				String sTotalString = "";  
				while ((sCurrentLine = bufferedReader.readLine()) != null) {  
					sTotalString += sCurrentLine;  
				}  
				PrintWriter out = response.getWriter();
				out.print(sTotalString);
			}else{
				System.err.println("失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

这样在前台调用相同域名的后台代码,在后台跨域访问后,把获取的AccessToken再返回给前台就可以了。以下是前台代码:

$.ajax({
		dataType:"json",
		url: "http://leonjoweixin.duapp.com/weixingongzhong/qiye/getAccessToken",
		success: function(data){
		alert(data.access_token);
			//得到data.access_token
		},
		error:function(XMLHttpRequest, textStatus, errorThrown){
		}
	});

小说《我是全球混乱的源头》
此文章本站原创,地址 https://www.vxzsk.com/207.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程