最近因为有客户需要接入语音服务(在线打电话),综合了市面上的产品,最后还是选择了阿里云的语音服务。阿里云的业务比较广泛,说实话找官网的SDK文档确实很浪费时间,其实接入并不复杂,但是官网的SDK示例并不是完全的契合asp.net core还是需要自己改造代码的,但是在改造代码的时候我因为是直接通过NuGet 安装的AlibabaCloud.SDK.DyvmsApi20170525,改造好的代码一直提示:MissingMethodException: Method not found: 'Void Aliyun.Credentials.Client..ctor(Aliyun.Credentials.Models.Config)'. 搞的我一直以为是自己的代码有问题,白白浪费了好几天。所以我这里还是推荐大家通过官网的SDK给出的dotnet add package AlibabaCloud.SDK.Dyvmsapi20170525 --version 3.2.2命令来安装。正确安装完成后的截图如下
安装好了阿里云的SDK然后在Program.cs注册/配置一下IvrCall 的单例服务。代码如下
// 注册IVR客户端 builder.Services.AddSingLeton<Client>(sp => { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378671.html。 Aliyun.Credentials.Client credential = new Aliyun.Credentials.Client( new Aliyun.Credentials.Models.Config() { Type = "access_key", AccessKeyId = "AccessKeyId ", AccessKeySecret = "AccessKeyId " } ); AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config { Credential = credential, }; // Endpoint 请参考 https://api.aliyun.com/product/Dyvmsapi config.Endpoint = "dyvmsapi.aliyuncs.com"; return new AlibabaCloud.SDK.Dyvmsapi20170525.Client(config); });
我这里使用的是明文写入AccessKeyId,您也可以根据实际情况按照选择更安全的方式。
然后我们开始正式编写发送代码了,您也可以通过IvrCall_云通信语音服务_API调试-阿里云OpenAPI开发者门户调试好发送代码的各项参数。我写的函数如下
public class HomeController(Client ivrClient) : Controller { private readonly Client _ivrClient = ivrClient; /// <summary> /// 发起IVR呼叫 /// </summary> /// <param name="request">IVR呼叫参数 https://next.api.aliyun.com/api/Dyvmsapi/2017-05-25/IvrCall?RegionId=cn-hangzhou</param> /// <returns>呼叫结果</returns> [HttpPost] [HttpGet] [Route("/Call/")] public Async Task<IActionResult> Call(IvrCallRequest request) { AlibabaCloud.SDK.Dyvmsapi20170525.Client client = _ivrClient; AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap menuKeyMap0 = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap { Key = "1", Code = "TTS_xxxx", }; AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap menuKeyMap1 = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap { Key = "0", Code = "TTS_xxxx", }; AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest ivrCallRequest = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest { CalledShowNumber = "05715xxx172", CalledNumber = "1906xxxx955", StartCode = "TTS_xxx", StartTtsParams = "{\"address\":\"资溪县\",\"times\":\"2012年12月30日\",\"hour\":\"3\"}", OutId = "fdf", MenuKeyMap = new List<AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap> { menuKeyMap0, menuKeyMap1 }, }; AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions(); try { // 复制代码运行请自行打印 API 的返回值 Var response = Await client.IvrCallWithOptionsAsync(ivrCallRequest, runtime); return Ok(new { Success = true, response.Body.RequestId, response.Body.Code, response.Body.Message }); } catch (TeaException error) { // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message Console.WriteLine(error.Message); // 诊断地址 Console.WriteLine(error.Data["Recommend"]); AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); return Ok(new { error.Message }); } catch (Exception _error) { TeaException error = new TeaException(new Dictionary<string, object> { { "message", _error.Message } }); // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 // 错误 message Console.WriteLine(error.Message); // 诊断地址 Console.WriteLine(error.Data["Recommend"]); AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); return Ok(new { _error.Message }); } } }
打开测试,电话拨打成功。我着唯一的坑就是安装sdk的时候,可能是选错sdk或则什么原因,一直报错,最后还是把所有的sdk删除,然后通过命令行的方式安装了sdk才正常,具体原因也不清楚。