全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
号码隐私保护

回执消息-队列模式

更新时间:2018-05-08 10:20:04

简介

当您使用隐私号码服务绑定一组AXB(或者AXN、以下统一以AXB为代表说明)隐私关系后,可以通过使用MNS的Queue模型来接收话单回执消息,话单回执消息时记录了AXB三元组发生的所有的通话记录行为。

消息的订阅

云通信的所有业务消息都用过MNS消息服务向外发送。用户每订阅一个类别的消息(比如隐私号码话单回执消息(SecretReport),系统都会为用户分配一个独立的消息队列。用户可以通过阿里云账号拿到一个临时的token用于获取队列中的消息。用户可以下载demo,编写简单的消息处理类即可完成消息处理的任务。在页面上订阅消息,订阅完消息后,能拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-SecretReport 。队列名字每个用户都不同。

消息类型

隐私号码目前提供一种消息类型,话单回执消息SecretReport

参数列表
名称 类型 描述 示例 是否必须
sub_id Number 通话对应的三元组的绑定关系ID 123456 必须
call_id String 唯一标识一通通话记录的ID abcdef1234 必须
phone_no String AXB中的A号码 15000000000 必须
secret_no String AXB中的X号码 1700000000 必须
peer_no String AXB中的B号码或者N号码 1580000000 必须
call_type Number 呼叫类型 0:主叫(phone_no打给peer_no);1:被叫(peer_no打给phone_no);2:短信发送;3:短信接收 必须
call_time Date 呼叫动作开始时间 “2017-09-01 12:00:00” 必须
ring_time Date 对端手机振铃时间 “2017-09-01 12:01:00” 必须
start_time Date 对端接听时间 “2017-09-01 12:01:00” 必须
release_time Date 对端挂断时间,release_time - start_time 代表通话时长 如果结果为0,代表呼叫未接通 “2017-09-01 12:02:00” 必须
release_dir Number 通话释放方向 0 ,1 ,2 ,3 必须
release_cause Number 释放原因
1:未分配的号码
2:无路由到指定的转接网
3:无路由到目的地
4:发送专用信息音
16:正常的呼叫拆线
17:用户忙
18:用户未响应
19:用户未应答
20:用户缺席
21:呼叫拒收
22:号码改变
27:目的地不可达
28:无效的号码格式(地址不全)
29:性能拒绝
31:正常—未指定
34: 无电路/通路可用
42: 交换设备拥塞
50:所请求的性能未预定
53:CUG中限制去呼叫
55: CUG中限制来呼叫
57:承载能力无权
58:承载能力目前不可用
65:承载能力未实现
69:所请求的性能未实现
87:被叫用户不是CUG的成员
88:不兼容的目的地
90:不存在的CUG
91:无效的转接网选择
95:无效的消息,未指定
97:消息类型不存在或未实现
99:参数不存在或未实现
102:定时器终了时恢复
103:参数不存在或未实现—传递
110:消息带有未被识别的参数—舍弃
111:协议错误,未指定
127:互通,未指定
1 可选

技术对接步骤

下载消息SDK

下载对应语音的消息DEMO工程,工程所需要的所有依赖jar包都放在DEMO工程的lib目录下,将对于的jar包引入到您的工程当中既可按照DEMO样例编写接收消息的程序。

SDK&DEMO【下载地址】

样例
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Aliyun.Acs.Core;
  6. using Aliyun.Acs.Core.Exceptions;
  7. using Aliyun.Acs.Core.Profile;
  8. using Aliyun.Acs.Dybaseapi.Model.V20170525;
  9. //using Aliyun.Acs.Dybaseapi.Model.V20170525.QueryTokenForMnsQueueResponse.MessageTokenDTO_;
  10. using Aliyun.MNS;
  11. using Aliyun.MNS.Model;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace ConsoleApplication7
  15. {
  16. class Program
  17. {
  18. private static int maxThread = 2;
  19. static String accessId = "yourAccessId";
  20. static String accessSecret = "yourAccessSecret";
  21. static String messageType = "SecretReport";//消息类型目前有4种. 短信回执:SmsReport; 短信上行:SmsUp; 语音回执:VoiceReport; 流量回执:FlowReport;小号话单回执:SecretReport
  22. static String queueName = "Alicom-Queue-xxxxxxx-SecretReport";// 短信上行的队列名称. 格式是 "前缀(Alicom-Queue-)+阿里云uid+消息类型"
  23. static String domainForPop = "dybaseapi.aliyuncs.com";
  24. static String regionIdForPop = "cn-hangzhou";
  25. static String productName = "Dybaseapi";
  26. static IAcsClient acsClient = null;
  27. public static IAcsClient InitAcsClient(String regionIdForPop, String accessId, String accessSecret, String productName, String domainForPop)
  28. {
  29. IClientProfile profile = DefaultProfile.GetProfile(regionIdForPop, accessId, accessSecret);
  30. DefaultProfile.AddEndpoint(regionIdForPop, regionIdForPop, productName, domainForPop);
  31. IAcsClient acsClient = new DefaultAcsClient(profile);
  32. return acsClient;
  33. }
  34. // 初始化环境
  35. private static void InitData()
  36. {
  37. acsClient = InitAcsClient(regionIdForPop, accessId, accessSecret, productName, domainForPop);
  38. }
  39. static void Main(string[] args)
  40. {
  41. InitData();
  42. for (int i = 0; i < maxThread; i++)
  43. {
  44. TestTask testTask = new TestTask("PullMessageTask-thread-" + i, messageType, queueName, acsClient);
  45. Thread t = new Thread(new ThreadStart(testTask.Handle));
  46. //启动线程
  47. t.Start();
  48. }
  49. Console.ReadKey();
  50. }
  51. }
  52. class TestTask
  53. {
  54. private object o = new object();
  55. private int sleepTime = 50;
  56. public String name { get; private set; }
  57. public String messageType { get; private set; }
  58. public String queueName { get; private set; }
  59. public int TaskID { get; private set; }
  60. public IAcsClient acsClient { get; private set; }
  61. public TestTask(String name, String messageType, String queueName, IAcsClient acsClient)
  62. {
  63. this.name = name;
  64. this.messageType = messageType;
  65. this.queueName = queueName;
  66. this.acsClient = acsClient;
  67. }
  68. long bufferTime = 60 * 2;//过期时间小于2分钟则重新获取,防止服务器时间误差
  69. String mnsAccountEndpoint = "https://1943695596114318.mns.cn-hangzhou.aliyuncs.com/";//阿里通信消息的endpoint,固定
  70. Dictionary<string, QueryTokenForMnsQueueResponse.MessageTokenDTO_> tokenMap = new Dictionary<string, QueryTokenForMnsQueueResponse.MessageTokenDTO_>();
  71. Dictionary<string, Queue> queueMap = new Dictionary<string, Queue>();
  72. public QueryTokenForMnsQueueResponse.MessageTokenDTO_ GetTokenByMessageType(IAcsClient acsClient, String messageType)
  73. {
  74. QueryTokenForMnsQueueRequest request = new QueryTokenForMnsQueueRequest();
  75. request.MessageType = messageType;
  76. QueryTokenForMnsQueueResponse queryTokenForMnsQueueResponse = acsClient.GetAcsResponse(request);
  77. QueryTokenForMnsQueueResponse.MessageTokenDTO_ token = queryTokenForMnsQueueResponse.MessageTokenDTO;
  78. return token;
  79. }
  80. /// 处理消息
  81. public void Handle()
  82. {
  83. while (true)
  84. {
  85. try
  86. {
  87. QueryTokenForMnsQueueResponse.MessageTokenDTO_ token = null;
  88. Queue queue = null;
  89. lock (o)
  90. {
  91. if (tokenMap.ContainsKey(messageType))
  92. {
  93. token = tokenMap[messageType];
  94. }
  95. if (queueMap.ContainsKey(queueName))
  96. {
  97. queue = queueMap[queueName];
  98. }
  99. TimeSpan ts = new TimeSpan(0);
  100. if (token != null)
  101. {
  102. DateTime b = Convert.ToDateTime(token.ExpireTime);
  103. DateTime c = Convert.ToDateTime(DateTime.Now);
  104. ts = b - c;
  105. }
  106. if (token == null || ts.TotalSeconds < bufferTime || queue == null)
  107. {
  108. token = GetTokenByMessageType(acsClient, messageType);
  109. IMNS client = new Aliyun.MNS.MNSClient(token.AccessKeyId, token.AccessKeySecret, mnsAccountEndpoint, token.SecurityToken);
  110. queue = client.GetNativeQueue(queueName);
  111. if (tokenMap.ContainsKey(messageType))
  112. {
  113. tokenMap.Remove(messageType);
  114. }
  115. if (queueMap.ContainsKey(queueName))
  116. {
  117. queueMap.Remove(queueName);
  118. }
  119. tokenMap.Add(messageType, token);
  120. queueMap.Add(queueName, queue);
  121. }
  122. }
  123. BatchReceiveMessageResponse batchReceiveMessageResponse = queue.BatchReceiveMessage(16);
  124. List<Message> messages = batchReceiveMessageResponse.Messages;
  125. for (int i = 0; i <= messages.Count - 1; i++)
  126. {
  127. try
  128. {
  129. byte[] outputb = Convert.FromBase64String(messages[i].Body);
  130. string orgStr = Encoding.UTF8.GetString(outputb);
  131. System.Console.WriteLine(orgStr);
  132. //TODO 具体消费逻辑,待客户自己实现.
  133. //消费成功的前提下删除消息
  134. queue.DeleteMessage(messages[i].ReceiptHandle);
  135. }
  136. catch (Exception e)
  137. {
  138. System.Console.WriteLine("Hello World!", e);
  139. }
  140. }
  141. }
  142. catch (Exception e)
  143. {
  144. System.Console.WriteLine("Handle exception", e);
  145. }
  146. Thread.Sleep(sleepTime);
  147. }
  148. }
  149. }
  150. }
本文导读目录