======隐号通话对接—流程图====== {{:隐号通话:隐私通话流程图2.png|}} ======开发者账号====== 注册或者登录开发者账号流程说明请参考[[..login_singup|登录注册>>]] ======创建应用及申请上线====== 创建应用及申请上线流程说明请参考[[..creatnewapp|创建应用及申请上线>>]] =======资质认证====== 申请上线应用之前需完成资质认证,具体认证流程请参考[[..account_authentication|账号认证>>]] ======上传隐号通话铃声(可选)====== ===1.上传隐号通话铃声—语音库管理=== 点击【开发者控制台> 隐号通话产品管理】选择语音库管理模块,点击“添加语音”按钮。 {{:隐号通话:隐号通话.png|}} ===2.上传隐号通话铃声—上传铃声=== 选择要上传的语音文件,点击上传,完成,等待后台审核。 {{:隐号通话:上传语音.png|}} ======接口对接======

注意: 为了确保数据隐私和安全, REST API须通过HTTPS方式请求(查询子账号信息接口除外)

**URL格式** \\ https://api.ucpaas.com/{version}/Accounts/{accountSid}/{function}/{operation}?sig={SigParameter} **URL参数属性说明** \\ ^属性 ^ ^说明 ^ |version | |云之讯REST API版本号,当前版本号为:2014-06-30 | |Accounts | |此参数为默认固定值 | |accountSid | |注册云之讯官网,在控制台中即可获取此参数 | |function | |业务功能 | |operation | |业务操作,业务功能的各类具体操作分支 | |SigParameter | |请求URL必须带有此参数 | **HTTP标准包头字段(必填)** \\ ^属性 ^ ^说明 ^ |Accept | |客户端响应接收数据格式:application/json | |Content-Type | |类型:application/json;charset=utf-8 | |Authorization | |验证信息 | | Content-Length | |包体长度 | **关键点** SigParameter是REST API 验证参数 URL后必须带有sig参数,sig= MD5(账户Id + 账户授权令牌 + 时间戳),共32位(注:转成大写) 使用MD5加密(账户Id + 账户授权令牌 + 时间戳),共32位 时间戳是当前系统时间(24小时制),格式“yyyyMMddHHmmss”。时间戳有效时间为50分钟。 Authorization是包头验证信息 使用Base64编码(账户Id + 冒号 + 时间戳) 冒号为英文冒号 时间戳是当前系统时间(24小时制),格式“yyyyMMddHHmmss”,需与SigParameter中时间戳相同 ===1.隐号通话接口对接—双向绑定号码同步接口=== **双向绑定号码同步请求路径**\\ https://api.ucpaas.com/{version}/Accounts/{accountSid}/safetyCalls/applyNumber?sig={SigParameter} **请求参数说明** \\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |创建应用时系统分配的唯一标示,在“应用列表”中可以查询。 | |caller | |必选 |主叫号码(必须为11位手机号,号码前加0086,如008613631686024) | |callee | |必选 |规则同caller | |callerRingName | |可选 |主叫呼入时播放IVR语音文件名 | |calleeRingName | |可选 |被叫呼入时播放IVR语音文件名 | |dstVirtualNum | |必选 |分配的直呼虚拟中间保护号码 规则为0086+区号首位0+号码 | |bindId | |必选 |绑定id,客户方平台保证唯一 | |maxAge | |必选 |主被叫+虚拟保护号码允许合作方最大cache存储时间(单位秒) | |cityId | |必选 |城市id | |requestId | |可选 |字符串最大长度不超过128字节,该requestId在后面话单和录音URL推送中原样带回 | |record | |可选 |是否录音,0表示不录音,1表示录音。默认为不录音 | |maxAllowTime | |可选 |允许最大通话时间单位分钟,不填默认为10分钟 | |statusUrl | |可选 |状态回调通知地址,正式环境可以配置默认推送地址 | |hangupUrl | |可选 |话单推送地址,不填推到默认协商地址 | |recordUrl | |可选 |录单URL回调通知地址,不填推到默认协商地址 | **响应参数说明** \\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |创建应用时系统分配的唯一标示,在“应用列表”中可以查询。 | |caller | |必选 |主叫号码 | |callee | |必选 |被叫号码 | |dstVirtualNum | |必选 |用户指定分配的直呼虚拟中间保护号码 规则为0086+区号首位0+号码 | |bindId | |必选 |分配唯一针对中间号码与主被叫号码的绑定Id | **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], accept-encoding=[gzip,deflate], connection=[Keep-Alive], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1], Authorization:ZTAzYmM5MTA2YzZlZDBlYWViZmNlOGMzNjhmZGNkNDg6MjAxNDA2MjMxODQ1MjM= **包体**\\ { "hangupUrl": "", "caller": "008618612341234", "appId": "7df01234567841ed816564bb12345678", "callerRingName": "1124", "bindId": “7df0123456ipoopujk7841ed816564bb12345678”, "requestId": "sel-define follow your heart and rules", "calleeDisplayNum": "00861054890813", “maxAge”: “600”, “record”: “0”, “maxAllowTime”: “10”, “dstVirtualNum”: “00861054890813”, “calleeRingName”: “1142”, “statusUrl”: “”, “callee”: “008613611133396”, “recordUrl”: “” “cityId”:”008610” } **正确响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[163], Date=[Wed, 15 Jun 2016 09:13:58 GMT]} Payload: {"caller":"18612341234","appId":"7df01234567841ed816564bb12345678","bindId":"7df0123456ipoopujk7841ed816564bb12345678","dstVirtualNum":"0086201000123","callee":"13611133396"} **错误响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[22], Date=[Wed, 15 Jun 2016 09:21:54 GMT]} Payload: {"errorCode":"102102"} ===2.隐号通话接口对接—双向绑定号码申请接口=== **双向绑定号码申请路径**\\ https://api.ucpaas.com/{version}/Accounts/{accountSid}/safetyCalls/allocNumber?sig={SigParameter} **请求参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |创建应用时系统分配的唯一标示,在“应用列表”中可以查询。 | |caller | |必选 |主叫号码(必须为11位手机号,号码前加0086,如008613631686024) | |callee | |必选 |规则同caller | |callerRingName | |可选 |主叫呼入时播放IVR语音文件名 | |calleeRingName | |可选 |被叫呼入时播放IVR语音文件名 | |maxAge | |必选 |主被叫+虚拟保护号码允许合作方最大cache存储时间(单位秒) | |cityId | |必选 |城市id | |requestId | |可选 |字符串最大长度不超过128字节,该requestId在后面话单和录音URL推送中原样带回 | |record | |可选 |是否录音,0表示不录音,1表示录音。默认为不录音 | |maxAllowTime | |可选 |允许最大通话时间单位分钟,不填默认为10分钟 | |statusUrl | |可选 |状态回调通知地址,正式环境可以配置默认推送地址 | |hangupUrl | |可选 |话单推送地址,不填推到默认协商地址 | |recordUrl | |可选 |录单URL回调通知地址,不填推到默认协商地址 | **响应参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |创建应用时系统分配的唯一标示,在“应用列表”中可以查询。 | |caller | |必选 |主叫号码(必须为11位手机号,号码前加0086,如008613631686024) | |callee | |必选 |规则同caller | |dstVirtualNum | |必选 |分配的直呼虚拟中间保护号码 | |bindId | |必选 |分配唯一针对中间号码与主被叫号码的唯一绑定Id | **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], accept-encoding=[gzip,deflate], connection=[Keep-Alive], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1], Authorization:ZTAzYmM5MTA2YzZlZDBlYWViZmNlOGMzNjhmZGNkNDg6MjAxNDA2MjMxODQ1MjM= **包体**\\ { “hangupUrl”: “”, “caller”: “18612341234”, “appId”: “7df01234567841ed816564bb12345678”, “callerRingName”: “1124”, “requestId”: “111111”, “calleeDisplayNum”: “00862068714329”, “maxAge”: “600”, “record”: “0”, “maxAllowTime”: “10”, “calleeRingName”: “1142”, “statusUrl”: “”, “callee”: “008613611133396”, “recordUrl”: “” “cityId”:”008620” } **正确响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[163], Date=[Wed, 15 Jun 2016 09:13:58 GMT]} Payload: {"caller":"18612341234","appId":"7df01234567841ed816564bb12345678","bindId":"7df0123456784ikyui1ed816564bb12345678","dstVirtualNum":"0086201000123","callee":"13611133396"} **错误响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[22], Date=[Wed, 15 Jun 2016 09:21:54 GMT]} Payload: {"errorCode":"102102"} ===3.隐号通话接口对接—双向绑定关系解除接口=== **删除双方号码绑定关系路径**\\ https://api.ucpaas.com/{version}/Accounts/{accountSid}/safetyCalls/freeNumber?sig={SigParameter} **请求参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |创建应用时系统分配的唯一标示,在“应用列表”中可以查询。 | |bindId | |必选 |双方号码+中间号绑定ID,该ID全局唯一 | |cityId | |必选 |城市Id格式为 0086+去零区号 | **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], accept-encoding=[gzip,deflate], connection=[Keep-Alive], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1], Authorization:ZTAzYmM5MTA2YzZlZDBlYWViZmNlOGMzNjhmZGNkNDg6MjAxNDA2MjMxODQ1MjM= **包体**\\ { “appId”: “1234b71f7c274b0782173a04509b1234”, "bindId": “7df0123456784ikyui1ed816564bb12345678”, "cityId": "008620", } **正确响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[22], Date=[Wed, 15 Jun 2016 09:28:39 GMT]} Payload: {"errorCode":"000000"} **错误响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[22], Date=[Wed, 15 Jun 2016 09:24:15 GMT]} Payload: {"errorCode":"104127"} ===4.隐号通话接口对接—实时绑定并发数查询接口=== **获取城市并发数路径**\\ https://api.ucpaas.com/{version}/Accounts/{accountSid}/safetyCalls/getConcurrent?sig={SigParameter} **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], accept-encoding=[gzip,deflate], connection=[Keep-Alive], Content-Length=[2], content-type=[application/json;charset=UTF-8], Authorization:ZTAzYmM5MTA2YzZlZDBlYWViZmNlOGMzNjhmZGNkNDg6MjAxNDA2MjMxODQ1MjM= **包体**\\ {"appId":"125489wslfjlsjfklsjfljdslfjkf756962eaefa0",” cityId”:”0086755”} **正确响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[39], Date=[Wed, 15 Jun 2016 09:33:16 GMT]} Payload: {"total":"0","008610":"0","008620":"0"} **错误响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[22], Date=[Wed, 15 Jun 2016 09:35:22 GMT]} Payload: {"errorCode":"100007"} ===5.隐号通话接口对接—通话状态回调接口=== **通话状态回调路径**\\ 可通过接口传参给定URL地址或者采用配置默认URL **请求参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |平台分配 | |callId | |必选 |点击通话请求响应中返回的callId | |requestId | |必选 |点击通话请求时请求携带的requestId,原样返回 | |caller | |必选 |主叫号码 | |dstVirtualNum | |必选 |主叫通讯录直拨虚拟保护号码 | |callee | |必选 |被叫号码 | |userFlag | |必选 |该路通话中用于区分状态属于主叫/被叫 caller:主叫 callee:被叫,非绑定关系中的主被 | |callStatus | |必选 |invite:发起呼叫 ringing:响铃 answered:接听 refused:拒绝 disconnected:正常挂机 failed:呼叫异常 | |errorCode | |可选 |sip响应码 | |timeStamp | |必选 |状态发生的unix时间戳 | |bindId | |必选 |分配唯一针对中间号码与主被叫号码的绑定Id | |calleeDisplayNum | |可选 |本次呼叫中被叫所显示号码 | **响应参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |retcode | |必选 |返回错误码,0:成功 非0:失败 | |reason | |必选 |原因描述 | **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1]} **包体**\\ { "appId":"123456", "callId":"fc84cc206c2d6b86af5fe9f37d4b13c3", "requestId":"888F1ZXNzc3QyMjg5EIKABBjzjue5BSIkNTY4ODM4MzctN", "caller":"008618503073759", "dstVirtualNum":"008675566616484", "callee":"008613828772876", "userFlag":"caller", "callStatus":"invite", "errorCode":0, "timeStamp":"1470620220", "bindId":"9999137-4ea5-43b7-9b49-5d4b95225144-5d4b95225166", "calleeDisplayNum":"008613828772876", } **响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[163], Date=[Wed, 15 Jun 2016 09:13:58 GMT]} Payload: {"retcode":0,"reason":"OK“} ===6.隐号通话接口对接—话单回调接口=== **话单回调请求地址** 可通过接口传参给定URL地址或者采用配置默认URL **请求参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |应用唯一标识 | |callId | |必选 |通话唯一标识Id | |requestId | |必选 |接口传入唯一Id | |caller | |必选 |主叫号码 | |callee | |必选 |主叫通讯录直拨虚拟保护号码 | |dstVirtualNum | |必选 |虚拟保护号码即中间号码 | |callCenterAcceptTime | |必选 |虚拟保护号码平台收到呼叫时间 | |startDstCallTime | |必选 |被叫呼叫开始时间 | |startDstRingTime | |可选 |被叫响铃开始时间 | |dstAcceptTime | |必选 |被叫接听时间 | |endCallTime | |必选 |用户挂机通话结束时间 | |callEndStatus | |必选 |通话最后状态 | | | | |0:未知状态 | | | | |1:正常通话 | | | | |2:查询呼叫转移被叫号异常 | | | | |3:呼叫转移被叫未接通 | | | | |4:呼叫转移被叫未接听 | |callerDuration | |必选 |主叫接通虚拟保护号码到通话结束通话时间 | |calleeDuration | |必选 |呼叫转接被叫接通收到200ok到通话结束通话时间 | |bindId | |必选 |绑定id,客户方平台保证唯一 | |calleeDisplayNum | |可选 |本次呼叫中被叫所显示号码 | **响应参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |retcode | |必选 |返回错误码,0:成功 非0:失败 | |reason | |必选 |原因描述 | **请求包体**\\ Encoding: UTF-8 Http-Method: POST **包头**\\ Headers: {Accept=[application/json], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1]} **包体**\\ { "appId":"123456", "callId":"fc84cc206c2d6b86af5fe9f37d4b13c3", "requestId":"888F1ZXNzc3QyMjg5EIKABBjzjue5BSIkNTY4ODM4MzctN", "caller":"008618503073759", "callee":"008613828772876", "dstVirtualNum":"008675566616484", "callCenterAcceptTime":"1470620220", "startDstCallTime":"1470620220", "startDstRingTime":"1470620220", "dstAcceptTime":"1470620220", "endCallTime":"1470620222", "callerDuration":"2", "calleeDuration":"2", "callEndStatus":"1", "bindId":"9999137-4ea5-43b7-9b49-5d4b95225144-5d4b95225166", "calleeDisplayNum":"008613828772876" } **响应包体**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[163], Date=[Wed, 15 Jun 2016 09:13:58 GMT]} Payload: {"retcode":0,"reason":"OK"} ===7.隐号通话接口对接—录音回调接口=== **录音回调请求地址** \\ 可通过接口传参给定URL地址或者采用配置默认URL **请求参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |appId | |必选 |应用唯一标识 | |callId | |必选 |通话唯一标识Id | |requestId | |必选 |接口传入唯一Id | |caller | |必选 |主叫号码 | |callee | |必选 |被叫号码 | |dstVirtualNum | |必选 |虚拟保护号码即中间号码 | |recordUrl | |必选 |录音下载URL | |bindId | |必选 |绑定Id, 客户方平台保证唯一 | |calleeDisplayNum | |可选 |本次呼叫中被叫所显示号码 | **响应参数说明**\\ ^参数名 ^ ^要求 ^备注 ^ |retcode | |必选 |返回错误码,0:成功 非0:失败 | |reason | |必选 |原因描述 | **请求包体:**\\ Encoding: UTF-8 Http-Method: POST **包头:**\\ Headers: {Accept=[application/json], Content-Length=[316], content-type=[application/json;charset=UTF-8], host=[127.0.0.1]} { "appId":"123456", "callId":"fc84cc206c2d6b86af5fe9f37d4b13c3", "requestId":"888F1ZXNzc3QyMjg5EIKABBjzjue5BSIkNTY4ODM4MzctN", "caller":"008618503073759", "callee":"008613828772876", "dstVirtualNum":"008675566616484", "recordUrl":"http://voiceproxy.oss-cn-beijing.aliyuncs.com/qq.proxy/20160808/7df0153d055841ed816564bb66aca62c_fc84cc206c2d6b86af5fe9f37d4b13c3_20160808.mp3", "bindId":"9999137-4ea5-43b7-9b49-5d4b95225144-5d4b95225166", "calleeDisplayNum":"008613828772876" } **响应包体:**\\ Response-Code: 200 Content-Type: application/json;charset=utf-8 Headers: {Content-Type=[application/json;charset=utf-8], Content-Length=[163], Date=[Wed, 15 Jun 2016 09:13:58 GMT]} Payload: {"retcode":0,"reason":"OK"} ===8.附录—常用链接=== **Demo下载连接**\\ 官网提供java php c# phthon 等语音demo,第三方开发者提供了golang、nodejs等语音的demo 可以参考调用,[[..开发实例|下载地址请点击>>]] ===9.官网接口文档=== **[[..rest_api介绍及接入|接口简介和统一请求包头>>]]**\\ **[[..client管理api|申请client接口文档>>]]**\\ **[[..呼叫鉴权请求接口|呼叫鉴权回调文档>>]]**\\ **[[..呼叫建立通知接口|呼叫接通回调文档>>]]**\\ **[[..呼叫挂机计费接口|呼叫结束回调文档>>]]**\\ ======附录—常见问题====== **[[..rest_error|接口错误码说明]]** http://docs.ucpaas.com/doku.php?id=rest_error **调用接口返回100699 系统内部错误** a.查看接口参数sig是否拼写正确 sig= md5(账户Id + 账户授权令牌 + 时间戳)共32位, md5加密后转大写 b.查看接口参数Authorization是否拼写正确 Authorization=base64(账户Id +冒号+ 时间戳) 时间戳是当前系统时间(24小时制) yyyyMMddHHmmss **调用接口返回100005 访问ip不合法** 创建应用时,基础配置中的服务器白名单清空下,如果配置了服务器白名单调用接口必须在白名单上调用,否则就会报此错。