调用JPush推送的api,官网上已经有很详细的说明了。这里主要描述一下我在调用过程中遇到的问题,
比如
我的HttpClient不支持https的请求、
参数配置错误 和 验证错误等等。
开发的时候需要引用appache的包commons-httpclient.jar 、commons-codec.jar、commons-logging.jar这些包可以到官网上下载,如果有需要的话也我也可以发给你。
引入上述这些包之后,就可以进行开发了。
这里需要特别说明的两点是:
1、通过 HttpClient client = new DefaultHttpClient(); 获得HttpClient对象不支持https,需要自己重写。
2、我们的MD5编码要和服务器那边的一样。(我用我自己写的MD5编码验证的时候,总是验证失败,后来跟他们的技术人员要了他们的md5的实现方式就通过验证了)
好了,废话不多说了,接下来是贴代码的时候了:
类MySSLSocketFactory用来实现对https的支持
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.security.KeyManagementException;
importjava.security.KeyStore;
importjava.security.KeyStoreException;
importjava.security.NoSuchAlgorithmException;
importjava.security.UnrecoverableKeyException;
importjava.security.cert.CertificateException;
importjava.security.cert.X509Certificate;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.TrustManager;
importjavax.net.ssl.X509TrustManager;
importorg.apache.http.conn.ssl.SSLSocketFactory;
public classMySSLSocketFactoryextendsSSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
publicMySSLSocketFactory(KeyStore truststore)throwsNoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = newX509TrustManager() {
public voidcheckClientTrusted(X509Certificate[] chain, String authType)throwsCertificateException {
}
public voidcheckServerTrusted(X509Certificate[] chain, String authType)throwsCertificateException {
}
publicX509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null,newTrustManager[] { tm },null);
}
@Override
publicSocket createSocket(Socket socket, String host,intport,booleanautoClose)throwsIOException, UnknownHostException {
returnsslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
publicSocket createSocket()throwsIOException {
returnsslContext.getSocketFactory().createSocket();
}
}
类ClientUtil 获取可以支持https的HttpClient对象,调用MySSLSocketFactory 来取得
importjava.security.KeyStore;
importorg.apache.http.HttpVersion;
importorg.apache.http.client.HttpClient;
importorg.apache.http.conn.ClientConnectionManager;
importorg.apache.http.conn.scheme.PlainSocketFactory;
importorg.apache.http.conn.scheme.Scheme;
importorg.apache.http.conn.scheme.SchemeRegistry;
importorg.apache.http.conn.ssl.SSLSocketFactory;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
importorg.apache.http.params.BasicHttpParams;
importorg.apache.http.params.HttpParams;
importorg.apache.http.params.HttpProtocolParams;
importorg.apache.http.protocol.HTTP;
public classClientUtil {
public staticHttpClient getNewHttpClient() {
try{
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null,null);
SSLSocketFactory sf = newMySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = newBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = newSchemeRegistry();
registry.register(newScheme("http", PlainSocketFactory.getSocketFactory(),80));
registry.register(newScheme("https", sf,443));
ClientConnectionManager ccm = newThreadSafeClientConnManager(params, registry);
return newDefaultHttpClient(ccm, params);
} catch(Exception e) {
e.printStackTrace();
return newDefaultHttpClient();
}
}
}
接下来就是调用JPush的api来推送消息了
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
/**
* 调用远程api实现推送
* @author naiyu
*
*/
public classPushMsgUtil {
// public static final String PUSH_URL = "https://api.jpush.cn:443/sendmsg/sendmsg";
public static finalString PUSH_URL ="http://api.jpush.cn:8800/sendmsg/sendmsg";
public static voidpushMsg(String msg) {
BasicNameValuePair name = newBasicNameValuePair("username","test");//用户名
BasicNameValuePair sendno = newBasicNameValuePair("sendno","3621");// 发送编号。由开发者自己维护,标识一次发送请求
BasicNameValuePair appkeys = newBasicNameValuePair("appkeys","your appkeys");// 待发送的应用程序(appKey),只能填一个。
BasicNameValuePair receiver_type = newBasicNameValuePair("receiver_type","4");
//验证串,用于校验发送的合法性。
BasicNameValuePair verification_code = newBasicNameValuePair("verification_code", getVerificationCode());
//发送消息的类型:1 通知 2 自定义
BasicNameValuePair msg_type = newBasicNameValuePair("msg_type","1");
BasicNameValuePair msg_content = newBasicNameValuePair("msg_content", msg);
//目标用户终端手机的平台类型,如: android, ios 多个请使用逗号分隔。
BasicNameValuePair platform = newBasicNameValuePair("platform","android");
List datas = newArrayList();
datas.add(name);
datas.add(sendno);
datas.add(appkeys);
datas.add(receiver_type);
datas.add(verification_code);
datas.add(msg_type);
datas.add(msg_content);
datas.add(platform);
try{
HttpEntity entity = newUrlEncodedFormEntity(datas,"utf-8");
HttpPost post = newHttpPost(PUSH_URL);
post.setEntity(entity);
HttpClient client = ClientUtil.getNewHttpClient();
HttpResponse reponse = client.execute(post);
HttpEntity resEntity = reponse.getEntity();
System.out.println(EntityUtils.toString(resEntity));
} catch(Exception ex) {
ex.printStackTrace();
}
}
private staticString getVerificationCode() {
String username = "test";//username 是开发者Portal帐户的登录帐户名
String password = "pasword";
intsendno =3621;
intreceiverType =4;
String md5Password = StringUtils.toMD5(password);; //password 是开发者Portal帐户的登录密码
String input = username + sendno + receiverType + md5Password;
String verificationCode = StringUtils.toMD5(input);
returnverificationCode;
}
public static voidmain(String[] args) {
String msg = "{\"n_title\":\"来点外卖\",\"n_content\":\"你好\"}";
System.out.println(msg);
PushMsgUtil.pushMsg(msg);
}
}
运行成功:
附上StringUtils,java
importjava.security.MessageDigest;
public classStringUtils {
private final staticString[] hexDigits = {"0","1","2","3","4","5",
"6","7","8","9","A","B","C","D","E","F"};
private staticString byteArrayToHexString(byte[] b) {
StringBuffer resultSb = newStringBuffer();
for(inti =0; i
resultSb.append(byteToHexString(b[i]));
}
returnresultSb.toString();
}
private staticString byteToHexString(byteb) {
intn = b;
if(n <0)
n = 256+ n;
intd1 = n /16;
intd2 = n %16;
returnhexDigits[d1] + hexDigits[d2];
}
public staticString toMD5(String origin) {
String resultString = null;
try{
resultString = newString(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
} catch(Exception ex) {
ex.printStackTrace();
}
returnresultString;
}
}