个人随笔
目录
微信开发接口调用测试(获取AccessToken、获取永久二维码、长连接转短连接)
2019-10-31 23:32:11

在我们搭建好微信开发环境后,会在官网里看到超级多接口,下面我这里举三个例子来测试一下接口的调用。

废话不多说,因为太简单了,直接上代码,三个接口测试如下:

  1. /**
  2. * 微信公总号开发接口工具类
  3. * @author suibibk@qq.com
  4. *
  5. */
  6. public class WeiXinAPI {
  7. private static String grant_type = "client_credential";
  8. private static String appid = "**********";
  9. private static String secret ="************************";
  10. /**
  11. * 获取AccessToken 有效期是7200秒,建议缓存到redis或者内存中
  12. * @return
  13. * @throws Exception
  14. */
  15. public static String getAccessToken(){
  16. String httpPath="https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
  17. String result = HttpUtils.doGet(httpPath);
  18. JsonParser parser = new JsonParser();
  19. JsonObject object=(JsonObject) parser.parse(result);
  20. String access_token=object.get("access_token").getAsString();
  21. System.out.println("调接口获取的access_token:"+access_token);
  22. return access_token;
  23. }
  24. /**
  25. * 生成永久性二维码
  26. * @param accessToken
  27. * @param scene_str 场景值
  28. * @return
  29. * @throws Exception
  30. */
  31. public static String createQRCode(String accessToken, String scene_str){
  32. String url ="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
  33. String json = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \""+scene_str+"\"}}}";
  34. String result = HttpUtils.doPost(url, json);
  35. JsonParser parser = new JsonParser();
  36. JsonObject object=(JsonObject) parser.parse(result);
  37. String qrurl=object.get("url").getAsString();
  38. System.out.println(qrurl);
  39. return qrurl;
  40. }
  41. /**
  42. * 长连接诶生成短连接接口
  43. * @param accessToken
  44. * @param long_url
  45. * @return
  46. * @throws Exception
  47. */
  48. public static String long2short(String accessToken,String long_url){
  49. String url ="https://api.weixin.qq.com/cgi-bin/shorturl?access_token="+accessToken;
  50. Gson gson = new Gson();
  51. Map<String,Object> map = new HashMap<String,Object>();
  52. map.put("action", "long2short");
  53. map.put("long_url", long_url);
  54. String json = gson.toJson(map);
  55. String result = HttpUtils.doPost(url, json);
  56. JsonParser parser = new JsonParser();
  57. JsonObject object=(JsonObject) parser.parse(result);
  58. String errcode=object.get("errcode").getAsString();
  59. String short_url = "";
  60. if("0".equals(errcode)) {
  61. short_url = object.get("short_url").getAsString();
  62. System.out.println(short_url);
  63. }
  64. return short_url;
  65. }
  66. public static void main(String[] args) {
  67. String access_token = getAccessToken();
  68. createQRCode(access_token,"HDWUERYUWEIR");
  69. long2short(access_token,"https://read.suibibk.com/chapter/a4bf5896f49a11e9978300163e0a1f06");
  70. }
  71. }

