2015年10月5日星期一

第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token - daliu_it

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token - daliu_it  阅读原文»

一、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请求方式: GET
https://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无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

二、封装基本类

封装一下token类:

package com.souvc.weixin.pojo;

/**
* 类名: 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 类。

package com.souvc.weixin.util;

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测试类:

package com.souvc.weixin.test;

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中配置它了:

1 public class MyReceiver extends BroadcastReceiver {
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按钮。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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中测试一下

1 public class MainActivity extends Activity implements OnClickListener {
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

阅读更多内容

没有评论:

发表评论