jpush推送java后台怎么调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jpush推送java后台怎么调用相关的知识,希望对你有一定的参考价值。

原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6439313.html

Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请求API:https://api.jpush.cn/v3/push,另一种则是使用官方提供的第三方Java SDK,这里先进行第一种方式推送的实现代码:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONArray;
import net.sf.json.JSONObject;
import sun.misc.BASE64Encoder;
/**
 * java后台极光推送方式一:使用Http API
 * 此种方式需要自定义http请求发送客户端:HttpClient 
*/
@SuppressWarnings( "deprecation", "restriction" )
public class JiguangPush 
    private static final Logger log = LoggerFactory.getLogger(JiguangPush.class);
    private String masterSecret = "xxxxxxxxxxxxxxxxxxxx";
    private String appKey = "xxxxxxxxxxxxxxxxxxx";
    private String pushUrl = "https://api.jpush.cn/v3/push";    
    private boolean apns_production = true;    
    private int time_to_live = 86400;
    private static final String ALERT = "推送信息";    
    /**
     * 极光推送
     */
    public void jiguangPush()
        String alias = "123456";//声明别名
        try
            String result = push(pushUrl,alias,ALERT,appKey,masterSecret,apns_production,time_to_live);
            JSONObject resData = JSONObject.fromObject(result);
                if(resData.containsKey("error"))
                    log.info("针对别名为" + alias + "的信息推送失败!");
                    JSONObject error = JSONObject.fromObject(resData.get("error"));
                    log.info("错误信息为:" + error.get("message").toString());
                
            log.info("针对别名为" + alias + "的信息推送成功!");
        catch(Exception e)
            log.error("针对别名为" + alias + "的信息推送失败!",e);
        
    
    
    /**
     * 组装极光推送专用json串
     * @param alias
     * @param alert
     * @return json
     */
    public static JSONObject generateJson(String alias,String alert,boolean apns_production,int time_to_live)
        JSONObject json = new JSONObject();
        JSONArray platform = new JSONArray();//平台
        platform.add("android");
        platform.add("ios");
        
        JSONObject audience = new JSONObject();//推送目标
        JSONArray alias1 = new JSONArray();
        alias1.add(alias);
        audience.put("alias", alias1);
        
        JSONObject notification = new JSONObject();//通知内容
        JSONObject android = new JSONObject();//android通知内容
        android.put("alert", alert);
        android.put("builder_id", 1);
        JSONObject android_extras = new JSONObject();//android额外参数
        android_extras.put("type", "infomation");
        android.put("extras", android_extras);
        
        JSONObject ios = new JSONObject();//ios通知内容
        ios.put("alert", alert);
        ios.put("sound", "default");
        ios.put("badge", "+1");
        JSONObject ios_extras = new JSONObject();//ios额外参数
        ios_extras.put("type", "infomation");
        ios.put("extras", ios_extras);
        notification.put("android", android);
        notification.put("ios", ios);
        
        JSONObject options = new JSONObject();//设置参数
        options.put("time_to_live", Integer.valueOf(time_to_live));
        options.put("apns_production", apns_production);
        
        json.put("platform", platform);
        json.put("audience", audience);
        json.put("notification", notification);
        json.put("options", options);
        return json;
        
    
    
    /**
     * 推送方法-调用极光API
     * @param reqUrl
     * @param alias
     * @param alert
     * @return result
     */
    public static String push(String reqUrl,String alias,String alert,String appKey,String masterSecret,boolean apns_production,int time_to_live)
        String base64_auth_string = encryptBASE64(appKey + ":" + masterSecret);
        String authorization = "Basic " + base64_auth_string;
        return sendPostRequest(reqUrl,generateJson(alias,alert,apns_production,time_to_live).toString(),"UTF-8",authorization);
    
    
    /**
     * 发送Post请求(json格式)
     * @param reqURL
     * @param data
     * @param encodeCharset
     * @param authorization
     * @return result
     */
    @SuppressWarnings( "resource" )
    public static String sendPostRequest(String reqURL, String data, String encodeCharset,String authorization)
        HttpPost httpPost = new HttpPost(reqURL);
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = null;
        String result = "";
        try 
             StringEntity entity = new StringEntity(data, encodeCharset);
             entity.setContentType("application/json");
             httpPost.setEntity(entity);
             httpPost.setHeader("Authorization",authorization.trim());
             response = client.execute(httpPost);
             result = EntityUtils.toString(response.getEntity(), encodeCharset);
         catch (Exception e) 
            log.error("请求通信[" + reqURL + "]时偶遇异常,堆栈轨迹如下", e);  
        finally
            client.getConnectionManager().shutdown();
        
        return result;
    
     /** 
    * BASE64加密工具
    */
     public static String encryptBASE64(String str) 
         byte[] key = str.getBytes();
       BASE64Encoder base64Encoder = new BASE64Encoder();
       String strs = base64Encoder.encodeBuffer(key);
         return strs;
     

