全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与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. #!/usr/bin/env python
  2. # coding=utf8
  3. import sys
  4. from aliyunsdkcore.acs_exception.exceptions import ServerException
  5. from aliyunsdkcore.client import AcsClient
  6. from aliyunsdkdybaseapi.request.v20170525.QueryTokenForMnsQueueRequest import QueryTokenForMnsQueueRequest
  7. import datetime
  8. from mns.account import Account
  9. from mns.queue import *
  10. try:
  11. import json
  12. except ImportError:
  13. import simplejson as json
  14. """
  15. 云通信基础能力业务回执消息消费示例,供参考。
  16. Created on 2017-06-13
  17. """
  18. reload(sys)
  19. sys.setdefaultencoding('utf8')
  20. regionid = "cn-hangzhou"
  21. # ACCESS_KEY_ID/ACCESS_KEY_SECRET 根据实际申请的账号信息进行替换
  22. accesskeyid = "yourAccessKeyId"
  23. accesskeysecret = "yourAccessKeySecret"
  24. endpoint = "http://1943695596114318.mns.cn-hangzhou.aliyuncs.com"
  25. # 小号话单回执:SecretReport
  26. msgtype = "SecretReport"
  27. # 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
  28. qname = "Alicom-Queue-xxxxxxxx-SecretReport"
  29. #初始化acs_client
  30. acs_client = AcsClient(accesskeyid, accesskeysecret, regionid)
  31. # 云通信业务token存在失效时间,需动态更新。
  32. class Token():
  33. def __init__(self, token=None, tmp_access_id=None, tmp_access_key=None, expire_time=None):
  34. self.__token = token
  35. self.__tmp_access_id = tmp_access_id
  36. self.__tmp_access_key = tmp_access_key
  37. self.__expire_time = expire_time
  38. def get_token(self):
  39. return self.__token
  40. def set_token(self, token):
  41. self.__token = token
  42. def get_tmp_access_id(self):
  43. return self.__tmp_access_id
  44. def set_tmp_access_id(self, tmp_access_id):
  45. self.__tmp_access_id = tmp_access_id
  46. def get_tmp_access_key(self):
  47. return self.__tmp_access_key
  48. def set_tmp_access_key(self, tmp_access_key):
  49. self.__tmp_access_key = tmp_access_key
  50. def get_expire_time(self):
  51. return self.__expire_time
  52. def set_expire_time(self, expire_time):
  53. self.__expire_time = expire_time
  54. def is_refresh(self):
  55. # 失效时间与当前系统时间比较,提前2分钟刷新token
  56. now = datetime.datetime.now()
  57. expire = datetime.datetime.strptime(self.__expire_time, "%Y-%m-%d %H:%M:%S")
  58. # intval = (expire - now).seconds
  59. # print "token生效剩余时长(秒):" + str(intval)
  60. if (expire - now).seconds < 120:
  61. return 1
  62. return 0
  63. def refresh(self):
  64. print "start refresh token..."
  65. request = QueryTokenForMnsQueueRequest()
  66. request.set_MessageType(msgtype)
  67. response = acs_client.do_action_with_exception(request)
  68. # print response
  69. if response is None:
  70. raise ServerException("GET_TOKEN_FAIL", "获取token时无响应")
  71. response_body = json.loads(response)
  72. if response_body.get("Code") != "OK":
  73. raise ServerException("GET_TOKEN_FAIL", "获取token失败")
  74. self.__tmp_access_key = response_body.get("MessageTokenDTO").get("AccessKeySecret")
  75. self.__tmp_access_id = response_body.get("MessageTokenDTO").get("AccessKeyId")
  76. self.__expire_time = response_body.get("MessageTokenDTO").get("ExpireTime")
  77. self.__token = response_body.get("MessageTokenDTO").get("SecurityToken")
  78. print "finsh refresh token..."
  79. # 初始化 my_account, my_queue
  80. token = Token()
  81. token.refresh()
  82. my_account = Account(endpoint, token.get_tmp_access_id(), token.get_tmp_access_key(), token.get_token())
  83. my_queue = my_account.get_queue(qname)
  84. # my_queue.set_encoding(False)
  85. # 循环读取删除消息直到队列空
  86. # receive message请求使用long polling方式,通过wait_seconds指定长轮询时间为3秒
  87. ## long polling 解析:
  88. ### 当队列中有消息时,请求立即返回;
  89. ### 当队列中没有消息时,请求在MNS服务器端挂3秒钟,在这期间,有消息写入队列,请求会立即返回消息,3秒后,请求返回队列没有消息;
  90. wait_seconds = 3
  91. print "%sReceive And Delete Message From Queue%s\nQueueName:%s\nWaitSeconds:%s\n" % (
  92. 10 * "=", 10 * "=", qname, wait_seconds)
  93. while True:
  94. # 读取消息
  95. try:
  96. if token.is_refresh() == 1:
  97. # 刷新token
  98. token.refresh()
  99. my_account.mns_client.close_connection();
  100. my_account = Account(endpoint, token.get_tmp_access_id(), token.get_tmp_access_key(), token.get_token())
  101. my_queue = my_account.get_queue(qname)
  102. # my_queue.set_encoding(False)
  103. recv_msg = my_queue.receive_message(wait_seconds)
  104. print "Receive Message Succeed! ReceiptHandle:%s MessageBody:%s MessageID:%s" % (
  105. recv_msg.receipt_handle, recv_msg.message_body, recv_msg.message_id)
  106. except MNSExceptionBase, e:
  107. if e.type == "QueueNotExist":
  108. print "Queue not exist, please create queue before receive message."
  109. sys.exit(0)
  110. elif e.type == "MessageNotExist":
  111. print "Queue is empty! sleep 10s"
  112. time.sleep(10)
  113. continue
  114. print "Receive Message Fail! Exception:%s\n" % e
  115. continue
  116. # 删除消息
  117. try:
  118. my_queue.delete_message(recv_msg.receipt_handle)
  119. print "Delete Message Succeed! ReceiptHandle:%s" % recv_msg.receipt_handle
  120. except MNSExceptionBase, e:
  121. print "Delete Message Fail! Exception:%s\n" % e
本文导读目录