功能说明
消息服务功能可以让交易数据实时通知到ISV,帮助三方建站的导购ISV做售后服务,个性化的营销推荐服务。
TAE容器会记录通过TAE应用访问到宝贝详情页的买家基本信息,一旦买家在有效时间内(下单时间减去用户通过app浏览宝贝的最新时间小于等于15天)购买通过app浏览过的宝贝,则系统自动将该笔订单标示为app引导成交,app可以通过top端提供的消息服务获取到订单基本信息(比如购买者混淆nick、宝贝标题、宝贝id、购买宝贝数量以及实际付款)。
使用说明
消息服务使用完整介绍://open.taobao.com/doc/detail.htm?id=101663
首先订阅From淘宝消息
在开放平台应用管理后台 如下页面订阅消息:
如果没有权限,请点击申请权限(目前属于试用阶段,只对“特色中国” 应用类型开放)
点击消息名称,就能查看具体的返回信息字段。
代码实现接收消息
正式环境请求地址:ws://mc.api.taobao.com/
沙箱环境请求地址:ws://mc.api.tbsandbox.com/
消息服务相关api://open.taobao.com/api/api_cat_detail.htm?spm=0.0.0.0.V0oi2c&cat_id=20439&category_id=102
① 为用户开通消息服务
调用taobao.tmc.user.permit接口
取消用户的消息服务调用taobao.tmc.user.cancel接口,可以通过接口taobao.tmc.user.get获取用户已开通消息,在接收不到消息的时候首先可以通过入参输入is_valid,topics,modified来判断用户是否开通相应消息
② 接收消息,实现方式有两种:通过SDK接收消息、通过API接收消息
目前支持JAVA语言,其它语言建议采用API接收消息。通过SDK接收消息只需要关注业务的处理,不需要操心消息重发、确认、长连接的重连等操作,SDK会自动处理好一切。
Java接口说明
- public interface MessageHandler {
-
-
-
-
-
-
-
-
-
-
-
- public void onMessage(Message message, MessageStatus status) throws Exception;
-
- }
- TmcClient client = new TmcClient("app_key", "app_secret","default");
- client.setMessageHandler(new MessageHandler() {
- public void onMessage(Message message, MessageStatus status) {
- try {
- System.out.println(message.getContent());
- System.out.println(message.getTopic());
-
- } catch (Exception e) {
- e.printStackTrace();
- status.fail();
- }
- }
- });
- client.connect();
注:采用Java main方法在Eclipse里面运行上面的代码测试时,请在client.connect()后面加上Thread.sleep让main线程等待一段时间结束,以便观察消息的实时接收情况,否则main线程结束后,TMC长连接也会跟着断开。如果是在web服务器上运行上面的代码,则不用在client.connect()后面加任何Thread.sleep代码,也不需要在外面包一层while(true)循环,因为web服务器上的主线程只要服务器不关闭都是不会结束的,TMC的长连接会一直保持。
提供API接收消息的目的是那种对多线程和长连接处理不方便的语言使用的,比如PHP、Phyton,这些语言官方暂时没有提供SDK,可以通过下面两个API配合使用也能达到准实时接收和确认消息的目的。
首先:消费消息
API名称:taobao.tmc.messages.consume
API入参:
说明:消息消费后,指针自动后移,下次调用自动获取到未消费过的消息,但是消费确认后的消息无法再次获取。
然后:确认消息
API名称:taobao.tmc.messages.confirm
API入参:
说明:获取消息后,如果不确认,消息服务会选择时机重发,重发次数由消息服务控制,如果消息7天内都没有被确认将会被删除。
- TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "app_key", "app_secret", "json");
- do {
- long quantity = 100L;
- TmcMessagesConsumeResponse rsp = null;
- do {
- TmcMessagesConsumeRequest req = new TmcMessagesConsumeRequest();
- req.setQuantity(quantity);
- req.setGroupName("default");
- rsp = client.execute(req);
- if (rsp.isSuccess() && rsp.getMessages() != null) {
- for (TmcMessage msg : rsp.getMessages()) {
-
- System.out.println(msg.getContent());
- System.out.println(msg.getTopic());
-
- TmcMessagesConfirmRequest cReq = new TmcMessagesConfirmRequest();
- cReq.setGroupName("default");
- cReq.setsMessageIds(String.valueOf(msg.getId()));
- TmcMessagesConfirmResponse cRsp = client.execute(cReq);
- System.out.println(cRsp.getBody());
- }
- }
- System.out.println(rsp.getBody());
- } while (rsp != null && rsp.isSuccess() && rsp.getMessages() != null && rsp.getMessages().size() == quantity);
- Thread.sleep(3000L);
- } while (true);
更多请查看消息服务完整介绍://open.taobao.com/doc/detail.htm?id=101663
DEMO
Java版长连接方式(SDK方式)
pubdivc class GetMessageBySDK {
pubdivc static void main(String[] args)throws Exception{
TmcCdivent cdivent = new TmcCdivent("1234567","xxxxxxx","default");
cdivent.setMessageHandler(new MessageHandler() {
@Override
pubdivc void onMessage(Message message, MessageStatus messageStatus) throws Exception {
try{
System.out.println("content:"+message.getContent());
System.out.println("topic:"+message.getTopic());
}catch (Exception e){
e.printStackTrace();
messageStatus.fail();
}
}
});
cdivent.connect();
}
}
Java API方式
import com.taobao.api.DefaultTaobaoCdivent;
import com.taobao.api.TaobaoCdivent;
import com.taobao.api.domain.TmcMessage;
import com.taobao.api.request.TmcMessagesConfirmRequest;
import com.taobao.api.request.TmcMessagesConsumeRequest;
import com.taobao.api.response.TmcMessagesConfirmResponse;
import com.taobao.api.response.TmcMessagesConsumeResponse;
pubdivc class GetMessageByAPI {
pubdivc static final String ONdivNE_SERVER_URL = "http://gw.api.taobao.com/router/rest";
pubdivc static void main(String[] args )throws Exception{
TaobaoCdivent cdivent = new DefaultTaobaoCdivent(ONdivNE_SERVER_URL,"12345678", "xxxxxxxx", "json");
do {
long quantity = 100L;
TmcMessagesConsumeResponse rsp = null;
do {
TmcMessagesConsumeRequest req = new TmcMessagesConsumeRequest();
req.setQuantity(quantity);
req.setGroupName("default");
rsp = cdivent.execute(req);
if (rsp.isSuccess() && rsp.getMessages() != null) {
for (TmcMessage msg : rsp.getMessages()) {
System.out.println();
System.out.println(msg.getContent());
System.out.println(msg.getTopic());
TmcMessagesConfirmRequest cReq = new TmcMessagesConfirmRequest();
cReq.setGroupName("default");
cReq.setsMessageIds(String.valueOf(msg.getId()));
TmcMessagesConfirmResponse cRsp = cdivent.execute(cReq);
System.out.println("已经确认消费消息:"+cRsp.getBody());
}
}
System.out.println("request again........");
} while (rsp != null && rsp.isSuccess() && rsp.getMessages() != null && rsp.getMessages().size() == quantity);
Thread.sleep(30000L);
} while (true);
}
}
Php api方式
<?php
include("RequestCheckUtil.php");
include("tmcmessagesconsumerequest.php");
include("topclient.php");
include("TmcMessagesConfirmRequest.php");
$c = new TopClient;
$c->appkey = "21749834";
$c->secretKey = "83d21fd8f1ba9f150c774a568deef058";
$c->gatewayUrl = "http://gw.api.taobao.com/router/rest";
$c->format = "json";
$req = new TmcMessagesConsumeRequest;
$req->setQuantity(10);
$resp = $c->execute($req);
print_r($resp);
for ($i=0; $i<count($resp->messages->tmc_message); $i++)
{
$messages_ids.=$resp->messages->tmc_message[$i]->id.",";
}
$messages_ids = substr($messages_ids,0,strlen($messages_ids)-1);
echo $messages_ids;
$req2 = new TmcMessagesConfirmRequest;
$req2->setSMessageIds($messages_ids);
$resp2 = $c->execute($req2);
?>
FAQ
关于此文档暂时还没有FAQ