以上代码中使用的是第一种方式实现推送,下面介绍第二种方式:使用java SDK

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
/**
 * java后台极光推送方式二:使用Java SDK
 */
@SuppressWarnings( "deprecation", "restriction" )
public class JiguangPush 
    private static final Logger log = LoggerFactory.getLogger(JiguangPush.class);
    private static String masterSecret = "xxxxxxxxxxxxxxxxx";
    private static String appKey = "xxxxxxxxxxxxxxxx";
    private static final String ALERT = "推送信息";    
    /**
     * 极光推送
     */
    public void jiguangPush()
        String alias = "123456";//声明别名
        log.info("对别名" + alias + "的用户推送信息");
        PushResult result = push(String.valueOf(alias),ALERT);
        if(result != null && result.isResultOK())
            log.info("针对别名" + alias + "的信息推送成功!");
        else
            log.info("针对别名" + alias + "的信息推送失败!");
        
    
    
    /**
     * 生成极光推送对象PushPayload(采用java SDK)
     * @param alias
     * @param alert
     * @return PushPayload
     */
    public static PushPayload buildPushObject_android_ios_alias_alert(String alias,String alert)
        return PushPayload.newBuilder()
                .setPlatform(Platform.android_ios())
                .setAudience(Audience.alias(alias))
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .addExtra("type", "infomation")
                                .setAlert(alert)
                                .build())
                        .addPlatformNotification(IosNotification.newBuilder()
                                .addExtra("type", "infomation")
                                .setAlert(alert)
                                .build())
                        .build())
                .setOptions(Options.newBuilder()
                        .setApnsProduction(false)//true-推送生产环境 false-推送开发环境(测试使用参数)
                        .setTimeToLive(90)//消息在JPush服务器的失效时间(测试使用参数)
                        .build())
                .build();
    
    /**
     * 极光推送方法(采用java SDK)
     * @param alias
     * @param alert
     * @return PushResult
     */
    public static PushResult push(String alias,String alert)
        ClientConfig clientConfig = ClientConfig.getInstance();
        JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, clientConfig);
        PushPayload payload = buildPushObject_android_ios_alias_alert(alias,alert);
        try 
            return jpushClient.sendPush(payload);
         catch (APIConnectionException e) 
            log.error("Connection error. Should retry later. ", e);
            return null;
         catch (APIRequestException e) 
            log.error("Error response from JPush server. Should review and fix it. ", e);
            log.info("HTTP Status: " + e.getStatus());
            log.info("Error Code: " + e.getErrorCode());
            log.info("Error Message: " + e.getErrorMessage());
            log.info("Msg ID: " + e.getMsgId());
            return null;
            
    

可以看出使用Java SDK实现推送的方式很简单,代码量也少,理解起来也不难,官方提供的SDK中讲很多内容都实现了,我们只是需要配置一下信息,然后发起推送即可。需要注意的是使用第二种方式,需要导入极光官网提供的jar包。

直接在maven中的pom文件中加入:

<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jpush-client</artifactId>
    <version>3.2.15</version>
</dependency>

  注意:在这里极有可能会出现jar包冲突:具体哪个包我也忘记了,好像是个日志包,你找到后删除即可。

原本我们项目中也是采用第二种方式实现的,但是最后在提交代码时发现一个问题,那就是虽然我们只是带入了官网提供的那三个jar包,但是最后一统计,竟然无缘无故增多了80+个jar包,如此多的jar包提交过于臃肿,而且不现实,所以才临时改变方案,采用第一种方式进行编码。

代码中采用的是别名方式进行推送,需要在在手机APP端进行别名设置,最好就是在用户登录之后就设置好,这样只要用户登录一次,它的绑定别名就可以保存到极光服务器,而我们推送时,指定这个别名,就能将信息推送到对应用户的手机上。

