Skip to content

startalkIM/push_service

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

StarTalk push服务

如果您按照后端的部署文档,或者使用我们的一键部署包完成了部署,那么只看这篇文档就可以完善push能力了,并不需要单独下载和部署任何内容。

IM 后端的 push 服务,支持 IOS apns 协议推送,android 小米,华为,魅族,oppo厂商推送 push 服务支持 startalk 消息 push,同时也支持接入自己的 push 服务

push 服务选项

  • 如果您自己有build app的能力,那么请自己生成、部署app,并[自己部署push](#私有化部署 push);
  • 您有已经在应用的push服务器,需要[复用自己的push服务器](#自有 push 系统);
  • 如果您并不打算部署app,只想用开源版本的startalk,那么可以接入我们的[公共push服务器](#共用 push 系统)

(因为app push证书在团队内), 此时您需要支付一定的服务器公摊费用,但是肯定比短信便宜的多!详情可以联系我们的客服人员。


共用push系统

对于已经私有化部署的用户来说比较简单,不需要下载,更新服务,只需要按照如下步骤执行即可. 全程只需要修改一个配置文件,重启下服务即可。 一共有四步:

  • 第一步
$ vim /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties
  • 第二步

在配置文件中,找到: qtalk_push_url=

将您收到的邮件或者信息中的公有url填入,填写完成之后应该看起来是这样的:(没有空格) qtalk_push_url=https://xxx.xx.com/xxx/push/sendPush.xxx

  • 第三步: 在配置文件中,找到:

qtalk_push_key=

将您收到的邮件或者信息中的push key填入,填写完成之后应该看起来是这样的: (没有空格)

qtalk_push_key=xxxxxxxx

  • 第四步: 杀掉服务,并重启服务
$./startalk/tomcat/push_service/startup.sh


私有化部署 push

全程只需要修改一个配置文件,重启下服务即可。

文件位置在:

/startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties

Android 和 IOS 证书配置

如果需要使用服务支持的 push,Android 需要自己去小米和华为开发平台注册自己应用的 app_key, IOS 需要生产签名证书,配置如下:

ios push 证书

ios_push_cer_qtalk=线上证书所在路径
ios_push_cer_qtalk_beta=beta证书所在路径

Android配置

adr.qtalk.pkgname=应用包名
adr.mipush.qtalk.key=mipush key(是个文本)
adr.hwpush.qtalk.key=hwpush key(是个文本)

自有push系统

全程只需要修改一个配置文件,重启下服务即可。

文件位置在:

/startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties
private.push.url=这里指向您的push服务的接收方法

此时,push 服务将作为客户端,将需要发送的 push 内容推向你现有的 push 服务器。

你服务器中需要实现上面提到的方法。其中:

http request 的 Header中,

Content-Type:application/json

post body是个json,内容为类似这样的形式:

{
    "From":"ming.xiao",
    "To":"hong.xiao",
    "Body":"明天去哪儿玩儿?",
    "Mtype":1,
    "Message":"xml"
}


配置

使用QTalk/Startalk客户端的情况如要使用push,需要联系客服配置下面信息

qtalk_push_url=
#使用星语push key
qtalk_push_key=

项目详解

push服务有多个获取消息的方式,包含

  1. 从MQ获取(Kafka),
  2. Http获取(Post请求)

目前采用的是第二种 /sendMessageToPush.qunar

之后 SpoolMessageService.java +122 -- getMesaageToSend 将XML进行消息解析 从push_info表中获取每一个要推送用户的

  • 手机型号
  • mac_key
  • 推送配置
  • 是否订阅群等

每个用户在第一次登陆客户端时会向后台post请求setpersonmackey.qunar自己的这些信息并由服务入库

包括

  • 用户手机型号
  • mac地址、是否处于符合push的条件

(手机是否打开推送开关、是否处于手机app处于后台状态、是否没有在线状态的客户端等)

  • 是否明文推送
  • ......

之后则判断是否有自有的push服务器 SpoolMessageService.java +192,如果有则以http发送post请求, 请求为

map.put("From", F); //发送人/群
map.put("To", QtalkStringUtils.parseId(info.toUserName));//接收人
map.put("Body", B);//消息内容(单人【消息内容】;群【说话人:消息内容】)
map.put("Mtype", info.msg_type);//消息类型
map.put("Message", info.msgxml);//原始消息

之后在函数formatBaseNotification将消息转为推送用格式, 最终格式包含

	/**发送人,可用来做notifyid*/
    public String fromjid;
    /**通知标题,消息的from*/
    public String title;
    /**通知内容,单人消息的message,群消息 realfrom:message*/
    public String description;
    /**消息内容,根据msgtype转化后的message*/
    public String body;
    /**消息类型  eg. chat group consult*/
    public String originType;
    /**消息的msg_type*/
    public int msg_type;
    /**signaltype  根据消息type转化*/
    public int type;
    /** consult专用 chatid=4:用户->客服  5:客服->用户 */
    public String chatid;
    /**指定通知对象,客户端上传到token*/
    public List<String> platkeys;
    /**Android客户端平台*/
    public String platname;
    /**Android的客户端包名,ios的bundleid*/
    public String pkgname;
    public String json = "Just unused now";
    /**map里面发消息人的id*/
    public String fromName;
    /**map里面发消息人的domain*/
    public String fromHost;
    /** consult消息 realjid */
    public String realjid;
    /**群消息map里面发消息人的nick*/
    public String fromNick;
    /**消息to,带domain*/
    public String toUserName;
    /**消息的xml*/
    public String msgxml;
    public String cctext;
    public String messageId;
    /**发送系统 android ios*/
    public String os;
    /**星语开放平台注册push key*/
    public String push_key;

举例:

{
	"body": "小明 : 您好?(长度最多50个字符)",
	"cctext": "",
	"chatid": "",
	"description": "小明 : 您好?",
	"fromHost": "conference.startalk.im",
	"fromName": "7d01311b7ef14edd9d4f2c636e02d206(群id)",
	"fromNick": "小明",
	"fromjid": "[email protected] (群jid)",
	"json": "Just unused now",
	"messageId": "d7347ff46318473297e1dc53d40c260c",
	"msg_type": 1,
	"msgxml": "...(原xml)",
    "originType": "groupchat(群聊标志)",
	"os": "ios(平台)",
	"pkgname": "...(bundle id)",
	"platkeys": ["...(客户端mac_key)"],
	"platname": "iPhone12,1_zh_CN",
	"realjid": "",
	"title": "Startalk团队",
	"toUserName": "小红@startalk.im(群内某个群员)",
	"type": 7
}

之后判断是否有qtalk_push_url(公有push系统), 有则类似私有push系统向其进行post请求, 如果没有则将消息向厂商分发

ios使用pushyIosNewPushService.java,支持

  • 证书
  • token

两种验证方式,

如果采用证书,在app.properties里填写ios_push_bid(bundle id),ios_push_cer_qtalk(证书文件名,将其放在项目的resources文件夹下后打包,或放在部署好的tomcat /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/下),ios_push_cer_pwd=证书密码,

如果采用token的方式在app.properties里填写ios_push_bid(bundle id),team_id(团队名),token_key_id(在apple-developer请求的token)

Android为自制推送ThirdPushServerManager,通过在src/java/com.qunar.qchat/adrpushserver下每个厂商的sendNotifyToAlias方法,推送消息

问题反馈

app(AT)startalk.im(邮件)

About

The backend service of message push system.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%