AlibabaDyvmsapi.php 6.3 KB
<?php

namespace app\common\library;

use AlibabaCloud\SDK\Dyvmsapi\V20170525\Dyvmsapi;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dyvmsapi\V20170525\Models\SingleCallByTtsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\SDK\Dyvmsapi\V20170525\Models\SingleCallByVoiceRequest;


/**
 * 阿里云语音服务
 * Class AlibabaDyvmsapi
 * @package app\common\library
 */
class AlibabaDyvmsapi
{
    public $accessKeyId = null;
    public $accessKeySecret = null;
    public function __construct()
    {
        $this->accessKeyId = config('site.call_accessKeyId');
        $this->accessKeySecret = config('site.call_accessKeySecret');
    }

    /**
     * 使用AK&SK初始化账号Client
     * @param string $accessKeyId
     * @param string $accessKeySecret
     * @return Dyvmsapi Client
     */
    public static function createClient($accessKeyId, $accessKeySecret){
        $config = new Config([
            // 必填,您的 AccessKey ID
            "accessKeyId" => $accessKeyId,
            // 必填,您的 AccessKey Secret
            "accessKeySecret" => $accessKeySecret
        ]);
        // Endpoint 请参考 https://api.aliyun.com/product/Dyvmsapi
        $config->endpoint = "dyvmsapi.aliyuncs.com";
        return new Dyvmsapi($config);
    }

    /**
     * 语音验证码
     * @param array $params
     * @return array|boolean
     */
    public function singleCallByTts($params){
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
        $client = self::createClient($this->accessKeyId, $this->accessKeySecret);
//        $params = [
//            "calledNumber" => "1590****000",//接收语音通知的手机号码
//            "ttsCode" => "TTS_100****",//已通过审核的语音通知文本转语音模板或语音验证码模板的模板 ID。
//            "calledShowNumber" => "0571****5678",//被叫显号。
//            "ttsParam" => "{\"AckNum\":\"123456\"}",//模板中的变量参数,JSON 格式。
//            "playTimes" => 3,//一通电话内语音通知内容的播放次数。取值范围:1~3,默认取值 3。
//            "volume" => 100,//语音通知的播放音量。取值范围:0~100,默认取值 100。
//            "speed" => 5,//语速控制。取值范围为:-500~500。
//            "outId" => "225869*****"//发起请求时预留给调用方的自定义 ID,最终会通过在回执消息中将此 ID 带回给调用方。字符串类型,长度为 1~15 个字节。
//        ];
        $singleCallByTtsRequest = new SingleCallByTtsRequest($params);
        $runtime = new RuntimeOptions([]);
        try {
            // 复制代码运行请自行打印 API 的返回值
            $response = $client->singleCallByTtsWithOptions($singleCallByTtsRequest, $runtime);
            return $response->body->toMap();
        }
        catch (Exception $error) {
            if (!($error instanceof TeaError)) {
                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
            }
            // 错误 message
//            var_dump($error->message);
            // 诊断地址
//            var_dump($error->data["Recommend"]);
            $logFile = RUNTIME_PATH . 'log/语音验证码异常日志-' . date('Y-m-d') . '.txt';
            file_put_contents($logFile , var_export($error->message, true) . PHP_EOL, FILE_APPEND);
//            Utils::assertAsString($error->message);
            return false;
        }
    }

    /**
     * 语音通知
     * @param array $params
     * @return array|boolean
     */
    public function SingleCallByVoice($params){
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
        $client = self::createClient($this->accessKeyId, $this->accessKeySecret);
//        $params = [
//            "calledNumber" => "1590****000",//接收语音通知的手机号码
//            "voiceCode" => "2d4c-4e78-8d2a-afbb06cf****.wav",语音通知文件的语音 ID。
//            "calledShowNumber" => "0571****5678",//被叫显号。
//            "playTimes" => 3,//一通电话内语音通知内容的播放次数。取值范围:1~3,默认取值 3。
//            "volume" => 100,//语音通知的播放音量。取值范围:0~100,默认取值 100。
//            "speed" => 5,//语速控制。取值范围为:-500~500。
//            "outId" => "22596****"//发起请求时预留给调用方的自定义 ID,最终会通过在回执消息中将此 ID 带回给调用方。字符串类型,长度为 1~15 个字节。
//        ];
        $singleCallByVoiceRequest = new SingleCallByVoiceRequest($params);
        $runtime = new RuntimeOptions([]);
        try {
            // 复制代码运行请自行打印 API 的返回值
            $response = $client->singleCallByVoiceWithOptions($singleCallByVoiceRequest, $runtime);
            return $response->body->toMap();
        }
        catch (Exception $error) {
            if (!($error instanceof TeaError)) {
                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
            }
            // 错误 message
//            var_dump($error->message);
            // 诊断地址
//            var_dump($error->data["Recommend"]);
            $logFile = RUNTIME_PATH . 'log/语音通知常日志-' . date('Y-m-d') . '.txt';
            file_put_contents($logFile , var_export($error->message, true) . PHP_EOL, FILE_APPEND);
//            Utils::assertAsString($error->message);
            return false;
        }
    }
}