TAE导购平台成交记录消息服务

更新时间:2015/09/18 访问次数:16479

功能说明

消息服务功能可以让交易数据实时通知到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接收消息

 通过SDK接收消息

目前支持JAVA语言,其它语言建议采用API接收消息。通过SDK接收消息只需要关注业务的处理,不需要操心消息重发、确认、长连接的重连等操作,SDK会自动处理好一切。

Java接口说明
  1. public interface MessageHandler {  
  2.   
  3.     /** 
  4.      * 消息服务客户端收到消息后,会回调该方法处理具体的业务,处理结果可以通过以下两种方式来表述: 
  5.      * <ul> 
  6.      * <li>抛出异常或设置status.fail()表明消息处理失败,需要消息服务端重发 
  7.      * <li>不抛出异常,也没有设置status信息,则表明消息处理成功,消息服务端不会再投递此消息 
  8.      *  
  9.      * @param message 消息内容 
  10.      * @param status 处理结果,如果调用status.fail(),消息服务将会择机重发消息;否则,消息服务认为消息处理成功 
  11.      * @throws Exception 消息处理失败,消息服务将会择机重发消息 
  12.      */  
  13.     public void onMessage(Message message, MessageStatus status) throws Exception;  
  14.   
  15. }  

 
Java代码:
  1. TmcClient client = new TmcClient("app_key""app_secret","default");
  2. client.setMessageHandler(new MessageHandler() {  
  3.     public void onMessage(Message message, MessageStatus status) {  
  4.         try {  
  5.             System.out.println(message.getContent());  
  6.             System.out.println(message.getTopic());
  7.             // 默认不抛出异常则认为消息处理成功  
  8.         } catch (Exception e) {  
  9.             e.printStackTrace();  
  10.             status.fail();// 消息处理失败回滚,服务端需要重发  
  11.         }  
  12.     }  
  13. });  
  14. client.connect();
注:采用Java main方法在Eclipse里面运行上面的代码测试时,请在client.connect()后面加上Thread.sleep让main线程等待一段时间结束,以便观察消息的实时接收情况,否则main线程结束后,TMC长连接也会跟着断开。如果是在web服务器上运行上面的代码,则不用在client.connect()后面加任何Thread.sleep代码,也不需要在外面包一层while(true)循环,因为web服务器上的主线程只要服务器不关闭都是不会结束的,TMC的长连接会一直保持。
 

 通过API接收消息

提供API接收消息的目的是那种对多线程和长连接处理不方便的语言使用的,比如PHP、Phyton,这些语言官方暂时没有提供SDK,可以通过下面两个API配合使用也能达到准实时接收和确认消息的目的。

 

首先:消费消息

API名称:taobao.tmc.messages.consume

API入参:

 

说明:消息消费后,指针自动后移,下次调用自动获取到未消费过的消息,但是消费确认后的消息无法再次获取。

 

然后:确认消息

API名称:taobao.tmc.messages.confirm

API入参:

说明:获取消息后,如果不确认,消息服务会选择时机重发,重发次数由消息服务控制,如果消息7天内都没有被确认将会被删除。

Java代码:
  1. TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest""app_key""app_secret""json");  
  2. do {  
  3.     long quantity = 100L;  
  4.     TmcMessagesConsumeResponse rsp = null;  
  5.     do {  
  6.         TmcMessagesConsumeRequest req = new TmcMessagesConsumeRequest();  
  7.         req.setQuantity(quantity);  
  8.         req.setGroupName("default");  
  9.         rsp = client.execute(req);  
  10.         if (rsp.isSuccess() && rsp.getMessages() != null) {  
  11.             for (TmcMessage msg : rsp.getMessages()) {  
  12.                 // handle message  
  13.                 System.out.println(msg.getContent());  
  14.                 System.out.println(msg.getTopic());  
  15.                 // confirm message  
  16.                 TmcMessagesConfirmRequest cReq = new TmcMessagesConfirmRequest();  
  17.                 cReq.setGroupName("default");  
  18.                 cReq.setsMessageIds(String.valueOf(msg.getId()));  
  19.                 TmcMessagesConfirmResponse cRsp = client.execute(cReq);  
  20.                 System.out.println(cRsp.getBody());  
  21.             }  
  22.         }  
  23.         System.out.println(rsp.getBody());  
  24.     } while (rsp != null && rsp.isSuccess() && rsp.getMessages() != null && rsp.getMessages().size() == quantity);  
  25.     Thread.sleep(3000L);  
  26. while (true);  

 

 更多请查看消息服务完整介绍://open.taobao.com/doc/detail.htm?id=101663


 

 

DEMO

 Java版长连接方式(SDK方式)

 

/**
*  说明:
*  1.通过长连接方式(又称sdk方式)获取消息,connect之后会一直监听,有消息就会发送
*  2.TmcCdivent cdivent = new TmcCdivent(appkey,appsecret,"default");
*/
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;
/**
* 说明:
* 1.指定serverUrl,demo中为ONdivNE_SERVER_URL
* 2.TaobaoCdivent cdivent = new DefaultTaobaoCdivent(serverUrl,appkey,appsecret,format);
* 3.isv需要通过TmcMessagesConfirmRequest&TmcMessagesConfirmResponse来确认消息已消费 
*/
pubdivc class GetMessageByAPI {
   //api方式线上serverUrl
    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()) {
                        // 获取消息体内容content和消息名称topic
                        System.out.println();
                        System.out.println(msg.getContent());
                        System.out.println(msg.getTopic());
                        // 跟服务器确认消息已消费
                        TmcMessagesConfirmRequest cReq = new TmcMessagesConfirmRequest();
                        cReq.setGroupName("default");
                        //参数为消息Id,可以通过TmcMessage获取
                        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");
            //实例化TopClient类
            $c = new TopClient;
            $c->appkey = "21749834";
            $c->secretKey = "83d21fd8f1ba9f150c774a568deef058";
            $c->gatewayUrl = "http://gw.api.taobao.com/router/rest";
            $c->format = "json";
            //实例化具体API对应的Request类
            $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);
            /*
             * do something
             *
             * */
            echo $messages_ids;
            //确认消息
            $req2 = new TmcMessagesConfirmRequest;
            $req2->setSMessageIds($messages_ids);
            $resp2 = $c->execute($req2);
            ?>

FAQ

关于此文档暂时还没有FAQ
返回
顶部