JSON

微信公众帐号开发教程介绍(2)

字号+ 作者:H5之家 来源:H5之家 2015-10-21 09:48 我要评论( )

就先拿获取凭证接口来说吧,限制一天只能调用200次。还记得前面提到过access_token是有有效期的,并且有效期为两小时,也就是获取一次access_token后的两小时内,都可以继续使用,那么理想情况一天24小时内,是不是

  就先拿获取凭证接口来说吧,限制一天只能调用200次。还记得前面提到过access_token是有有效期的,并且有效期为两小时,也就是获取一次access_token后的两小时内,都可以继续使用,那么理想情况一天24小时内,是不是只需要获取12次就够了?难道200次还不够用?

  再来看下菜单创建接口限制一天只能调用100次。我就这么解释吧,菜单创建一次后,只要你不切换模式(指的是在编辑模式和开发模式间切换)、不调用删除接口,这个菜单会永远存在的。谁没事干,一天要创建100次菜单,就算是测试,测个10次8次足够了吧?

  菜单的查询和删除接口的限制我就不解释了,至今为止这二个接口我都没使用过一次。就算有这样的使用需求,一天这么多次的调用,完全足够了。

  封装通用的请求方法

  读到这里,就默认大家已经掌握了上面讲到的所有关于自定义菜单的理论知识,下面就进入代码实战讲解的部分。

  先前我们了解到,创建菜单需要调用二个接口,并且都是https请求,而非http。如果要封装一个通用的请求方法,该方法至少需要具备以下能力:

  1)支持HTTPS请求;

  2)支持GET、POST两种方式;

  3)支持参数提交,也支持无参数的情况;

  对于https请求,我们需要一个证书信任管理器,这个管理器类需要自己定义,但需要实现X509TrustManager接口,代码如下:

package org.liufeng.weixin.util; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /** * 证书信任管理器(用于https请求) * * @author liufeng * @date 2013-08-08 */ public class MyX509TrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }


  这个证书管理器的作用就是让它信任我们指定的证书,上面的代码意味着信任所有证书,不管是否权威机构颁发。

  证书有了,通用的https请求方法就不难实现了,实现代码如下:

 

package org.liufeng.weixin.util;  import java.io.BufferedReader;  import java.io.InputStream;  import java.io.InputStreamReader;  import java.io.OutputStream;  import java.net.ConnectException;  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 net.sf.json.JSONObject;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  /**  * 公众平台通用接口工具类  *  * @author liuyq  * @date 2013-08-09  */  public class WeixinUtil {  private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);  /**  * 发起https请求并获取结果  *  * @param requestUrl 请求地址  * @param requestMethod 请求方式(GET、POST)  * @param outputStr 提交的数据  * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)  */  public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {  JSONObject jsonObject = null;  StringBuffer buffer = new StringBuffer();  try {  // 创建SSLContext对象,并使用我们指定的信任管理器初始化  TrustManager[] tm = { new MyX509TrustManager() };  SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  sslContext.init(null, tm, new java.security.SecureRandom());  // 从上述SSLContext对象中得到SSLSocketFactory对象  SSLSocketFactory ssf = sslContext.getSocketFactory();  URL url = new URL(requestUrl);  HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  httpUrlConn.setSSLSocketFactory(ssf);  httpUrlConn.setDoOutput(true);  httpUrlConn.setDoInput(true);  httpUrlConn.setUseCaches(false);  // 设置请求方式(GET/POST)  httpUrlConn.setRequestMethod(requestMethod);  if ("GET".equalsIgnoreCase(requestMethod))  httpUrlConn.connect();  // 当有数据需要提交时  if (null != outputStr) {  OutputStream outputStream = httpUrlConn.getOutputStream();  // 注意编码格式,防止中文乱码  outputStream.write(outputStr.getBytes("UTF-8"));  outputStream.close();  }  // 将返回的输入流转换成字符串  InputStream inputStream = httpUrlConn.getInputStream();  InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  String str = null;  while ((str = bufferedReader.readLine()) != null) {  buffer.append(str);  }  bufferedReader.close();  inputStreamReader.close();  // 释放资源  inputStream.close();  inputStream = null;  httpUrlConn.disconnect();  jsonObject = JSONObject.fromObject(buffer.toString());  } catch (ConnectException ce) {  log.error("Weixin server connection timed out.");  } catch (Exception e) {  log.error("https request error:{}", e);  }  return jsonObject;  }  }


  代码说明:

  1)41~50行:解决https请求的问题,很多人问题就出在这里;

  2)55~59行:兼容GET、POST两种方式;

  3)61~67行:兼容有数据提交、无数据提交两种情况,也有相当一部分人不知道如何POST提交数据;

  Pojo类的封装

  在获取凭证创建菜单前,我们还需要封装一些pojo,这会让我们的代码更美观,有条理。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 浅谈使用PHP开发微信支付的流程

    浅谈使用PHP开发微信支付的流程

    2016-02-13 15:00

  • JSONSchema那些事儿:基本概念

    JSONSchema那些事儿:基本概念

    2016-02-05 17:02

  • 基于HTML5的微信支付开发详解

    基于HTML5的微信支付开发详解

    2015-11-17 09:18

  • asp.net微信开发(开发者接入)

    asp.net微信开发(开发者接入)

    2015-11-16 19:26

网友点评