在我们搭建好微信开发环境后,会在官网里看到超级多接口,下面我这里举三个例子来测试一下接口的调用。
废话不多说,因为太简单了,直接上代码,三个接口测试如下:
/**
* 微信公总号开发接口工具类
* @author suibibk@qq.com
*
*/
public class WeiXinAPI {
private static String grant_type = "client_credential";
private static String appid = "**********";
private static String secret ="************************";
/**
* 获取AccessToken 有效期是7200秒,建议缓存到redis或者内存中
* @return
* @throws Exception
*/
public static String getAccessToken(){
String httpPath="https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
String result = HttpUtils.doGet(httpPath);
JsonParser parser = new JsonParser();
JsonObject object=(JsonObject) parser.parse(result);
String access_token=object.get("access_token").getAsString();
System.out.println("调接口获取的access_token:"+access_token);
return access_token;
}
/**
* 生成永久性二维码
* @param accessToken
* @param scene_str 场景值
* @return
* @throws Exception
*/
public static String createQRCode(String accessToken, String scene_str){
String url ="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
String json = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \""+scene_str+"\"}}}";
String result = HttpUtils.doPost(url, json);
JsonParser parser = new JsonParser();
JsonObject object=(JsonObject) parser.parse(result);
String qrurl=object.get("url").getAsString();
System.out.println(qrurl);
return qrurl;
}
/**
* 长连接诶生成短连接接口
* @param accessToken
* @param long_url
* @return
* @throws Exception
*/
public static String long2short(String accessToken,String long_url){
String url ="https://api.weixin.qq.com/cgi-bin/shorturl?access_token="+accessToken;
Gson gson = new Gson();
Map<String,Object> map = new HashMap<String,Object>();
map.put("action", "long2short");
map.put("long_url", long_url);
String json = gson.toJson(map);
String result = HttpUtils.doPost(url, json);
JsonParser parser = new JsonParser();
JsonObject object=(JsonObject) parser.parse(result);
String errcode=object.get("errcode").getAsString();
String short_url = "";
if("0".equals(errcode)) {
short_url = object.get("short_url").getAsString();
System.out.println(short_url);
}
return short_url;
}
public static void main(String[] args) {
String access_token = getAccessToken();
createQRCode(access_token,"HDWUERYUWEIR");
long2short(access_token,"https://read.suibibk.com/chapter/a4bf5896f49a11e9978300163e0a1f06");
}
}
我们主要是获取两个必须的参数:appid和secret,这个在微信公众号管理平台有,还有一个就是http请求的工具类,这里主要进行简单的get请求以及post请求,返回值是String如下:
/**
* setConnectTimeout:设置连接超时时间,单位毫秒。
setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。
setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
*/
/**
* http请求工具类
* @author lwh
* @date 20181130
*/
public class HttpUtils {
private static final Integer CONNECT_TIMEOUT = 5000;//接超时时间,单位毫秒
private static final Integer CONNECT_REQUEST_TIMEOUT = 1000;//从connect Manager(连接池)获取Connection 超时时间,单位毫秒。
private static final Integer SOCKET_TIMEOUT = 5000;//响应时间
private static final Log log = LogFactory.getLog(HttpUtils.class);
/**
* url get请求
* @param url 访问的url
* @return
* @throws Exception
*/
public static String doGet(String url){
String result = "";
log.info("get请求的url:"+url);
try {
HttpResponse response = doGet(url, null, CONNECT_TIMEOUT, CONNECT_REQUEST_TIMEOUT, SOCKET_TIMEOUT);
result = getString(response);
} catch (Exception e) {
// TODO: handle exception
log.info(e.getMessage());
}
log.info("返回的值:"+result);
return result;
}
/**
* url post请求
* @param url 请求的url
* @param json 传输的json信息,建议全部转换成json回来
* @return
* @throws Exception
*/
public static String doPost(String url,String json) {
String result = "";
log.info("post请求的url:"+url);
try {
HttpResponse response = doPost(url, json, CONNECT_TIMEOUT, CONNECT_REQUEST_TIMEOUT, SOCKET_TIMEOUT);
result = getString(response);
} catch (Exception e) {
// TODO: handle exception
log.info(e.getMessage());
}
log.info("返回的值:"+result);
return result;
}
public static HttpResponse doGet(String path,Map<String, String> querys,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
throws Exception {
HttpClient httpClient = wrapClient(path);
HttpGet request = new HttpGet(path);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout).setConnectionRequestTimeout(ConnectionRequestTimeout)
.setSocketTimeout(responseConnectTimeout).build();
request.setConfig(requestConfig);
return httpClient.execute(request);
}
public static HttpResponse doPost(String path,
Map<String, Object> bodys,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
throws Exception {
HttpClient httpClient = wrapClient(path);
HttpPost request = new HttpPost(path);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000).setConnectionRequestTimeout(1000)
.setSocketTimeout(5000).build();
request.setConfig(requestConfig);
if (bodys != null) {
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
for (String key : bodys.keySet()) {
nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key).toString()));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
request.setEntity(formEntity);
}
return httpClient.execute(request);
}
public static HttpResponse doPost(String path,
String jsonBody,Integer connectTimeout,Integer ConnectionRequestTimeout,Integer responseConnectTimeout)
throws Exception {
HttpClient httpClient = wrapClient(path);
HttpPost request = new HttpPost(path);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000).setConnectionRequestTimeout(1000)
.setSocketTimeout(5000).build();
request.setConfig(requestConfig);
if (jsonBody != null) {
@SuppressWarnings("deprecation")
StringEntity entity = new StringEntity(jsonBody, "text/xml", "utf-8");
entity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
request.setEntity(entity);
}
return httpClient.execute(request);
}
/**
* 获取 HttpClient
* @param path
* @return
*/
private static HttpClient wrapClient(String path) {
HttpClient httpClient = HttpClientBuilder.create().build();
if (path != null && path.startsWith("https://")) {
return sslClient();
}
return httpClient;
}
/**
* 在调用SSL之前需要重写验证方法,取消检测SSL
* 创建ConnectionManager,添加Connection配置信息
* @return HttpClient 支持https
*/
private static HttpClient sslClient() {
try {
// 在调用SSL之前需要重写验证方法,取消检测SSL
X509TrustManager trustManager = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
ctx.init(null, new TrustManager[] { trustManager }, null);
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
// 创建Registry
RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
.setExpectContinueEnabled(Boolean.TRUE).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,AuthSchemes.DIGEST))
.setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https",socketFactory).build();
// 创建ConnectionManager,添加Connection配置信息
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig).build();
return closeableHttpClient;
} catch (KeyManagementException ex) {
throw new RuntimeException(ex);
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
}
public static String getString(HttpResponse httpResponse) throws IOException {
HttpEntity entity = httpResponse.getEntity();
String resp = EntityUtils.toString(entity, "UTF-8");
return resp;
}
public static void main(String[] args) throws Exception {
String url ="https://www.suibibk.com/blog/579412311547052032/555875030676799488/639387539102236672";
System.out.println(doGet(url));
System.out.println(doPost(url,null));
}
}
JSON以及Http请求需要的maven依赖如下:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>