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.");
} } } }