一、access_token简介
为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,
开发者在调用这些接口时,都需要传入一个相同的参数 access_token,它是公众账号的全局唯一票据,它是接口访问凭证。
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token失效。
如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新access_token,那么就可能会产生冲突,导致服务不稳定。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口 获取access_token。在理想情况下,一个7x24小时运行的系统,每天只需要获取12次access_token,即每2小时获取一次。如果在 有效期内,再次获取access_token,那么上一次获取的access_token将失效。
目前,获取access_token接口的调用频率限制为2000次/天,如果每次发送客服消息、获取用户信息、群发消息之前都要先调用获取 access_token接口得到接口访问凭证,这显然是不合理的,一方面会更耗时(多了一次接口调用操作),另一方面2000次/天的调用限制恐怕也不 够用。因此,在实际应用中,我们需要将获取到的access_token存储起来,然后定期调用access_token接口更新它,以保证随时取出的 access_token都是有效的。
我们先看看官方的说明:
接口调用请求说明
http请求方式: GEThttps://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}参数 | 说明 |
---|---|
access_token | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
二、封装基本类
封装一下token类:
/**
* 类名: Token </br>
* 描述: 凭证 </br>
* 开发人员: souvc </br>
* 创建时间: 2015-9-30 </br>
* 发布版本:V1.0 </br>
*/
public class Token {
// 接口访问凭证
private String accessToken;
// 凭证有效期,单位:秒
private int expiresIn;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
三、获取token。
1.问题:如何通过获取token?
解决方案:(1)直接通过浏览器访问。(2)编写程序,模拟https连接,获得token。
解决详细步骤如下:
(1)浏览器中直接输入链接:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET ,然后把APPID和APPSECRET替换成自己的appID和appsecret,在浏览器即可获得token。
(2)如何在程序中模拟发送https请求,并且获取到token呢?
对于https请求,我们需要一个证书信任管理器,这个管理器类需要自己定义,但需要实现X509TrustManager接口,
首先定义一个MyX509TrustManager 类。
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 类名: MyX509TrustManager </br>
* 描述: 信任管理器 </br>
* 开发人员: souvc </br>
* 创建时间: 2015-9-30 </br>
* 发布版本:V1.0 </br>
*/
public class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
建立一个token测试类:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import com.souvc.weixin.util.MyX509TrustManager;
public Android学习笔记(十一)BroadcastReceiver动态注册、注销示例 - codingblock 阅读原文»
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册、注销BroadcastReceiver的栗子。
1、首先创建一个MyReceiver并继承BroadcastReceiver,既然要动态注册该receiver的话,就无需在AndroidManifest.xml中配置它了:
2 public static final String ACTION = "com.codingblock.receive.intent.action.MyReceiver";
3
4 public MyReceiver() {
5
6 }
7
8 @Override
9 public void onReceive(Context context, Intent intent) {
10 System.out.println("接收到的消息为:" + intent.getStringExtra("data"));
11 }
12 }
代码分析:上面代码中定义了一个静态变量ACTION,以方便程序指定该receiver。另外,从onReceive()方法的第二个参数intent可以获取到传递过来的数据。
2、布局文件如下,很简单,只有三个按钮:发送消息按钮、注册receiver按钮和注销receiver按钮。
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_send_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送消息" />
<Button
android:id="@+id/btn_register_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册receiver" />
<Button
android:id="@+id/btn_unregister_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注销receiver" />
</LinearLayout>
3、最后在MainActivity中测试一下
2 private MyReceiver receiver = null;
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_main);
7 findViewById(R.id.btn_send_receiver).setOnClickListener(this);
8 findViewById(R.id.btn_register_receiver).setOnClickListener(this);
9 findViewById(R.id.btn_unregister_receiver).setOnClickListener(this);
10 }
11
12 @Override
13 public void onClick(View v) {
14 switch (v.getId()) {
15 case R.id.btn_send_receiver:
16 Intent i = new Intent(MyReceiver.ACTION);
17 i.putExtra("data", "来自MainActivity的消息");
18 sendBroadcast(i);
19 break;
20 case R.id.btn_register_receiver:
21 if (receiver == null) {
22 System.out.println("注册receiver");
23 receiver = new MyReceiver();
24 registerReceiver(receiver, new IntentFilter(MyReceiver.ACTION));
25 }
26 break;
27 case R.id.btn_unregister_receiver:
28 if (receiver != null) {
29 System.out.println("注销receiver");
30 unregisterReceiver(receiver);
31 receiver = null;
32 }
33
没有评论:
发表评论