# push 对外接口文档

## 1、生成推送任务接口【入库,可针对场景统计发送总数和打开总数】

#### 适用场景:
 - 针对一批确定的用户,比如订阅了某个秒杀活动的20W用户,给他们推`秒杀活动即将开始`的消息。

#### 对接方式:
 - 直接往rabbitMQ写一条消息进MQ, 所有`push`节点会监听MQ, 接收到推送任务之后,生成一条具体的task。 
     - topic类型 : `yoho_task_push`
     - 测试环境rabbitMq账号密码:[取的是global-autoconfig.properties中`rabbit_common`的值]
        - rabbit_host=${rabbit_common} 【`192.168.102.211:5672`】
        - rabbit_user=${rabbit_common_user}【yoho】
        - rabbit_password=${rabbit_common_password}【yoho】
        - rabbit_vhost=yoho
      - AWS rabbitMq账号密码:[取的是global-autoconfig.properties中`rabbit_common`的值]
        - rabbit_host=${rabbit_common} 【`rabbitmq-common.yohoops.org:5672`】
        - rabbit_user=${rabbit_common_user}【yoho】
        - rabbit_password=${rabbit_common_password}【yoho】
        - rabbit_vhost=yoho
 - PUSH收到此中MQ消息,会生成一条具体的推送任务入库,表名是q_msg_system的send_task表。PUSH在处理的时候会把该条推送对应的用户写进redis。

#### 消息格式体
| 参数名称 | 参数类型 |  可否为空 | 参数解释 | 默认值 | 备注 | 
|:-------| -----:|-----:|-----:|-----:|----:| 
|androidTitle|String|是|安卓推送标题|null|无|
|androidContent|String|是|安卓推送内容|null|`安卓的推送分为title和content两部分`|
|iosAlert|String|是|ios推送内容|null|`ios的推送只有alert`|
|appendParams|String|否|APP跳转链接|null|必须为`JSON格式`的字符串,给APP跳转使用|
|sendTime|long|否|发送时间|null|可做定时用,此值小于PUSH服务器的时间即会发送|
|sceneType|String|否|此次推送的场景|null|如`品牌上新`为ADDED_BRANDS|
|sceneKey|String|否|此次推送的场景key|null|如`品牌上新`时此值为brand_id|
|uids|List<String>|否|推送给哪些用户|null|大小不要超过10000,量大时自行分片|
|iosVersions|List<String>|是|ios版本号|null|无|
|androidVersions|List<String>|是|安卓的版本号|null|无|

 - 参数申明
    - androidTitle和androidContent同时为空,则不会生成安卓的推送任务。
    - iosAlert为空,则不会生成ios的推送任务。
    - sceneType 和 sceneKey 很重要,大数据统计时会用到,请合理命名。
    - uids大小不要超过1W,数据量大时,请自行分片。