我们主要是获取两个必须的参数:appid和secret,这个在微信公众号管理平台有,还有一个就是http请求的工具类,这里主要进行简单的get请求以及post请求,返回值是String如下:

  1. /**
  2. * setConnectTimeout:设置连接超时时间,单位毫秒。
  3. setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。
  4. setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
  5. */
  6. /**
  7. * http请求工具类
  8. * @author lwh
  9. * @date 20181130
  10. */
  11. public class HttpUtils {
  12. private static final Integer CONNECT_TIMEOUT = 5000;//接超时时间,单位毫秒
  13. private static final Integer CONNECT_REQUEST_TIMEOUT = 1000;//从connect Manager(连接池)获取Connection 超时时间,单位毫秒。
  14. private static final Integer SOCKET_TIMEOUT = 5000;//响应时间
  15. private static final Log log = LogFactory.getLog(HttpUtils.class);
  16. /**
  17. * url get请求
  18. * @param url 访问的url
  19. * @return
  20. * @throws Exception
  21. */
  22. public static String doGet(String url){
  23. String result = "";
  24. log.info("get请求的url:"+url);
  25. try {
  26. HttpResponse response = doGet(url, null, CONNECT_TIMEOUT, CONNECT_REQUEST_TIMEOUT, SOCKET_TIMEOUT);
  27. result = getString(response);
  28. } catch (Exception e) {
  29. // TODO: handle exception
  30. log.info(e.getMessage());
  31. }
  32. log.info("返回的值:"+result);
  33. return result;
  34. }
  35. /**
  36. * url post请求
  37. * @param url 请求的url
  38. * @param json 传输的json信息,建议全部转换成json回来
  39. * @return
  40. * @throws Exception
  41. */
  42. public static String doPost(String url,String json) {
  43. String result = "";
  44. log.info("post请求的url:"+url);
  45. try {
  46. HttpResponse response = doPost(url, json, CONNECT_TIMEOUT, CONNECT_REQUEST_TIMEOUT, SOCKET_TIMEOUT);
  47. result = getString(response);
  48. } catch (Exception e) {
  49. // TODO: handle exception
  50. log.info(e.getMessage());
  51. }
  52. log.info("返回的值:"+result);
  53. return result;
  54. }
  55. public static HttpResponse doGet(String path,Map<String, String> querys,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
  56. throws Exception {
  57. HttpClient httpClient = wrapClient(path);
  58. HttpGet request = new HttpGet(path);
  59. RequestConfig requestConfig = RequestConfig.custom()
  60. .setConnectTimeout(connectTimeout).setConnectionRequestTimeout(ConnectionRequestTimeout)
  61. .setSocketTimeout(responseConnectTimeout).build();
  62. request.setConfig(requestConfig);
  63. return httpClient.execute(request);
  64. }
  65. public static HttpResponse doPost(String path,
  66. Map<String, Object> bodys,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
  67. throws Exception {
  68. HttpClient httpClient = wrapClient(path);
  69. HttpPost request = new HttpPost(path);
  70. RequestConfig requestConfig = RequestConfig.custom()
  71. .setConnectTimeout(5000).setConnectionRequestTimeout(1000)
  72. .setSocketTimeout(5000).build();
  73. request.setConfig(requestConfig);
  74. if (bodys != null) {
  75. List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
  76. for (String key : bodys.keySet()) {
  77. nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key).toString()));
  78. }
  79. UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
  80. formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
  81. request.setEntity(formEntity);
  82. }
  83. return httpClient.execute(request);
  84. }
  85. public static HttpResponse doPost(String path,
  86. String jsonBody,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
  87. throws Exception {
  88. HttpClient httpClient = wrapClient(path);
  89. HttpPost request = new HttpPost(path);
  90. RequestConfig requestConfig = RequestConfig.custom()
  91. .setConnectTimeout(5000).setConnectionRequestTimeout(1000)
  92. .setSocketTimeout(5000).build();
  93. request.setConfig(requestConfig);
  94. if (jsonBody != null) {
  95. @SuppressWarnings("deprecation")
  96. StringEntity entity = new StringEntity(jsonBody, "text/xml", "utf-8");
  97. entity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
  98. request.setEntity(entity);
  99. }
  100. return httpClient.execute(request);
  101. }
  102. /**
  103. * 获取 HttpClient
  104. * @param path
  105. * @return
  106. */
  107. private static HttpClient wrapClient(String path) {
  108. HttpClient httpClient = HttpClientBuilder.create().build();
  109. if (path != null && path.startsWith("https://")) {
  110. return sslClient();
  111. }
  112. return httpClient;
  113. }
  114. /**
  115. * 在调用SSL之前需要重写验证方法,取消检测SSL
  116. * 创建ConnectionManager,添加Connection配置信息
  117. * @return HttpClient 支持https
  118. */
  119. private static HttpClient sslClient() {
  120. try {
  121. // 在调用SSL之前需要重写验证方法,取消检测SSL
  122. X509TrustManager trustManager = new X509TrustManager() {
  123. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  124. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
  125. public X509Certificate[] getAcceptedIssuers() {
  126. return null;
  127. }
  128. };
  129. SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
  130. ctx.init(null, new TrustManager[] { trustManager }, null);
  131. SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
  132. // 创建Registry
  133. RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
  134. .setExpectContinueEnabled(Boolean.TRUE).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,AuthSchemes.DIGEST))
  135. .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
  136. Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
  137. .register("http", PlainConnectionSocketFactory.INSTANCE)
  138. .register("https",socketFactory).build();
  139. // 创建ConnectionManager,添加Connection配置信息
  140. PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
  141. CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager)
  142. .setDefaultRequestConfig(requestConfig).build();
  143. return closeableHttpClient;
  144. } catch (KeyManagementException ex) {
  145. throw new RuntimeException(ex);
  146. } catch (NoSuchAlgorithmException ex) {
  147. throw new RuntimeException(ex);
  148. }
  149. }
  150. public static String getString(HttpResponse httpResponse) throws IOException {
  151. HttpEntity entity = httpResponse.getEntity();
  152. String resp = EntityUtils.toString(entity, "UTF-8");
  153. return resp;
  154. }
  155. public static void main(String[] args) throws Exception {
  156. String url ="https://www.suibibk.com/blog/579412311547052032/555875030676799488/639387539102236672";
  157. System.out.println(doGet(url));
  158. System.out.println(doPost(url,null));
  159. }
  160. }

JSON以及Http请求需要的maven依赖如下:

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpclient</artifactId>
  4. <version>4.5.5</version>
  5. </dependency>
  6. <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
  7. <dependency>
  8. <groupId>org.apache.httpcomponents</groupId>
  9. <artifactId>httpcore</artifactId>
  10. <version>4.4.9</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.google.code.gson</groupId>
  14. <artifactId>gson</artifactId>
  15. <version>2.8.5</version>
  16. </dependency>
 419

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2