其实我们发起推送请求,只是将信息发送到了极光服务器之上,这个信息有一个保存时限,默认一天,只要用户登录手机APP,极光服务器就会将信息自动推送到对应别名的手机上,由此可见,信息并非由我们后天直接推送到手机,而是通过极光服务器这个中转站,而这正式极光的工作。

  注意:这里告知一个技巧,这个别名设置的时候,其实直接将用户ID设置为别名即可,既方便,又安全,不用再去想办法生成一个唯一的串来进行标识,甚至需要在后台数据库中用户表中新增字段。

参考技术A 开发的时候需要引用appache的包commons-httpclient.jar 、commons-codec.jar、commons-logging.jar这些包可以到官网上下载,如果有需要的话也我也可以发给你。
引入上述这些包之后,就可以进行开发了。
这里需要特别说明的两点是:
1、通过 HttpClient client = new DefaultHttpClient(); 获得HttpClient对象不支持https,需要自己重写。
2、我们的MD5编码要和服务器那边的一样。(我用我自己写的MD5编码验证的时候,总是验证失败,后来跟他们的技术人员要了他们的md5的实现方式就通过验证了)

好了,废话不多说了,接下来是贴代码的时候了:
类MySSLSocketFactory用来实现对https的支持

[java] view plain copy
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.conn.ssl.SSLSocketFactory;

public class MySSLSocketFactory extends SSLSocketFactory

SSLContext sslContext = SSLContext.getInstance("TLS");

public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
super(truststore);

TrustManager tm = 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.init(null, new TrustManager[] tm , null);


@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);


@Override
public Socket createSocket() throws IOException
return sslContext.getSocketFactory().createSocket();




类ClientUtil 获取可以支持https的HttpClient对象,调用MySSLSocketFactory 来取得

[java] view plain copy
import java.security.KeyStore;

import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
public class ClientUtil

public static HttpClient getNewHttpClient()
try
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);

SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));

ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

return new DefaultHttpClient(ccm, params);
catch (Exception e)
e.printStackTrace();
return new DefaultHttpClient();





接下来就是调用JPush的api来推送消息了

[java] view plain copy
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**
* 调用远程api实现推送
* @author naiyu
*
*/
public class PushMsgUtil

// public static final String PUSH_URL = "https://api.jpush.cn:443/sendmsg/sendmsg";
public static final String PUSH_URL = "http://api.jpush.cn:8800/sendmsg/sendmsg";

public static void pushMsg(String msg)
BasicNameValuePair name = new BasicNameValuePair("username", "test"); //用户名
BasicNameValuePair sendno = new BasicNameValuePair("sendno", "3621"); // 发送编号。由开发者自己维护,标识一次发送请求
BasicNameValuePair appkeys = new BasicNameValuePair("appkeys", "your appkeys"); // 待发送的应用程序(appKey),只能填一个。
BasicNameValuePair receiver_type = new BasicNameValuePair("receiver_type", "4");
//验证串,用于校验发送的合法性。
BasicNameValuePair verification_code = new BasicNameValuePair("verification_code", getVerificationCode());
//发送消息的类型:1 通知 2 自定义
BasicNameValuePair msg_type = new BasicNameValuePair("msg_type", "1");
BasicNameValuePair msg_content = new BasicNameValuePair("msg_content", msg);
//目标用户终端手机的平台类型,如: android, ios 多个请使用逗号分隔。
BasicNameValuePair platform = new BasicNameValuePair("platform", "android");
List<BasicNameValuePair> datas = new ArrayList<BasicNameValuePair>();
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 = new UrlEncodedFormEntity(datas, "utf-8");
HttpPost post = new HttpPost(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 static String getVerificationCode()

String username = "test"; //username 是开发者Portal帐户的登录帐户名
String password = "pasword";
int sendno = 3621;
int receiverType = 4;
String md5Password = StringUtils.toMD5(password);; //password 是开发者Portal帐户的登录密码

String input = username + sendno + receiverType + md5Password;
String verificationCode = StringUtils.toMD5(input);
return verificationCode;


public static void main(String[] args)
String msg = "\"n_title\":\"来点外卖\",\"n_content\":\"你好\"";
System.out.println(msg);
PushMsgUtil.pushMsg(msg);


本回答被提问者采纳
参考技术B 是极光推送吗?网站上有demo啊,下载下来有一个JPushClient 里边就有推送的方法

以上是关于jpush推送java后台怎么调用的主要内容,如果未能解决你的问题,请参考以下文章

极光推送-java消息推送app

极光推送_总结_01_Java实现极光推送

Android 退出app,后台推送的服务也停止了,怎么可以做到不停止后台服务呢?

java集成jpush实现客户端推送

JPush极光推送Java服务器端实例

JPush极光推送Java服务器端实例