• 沒有找到結果。

4.1 语音回呼代码样例

4.1.5 C#

话单通知@see: 详细内容以接口文档为准

@param param: jsonBody

@return:

'''def onFeeEvent(jsonBody):

jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型

if ('fee' != eventType):

print('EventType error: ' + eventType) return

if ('feeLst' not in jsonObj):

print('param error: no feeLst.');

return

feeLst = jsonObj['feeLst']

#Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理

#短时间内有多个通话结束时语音通话平台会将话单合并推送,每条消息最多携带50个话单 if (len(feeLst) > 1):

for loop in feeLst:

if ('sessionId' in loop):

print('sessionId: ' + loop['sessionId']) elif(len(feeLst) == 1):

if ('sessionId' in feeLst[0]):

print('sessionId: ' + feeLst[0]['sessionId']) else:

print('feeLst error: no element.');

if __name__ == '__main__':

onFeeEvent(jsonBody) #话单处理

4.1.4 PHP

环境要求 PHP 7.0及以上版本。

引用库

-下载链接 点击下载

须知

● 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从 国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。

● 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。

● 本文档信息仅供参考,不构成任何要约或承诺。

4.1.5 C#

环境要求 .NET Core 2.0及以上版本或.NET Framework 4.7.1及以上版 本。

引用库 Newtonsoft.Json 11.0.2,请参考https://

www.newtonsoft.com/json获取。

须知

● 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从 国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。

● 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。

● 本文档信息仅供参考,不构成任何要约或承诺。

“语音回呼场景 API”代码样例

using Newtonsoft.Json;

using System;

using System.Collections.Generic;

using System.Collections.Specialized;

using System.IO;

using System.Net;

using System.Net.Http;

using System.Net.Http.Headers;

using System.Security.Cryptography;

using System.Text;

namespace voicecall_csharp_demo_x_wsse_

{ class VoiceCall {

string base_url = "https://{domain}:{port}"; //APP接入地址,购买服务时下发,请替换为实际值 string appKey = "***appKey***"; //语音回呼应用的appKey,购买服务时下发,请替换为实际值 string appSecret = "***appSecret***"; //语音回呼应用的appSecret,购买服务时下发,请替换为实际值 static void Main(string[] args)

{

//主叫号码,被叫号码请替换为实际号码.固话号码从控制台号码管理页获取

voiceCallAPI("+86531*******4", "+86135*******1", "+86531*******4", "+86135*******2");

}

static void voiceCallAPI(string displayNbr, string callerNbr, string displayCalleeNbr, string calleeNbr) {

if (String.IsNullOrEmpty(displayNbr) || String.IsNullOrEmpty(callerNbr) ||

String.IsNullOrEmpty(displayCalleeNbr) || String.IsNullOrEmpty(calleeNbr)) {

return;

}

string apiURI = "/rest/httpsessions/click2Call/v2.0"; //接口URI string requestUrl = base_url + apiURI;

try {

//为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 //.NET Framework 4.7.1及以上版本,请采用如下代码

var sslHandler = new HttpClientHandler() {

ServerCertificateCustomValidationCallback = (message, cert, chain, err) => { return true; } };

HttpClient client = new HttpClient(sslHandler, true);

//低于.NET Framework 4.7.1版本,请采用如下代码 //HttpClient client = new HttpClient();

//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);

//请求Headers

client.DefaultRequestHeaders.Add("Authorization", "WSSE realm=\"SDP\",profile=

\"UsernameToken\",type=\"Appkey\"");

client.DefaultRequestHeaders.Add("X-WSSE", buildWSSEHeader(appKey, appSecret));

//请求Body

HttpContent content = new StringContent(JsonConvert.SerializeObject(body));

//请求Headers中的Content-Type参数

content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

var response = client.PostAsync(requestUrl, content).Result;

static string buildWSSEHeader(string appKey, string appSecret) {

string now = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); //Created string nonce = Guid.NewGuid().ToString().Replace("-", ""); //Nonce

byte[] material = Encoding.UTF8.GetBytes(nonce + now + appSecret);

byte[] hashed = SHA256Managed.Create().ComputeHash(material);

string hexdigest = BitConverter.ToString(hashed).Replace("-", "");

string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(hexdigest)); //PasswordDigest return String.Format("UsernameToken Username=\"{0}\",PasswordDigest=\"{1}\",Nonce=

\"{2}\",Created=\"{3}\"",

appKey, base64, nonce, now);

}

//低于.NET Framework 4.7.1版本,启用如下方法

//static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)

//{

// return true;

//}

} }

“获取录音文件下载地址 API”代码样例

using System;

using System.Collections.Specialized;

using System.IO;

using System.Net;

using System.Net.Http;

using System.Security.Cryptography;

using System.Text;

namespace voicecall_csharp_demo_x_wsse_

{ class GetRecordLink {

string base_url = "https://{domain}:{port}"; //APP接入地址,购买服务时下发,请替换为实际值 static void Main(string[] args)

{

//语音回呼或号显回呼应用的appKey和appSecret,购买服务时下发,请替换为实际值 string wsse = buildWSSEHeader("***appKey***", "***appSecret***");

//录音文件名和录音存储服务器域名,从话单通知中获取

string location = getRecordLinkAPI("1200_366_0_20161228102743.wav", "ostor.huawei.com", wsse);

//打印录音文件下载地址

Console.WriteLine($"The record file download link is: {location}");

}

static string getRecordLinkAPI(string fileName, string recordDomain, string xwsse) {

if (String.IsNullOrEmpty(fileName) || String.IsNullOrEmpty(recordDomain) ||

String.IsNullOrEmpty(xwsse)) {

return;

}

var location;

string apiURI = "/rest/provision/voice/record/v1.0"; //接口URI var keyValues = new NameValueCollection();

keyValues.Add("fileName", fileName);

keyValues.Add("recordDomain", recordDomain);

string requestUrl = base_url + apiURI + "?" + buildQueryString(keyValues);

try {

//为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 //.NET Framework 4.7.1及以上版本,请采用如下代码

var sslHandler = new HttpClientHandler() {

ServerCertificateCustomValidationCallback = (message, cert, chain, err) => { return true; } };

sslHandler.AllowAutoRedirect = false; //关闭重定向 HttpClient client = new HttpClient(sslHandler, true);

//低于.NET Framework 4.7.1版本,请采用如下代码 //var sslHandler = new HttpClientHandler();

//sslHandler.AllowAutoRedirect = false;

//HttpClient client = new HttpClient(sslHandler);

//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);

//请求Headers

client.DefaultRequestHeaders.Add("Authorization", "WSSE realm=\"SDP\",profile=

\"UsernameToken\",type=\"Appkey\"");

client.DefaultRequestHeaders.Add("X-WSSE", xwsse);

var response = client.GetAsync(requestUrl).Result; //GET请求

static string buildWSSEHeader(string appKey, string appSecret) {

string now = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); //Created string nonce = Guid.NewGuid().ToString().Replace("-", ""); //Nonce

byte[] material = Encoding.UTF8.GetBytes(nonce + now + appSecret);

byte[] hashed = SHA256Managed.Create().ComputeHash(material);

string hexdigest = BitConverter.ToString(hashed).Replace("-", "");

string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(hexdigest)); //PasswordDigest return String.Format("UsernameToken Username=\"{0}\",PasswordDigest=\"{1}\",Nonce=

\"{2}\",Created=\"{3}\"",

appKey, base64, nonce, now);

}

static string buildQueryString(NameValueCollection keyValues) {

//static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)

//呼叫事件通知样例

string jsonBody = JsonConvert.SerializeObject(new Dictionary<string, object>(){

{"eventType", "callout"},

{"statusInfo", new Dictionary<string, object>(){

{"sessionId", "[email protected]"}, {"timestamp", "2019-01-24 03:04:24"},

/// <param name="jsonBody"></param>

static void OnCallEvent(string jsonBody) {

JObject jsonObj = (JObject)JsonConvert.DeserializeObject(jsonBody); //将通知消息解析为jsonObj string eventType = jsonObj["eventType"].ToString(); //通知事件类型

* 'called': 被叫号码

“话单通知 API”代码样例

string jsonBody = JsonConvert.SerializeObject(new Dictionary<string, object>(){

{"eventType", "fee"},

/// <param name="jsonBody"></param>

static void OnFeeEvent(string jsonBody) {

JObject jsonObj = (JObject)JsonConvert.DeserializeObject(jsonBody); //将通知消息解析为jsonObj string eventType = jsonObj["eventType"].ToString(); //通知事件类型

if (!"fee".Equals(eventType)) {

Console.WriteLine("EventType error:" + eventType);

return;

}

if (!jsonObj.ContainsKey("feeLst")) {

Console.WriteLine("param error: no feeLst.");

return;

}

JObject[] feeLst = jsonObj["feeLst"].ToObject<JObject[]>(); //呼叫话单事件信息 //Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理

//短时间内有多个通话结束时语音通话平台会将话单合并推送,每条消息最多携带50个话单 if (feeLst.Length > 1)

{

foreach (JObject loop in feeLst) {

if (loop.ContainsKey("sessionId")) {

Console.WriteLine("sessionId:" + loop["sessionId"]);

} } }

else if (feeLst.Length == 1) {

if (feeLst[0].ContainsKey("sessionId")) {

Console.WriteLine("sessionId:" + feeLst[0]["sessionId"]);

} } else {

Console.WriteLine("feeLst error: no element.");

} } } }

相關文件