#### 生成MQ消息实体的demo
    - PushTaskMqMessage对象
    public class PushTaskMqMessage{
        private String androidTitle;// 安卓推送标题
    	private String androidContent;// 安卓推送内容
    	private String iosAlert;// IOS推送内容
    	private String appendParams = "{\"type\":\"event\",\"ad_action\":\"go.brand\",\"ad_option\":\"brand=4\"}";// 推送跳转的链接,默认品牌首页
    	private Long sendTime;// 推送时间
    	private String sceneType;// sceneType 的类型(如上新推送、改价推送、到时候有统一的配置,方便)
    	private String sceneKey;// 推送场景的key(如上新推送的brandId)
    	private List<String> uids;// 要给哪些用户推送
    	private List<String> iosVersions;// 推送的版本号
    	private List<String> androidVersions;// 推送的版本号
    }
    
    - 生成写进MQ的消息字符串
    public static void main(String[] args) {
        JSONObject pushMessage = new JSONObject();
		PushTaskMqMessage pushTaskMqMessage = new PushTaskMqMessage();
		//设置安卓推送标题和内容,同时为空则不推送安卓
		pushTaskMqMessage.setAndroidTitle("秒杀活动即将开始");
		pushTaskMqMessage.setAndroidContent("adidas秒杀活动计即将开始,赶紧戳进来>>");
		
		//设置IOS推送内容,为空则不推送IOS
		pushTaskMqMessage.setIosAlert("您订阅的adidas秒杀活动计即将开始,赶紧戳进来>>");
		
		//APP跳转链接,有参考文档,一定要是个完整的JSON字符串
		pushTaskMqMessage.setAppendParams("{\"type\":\"event\",\"ad_action\":\"go.url\",\"ad_option\":\"link=http://feature.yoho.cn/1019/1019NEWGIRL/index.html?app_version=4.9.2.1609120001\",\"isLogin\":\"Y\",\"act_id\":\"841\"}");
		
		//设置推送场景和推送key
		pushTaskMqMessage.setSceneType("SpecilSkill");
		pushTaskMqMessage.setSceneKey("841");
		
		//设置推送的uids,一批不要超过1W,量大自行分片
		pushTaskMqMessage.setUids(Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"));
		
		//设置APP版本,不设则所有的版本
		pushTaskMqMessage.setIosVersions(null);
		pushTaskMqMessage.setAndroidVersions(null);
		
		//生成丢进mq的字符串
	    pushMessage.put("data", pushTaskMqMessage);
		String addToMqString = pushMessage.toJSONString();
		System.out.println(addToMqString);
        //TODO ADD pushMessage json String to RabbitMq,topic is  yoho_task_push
    }


## 2、直接发给用户【不入库,日志中可统计推送总数,无法统计打开总数】

#### 适用场景:
 - 针对某些业务场景,如给用户发一条‘你的订单即将过期,请赶紧支付’的消息,默认不入库。

#### 对接方式:
 - 直接往rabbitMQ写一条消息进MQ, 所有`push`节点会监听MQ, 接收到推送任务之后,进行推送。 
     - topic类型 : `yoho_push` 
 - 测试环境rabbitMq账号密码:[取的是global-autoconfig.properties中`rabbit_common`的值]
        - rabbit_host=${rabbit_common} 【`192.168.102.211:5672`】
        - rabbit_user=${rabbit_common_user}【yoho】
        - rabbit_password=${rabbit_common_password}【yoho】
        - rabbit_vhost=yoho
      - AWS rabbitMq账号密码:[取的是global-autoconfig.properties中`rabbit_common`的值]
        - rabbit_host=${rabbit_common} 【`rabbitmq-common.yohoops.org:5672`】
        - rabbit_user=${rabbit_common_user}【yoho】
        - rabbit_password=${rabbit_common_password}【yoho】
        - rabbit_vhost=yoho
  - PUSH收到此中MQ消息,不会生成具体的任务,拿到了直接发给用户。发的过程中会记日志。
  
#### 消息格式体
| 参数名称 | 参数类型 |  可否为空 | 参数解释 | 默认值 | 备注 | 
|:-------| -----:|-----:|-----:|-----:|----:| 
|id|int|否|任务id,`请设为0`|无||
|title|String|否|推送标题|无|推送类型为安卓时,为安卓标题,ios则设为''|
|content|String|否|推送内容|无|安卓推送的内容或IOS推送的内容|
|sendMethods|String|否|推送方法|android_getui或ios|安卓为android_getui,ios为ios|
|version|String|是|APP推送的具体版本|null|不传为全部版本|
|appendParams|String|否|APP跳转链接|null|必须为`JSON格式`的字符串,给APP跳转使用|
|pushScene|String|否|此次推送的场景|null|如`订单即将关闭`为ORDER_PUSH|
|pushSceneKey|String|否|此次推送的场景key|null|如`订单即将关闭`,此值为order_id|
|uids|List<String>|否|推送给哪些用户|null|大小不要超过10000,量大时自行分片|

- 参数申明
    - title和content表示推送的内容和标题,安卓两个字段都要填,ios的title设为'',content设为完整的推送内容
    - id为send_task表中对应的id,因为业务方并不知道,默认情况下直接设为0即可。
    - sceneType 和 sceneKey 很重要,大数据统计时会用到,请合理命名。
    - uids大小不要超过1W,数据量大时,请自行分片。
    
#### 生成MQ消息实体的demo
    - PushSendTaskBO对象
    public class PushSendTaskBO {
	    private int id = 0;//任务id,为0即可
    	private String title;//推送标题
    	private String content;//推送内容
    	private String sendMethods;//ios/android_getui
    	private String version;//版本,可为空
        private String appendParams;//APP跳转链接
        private String pushScene;//推送场景
        private String pushSceneKey;//推送场景key
    }
    
    - DispatchPushMsgBO对象
    public class DispatchPushMsgBO {
		private PushSendTaskBO task;
	    private List<String> uids;
    }
    
    - 生成写进MQ的消息字符串
    public class DispatchPushMsgDemo {
        public static void main(String[] args) {
    		JSONObject dispatchPushMsgDemo = new JSONObject();
    		DispatchPushMsgBO dispatchPushMsg = new DispatchPushMsgBO();
    	    //构造推送内容
    		PushSendTaskBO pushSendTaskBO = new PushSendTaskBO();
    		pushSendTaskBO.setId(0);
    		pushSendTaskBO.setTitle("");
    		pushSendTaskBO.setContent("您订阅的adidas秒杀活动计即将开始,赶紧戳进来>>");
    		pushSendTaskBO.setAppendParams("{\"type\":\"event\",\"ad_action\":\"go.url\",\"ad_option\":\"link=http://feature.yoho.cn/1019/1019NEWGIRL/index.html?app_version=4.9.2.1609120001\",\"isLogin\":\"Y\",\"act_id\":\"841\"}");
    		pushSendTaskBO.setPushScene("SpecilSkill");
    		pushSendTaskBO.setPushSceneKey("841");
    		pushSendTaskBO.setSendMethods("ios");
    		dispatchPushMsg.setTask(pushSendTaskBO);
    		//构造推送的uids
    		dispatchPushMsg.setUids(Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"));
    		dispatchPushMsgDemo.put("data", dispatchPushMsg);
    		//显示MQ消息的内容
    		System.out.println(dispatchPushMsgDemo.toJSONString());
    	}
   }