最近将自己所开发设计的项目看了一下,总是不知道如何进行微信公众平台的java开发,作为一下新手来说,过程有点难受。
1、首先要查看微信平台的开发文档
https://mp.weixin.qq.com/wiki
2、里面大多都是涉及到如何对于https链接的请求
例如: 获取access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
对于appid和secret只需要在微信平台
一、 对于使用HttpsURLConnect来实现访问https,对于HttpsURLConnect的讲解我推荐这边文章:
http://blog.csdn.net/qh_java/article/details/52311226
这是我下面为了访问上面的代码实现的代码:
//get post方法通用
public static String getWxDate(String requesteUrl,String params,String requestMethod){
OutputStream os=null;
OutputStreamWriter osw=null;
InputStream is=null;
BufferReader reader=null;
HttpsURLConnect conn=null;
try{
//先封装成url地址
URL url=new URL(requestUrl);
//获取此url的链接
conn=(HttpsURLConnect)url.openConnect();
//设置请求头信息
conn.setRequestMethod(requestMethod);
conn.setRequestProperty("Content-Length",String.valueOf(params.length());
conn.setRequestProperty("Content-Type","text/xml,charset=\"UTF-8\"");
//设置是否允许输入输出
conn.setDoInput(true);
conn.setDoOutput(true);
//将所需要的参数写入进去
os=conn.getOutputStream();
osw=new OutputStreamWriter(os,"UTF-8"0;
os.write(params);
os.flush();
//将结果获取到输出
is=conn.getInnputStream();
reader=new BufferReader(new OutputStreamReader(is,"UTF-8"));
String str=null;
while((str=reader.readerLine())!=null){
return str;
}catch(Exception e){
e.getMessage();
}finally{
try{
if(osw!=null){
osw.close();
}
if(os!=null){
os.close();
}
if(is!=null){
is.close();
}
if(reader!=null){
reader.close();
}
}catch(Exception e){
e.getMessage();
}
}
}
**请求头信息:**
content-length解读
这里的长队就是content-length的值
三、使用org.apache.common.HttpClient来实现访问https
什么是HttpClient?
百度理解为:
http://baike.baidu.com/link?url=_gKuBTJc3HqNGmSEoXyVwW0mlUE2joDRWH8SbFzp0KvppAn63bFrNTzJEQkWVbLXQlAb-ermhwoLBORmnH_1Ta
这里应该使用的是org.apache.common包下面的HttpClient来进行访问https
1、对于get方法无需传参的:
String requestUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=...&secret=...";
//获取client对象
HttpClient client=new HttpClient();
//创建某种方法的链接实例
GetMethod method=new GetMethod(requestUrl);
String str="";
try {
/**
*设置恢复策略
*原因如下:
*在执行的手,会引起两种错误;
*引起的第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,
*比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,
*并且该异常发生是不可恢复的;
*第二种异常一般是由于网络原因引起的异常,对于这种异常(IOException),
*HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。
*/
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//执行
client.executeMethod(method);
//获取返回值
byte[] bytes=method.getResponseBody();
str=new String(responseBodys);
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sysout(str);
2、对于有参数的post方法
String access_token="J7QQq8RnfM35Ig_d6y5o.....";
String requestUrl="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+access_token;
HttpClient client=new HttpClient();
PostMethod method=new PostMethod(requestUrl);
String s=" {\"button\":[{\"type\":\"click\",\"name\":\"今日歌曲\",\"key\":\"V1001_TODAY_MUSIC\"},"
+"{\"name\":\"菜单\",\"sub_button\":"
+ "[{\"type\":\"view\",\"name\":\"搜索\",\"url\":\"http://www.soso.com/\"},"
+ " {\"type\":\"view\",\"name\":\"视频\",\"url\":\"http://v.qq.com/\"},"
+ "{\"type\":\"click\",\"name\":\"赞一下我们\",\"key\":\"V1001_GOOD\"}]}] }";
/*方法1:对于设置参数是json字符串的*/
method.setRequestBody(s);
/*
加入想设置键值对类型的
NameValuePair[] pairs={new NameValuePari(name,value),new NameValuePari(name,value),.....};
method.setRequestBody(pairs);
*/
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());
client.executeMethod(method);
byte[] bytes=method.getResponseBody();
str=new String(responseBodys);
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sysout(str);
四、使用org.apache.http.HttpClient来访问https(这个还未触及到)
文档理解:
http://www.tuicool.com/articles/QFJn6j7
这里我不太懂,求帮助(下面代码是copy的,加上了我自己的理解)
我就 举一个get的例子
try {
HttpClient httpclient = new DefaultHttpClient();
第一步:
//初始化SchemeRegistry,设置访问协议
//Scheme类表示一个协议方案,例如"http"或者"https"和包含许多的协议属性,
//例如缺省的端口和socket工厂常用于为指定的协议创建
//java.net.Socket实例,SchemeRegistry类被用来维护一个
//Schemes的集合
//sslcontext->trustmanager->sslscoketfactory->schemeregister
//1.1创建一个SSLSocketFactory工厂
/*
HTTPS (全称: Hypertext Transfer Protocol over Secure Socket Layer ),
是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。
即 HTTP 下加入 SSL 层, HTTPS 的安全基础是 SSL ,因此加密的详细内容就需要 SSL 。
*/
SSLContext context=new SSLContext("SSL");//这里面是protocol协议
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null,new TrustManager[]{tm},null);
SSLScoketFactory ssf=new SSLScoketFactory(ctx);
//第1.2
ClientConnectionManager ccm = httpclient.getConnectionManager();
//第1.3
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf)); //这里的443请看上面的文档
sr.register(new Scheme("https", 443, ssf));
HttpGet httpget = new HttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx806e47f2a024adda&secret=ca456a04cfdec7e688c99c155c9b83e2");
HttpParams params = httpclient.getParams();
params.setParameter("param1", "paramValue1");
httpget.setParams(params);
System.out.println("REQUEST:" + httpget.getURI()); //请求的url地址
ResponseHandler responseHandler = new BasicResponseHandler();
String responseBody;
responseBody = httpclient.execute(httpget, responseHandler);
System.out.println(responseBody);
// Create a response handler
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}