php 后台实现订单支付成功后语音提示

本文介绍了如何使用Ajax轮询技术配合阿里云语音合成功能,实现在后台当客户支付成功时进行语言播报。通过定时请求获取订单状态,触发语音合成并播放提示消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务方要求是客户支付成功要在后台进行语言播报,比如收款100元,请注意查收

 

ajax轮询的方法比较简单,就是每过多少秒发起一次请求。如果项目中的订单不多,每隔多少秒发一次请求会对服务器有挺大的压力。我将轮询关键的代码贴出来,仅供参考。

<script src="__STATIC__/admin/static/js/jquery.min.js"></script>
<script type="text/javascript">
    function timeout() {
       
        $.ajax({
            url:'{:url("/admin/speech/getOrderStatus")} ',
            type:'get',
            datatype:'text',
            async:false,
            success:function (data) {
                if(data==400){
                    console.log('语音合成错误,请联系管理员')
                }else if(data==300){
                    console.log('订单未支付')
                }else{
                    playSound(data); 
                }
            }
        });
    }
    // var i=timeout();

    function hello() {
        // playSound();return false;
        $.ajax({
            url:'{:url("/admin/speech/getOrder")}',
            type:'get',
            datatype:'text',
            async:false,
            success:function (result) {
                // console.log(result)
                if(result==200){
                    setInterval("timeout()",30000);
                }
            }
        });
    }
    setInterval("hello()",10000);
    window.onbeforeunload = function (e) {
        var message = 'some word';
        e = e || window.event;

        if (e) {
            e.returnValue = message;
        }
        clearInterval()
        };
</script>
 <!--支付成功声音提示-->
<script>
    var playSound = function (msgfile="/uploads/speech/20201210114028995250.mp3") {
        // console.log(msgfile)
            var borswer = window.navigator.userAgent.toLowerCase();
            if ( borswer.indexOf( "ie" ) >= 0 )
            {
                //IE内核浏览器
                var strEmbed = '<embed name="embedPlay" src="'+msgfile+'" autostart="true" hidden="true" loop="false"></embed>';
                if ( $( "body" ).find( "embed" ).length <= 0 )
                    $( "body" ).append( strEmbed );
                var embed = document.embedPlay;

                //浏览器不支持 audion,则使用 embed 播放
                embed.volume = 100;
                //embed.play();这个不需要
            } else
            {
                //非IE内核浏览器
                var strAudio = "<audio id='audioPlay' src='"+msgfile+"' hidden='true'>";

                if($("#audioPlay").length<=0){
                    $( "body" ).append( strAudio );
                }

                var audio = document.getElementById( "audioPlay" );

                //浏览器支持 audio
                audio.play();
            }
        }
</script>

上面是核心代码。后台代码如下:

<?php
namespace app\admin\controller;

use app\admin\controller\Base;
use think\Loader;
use think\Request;
use think\Session;
//语音播报功能1607477459
class Speech extends Base
{   
    //查询待支付订单
    public function getOrder(){
        
        $where['store_id']=594;
        $where['orders_status']=0;
        // $where['out_trade_no']='9581315822';
        $result=db('orders')->field('out_trade_no,orders_id')->where($where)->whereTime('orders_create_time', 'today')->order('orders_id desc')->fetchSql(false)->find();
       
        if(!empty($result)){
            $data['orders_id']=$result['orders_id'];
            $isordersId=db('message')->where('orders_id',$result['orders_id'])->find();
            if(empty($isordersId)){
                $ret=db('message')->insert($data);
                if($ret) return 200;
            }
            return 400;
        }else{
            return 400;
        }
    }
    public function getOrderStatus(){
     
        $messaage=db('message')->order('id asc')->find();
        $result=db('orders')->field('out_trade_no,amount,orders_status')->where('orders_id',$messaage['orders_id'])->find();
        if(!empty($result)){
    
            if($result['orders_status']==2){
                db('message')->delete($messaage['id']);
                $text='收款'.$result['amount'].'元';
                $appkey = "DfIHS534534534re";
                $token = "3f39f8b99fsdfsdfsdfd5ef12c";
                // $text = get('content');
                // $text =iconv("utf-8","gbk//IGNORE",$text );
                // $text = mb_convert_encoding($text ,"UTF-8","GBK");
                $textUrlEncode = urlencode($text);
                $textUrlEncode = preg_replace('/\+/', '%20', $textUrlEncode);
                $textUrlEncode = preg_replace('/\*/', '%2A', $textUrlEncode);
                $textUrlEncode = preg_replace('/%7E/', '~', $textUrlEncode);
                $audioSaveFile = $this->getOrderNum().".mp3";
                $format = "mp3";
                $sampleRate = 16000;
                $code=$this-> processGETRequest($appkey, $token, $textUrlEncode, $audioSaveFile, $format, $sampleRate);
                 return $code;
            }else{
                return 310;
            }
        }else{
            return 300;
        }
        
    }
  
    private function getOrderNum($length = 6, $tab = '')
    {
     
        $dt = date('YmdHis');
     
        $str = $dt . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, $length);
     
        return $str . $tab;
     
    }
    public function processGETRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate) {
        
        $url = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts";
        $url = $url . "?appkey=" . $appkey;
        $url = $url . "&token=" . $token;
        $url = $url . "&text=" . $text;
        $url = $url . "&format=" . $format;
        $url = $url . "&sample_rate=" . strval($sampleRate);
        // voice 发音人,可选,默认是xiaoyun。
        // $url = $url . "&voice=" . "xiaoyun";
        // volume 音量,范围是0~100,可选,默认50。
        // $url = $url . "&volume=" . strval(50);
        // speech_rate 语速,范围是-500~500,可选,默认是0。
        // $url = $url . "&speech_rate=" . strval(0);
        // pitch_rate 语调,范围是-500~500,可选,默认是0。
        // $url = $url . "&pitch_rate=" . strval(0);
        // print $url . "\n";
     
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        /**
         * 设置HTTPS GET URL。
         */
        curl_setopt($curl, CURLOPT_URL, $url);
        /**
         * 设置返回的响应包含HTTPS头部信息。
         */
        curl_setopt($curl, CURLOPT_HEADER, TRUE);
        /**
         * 发送HTTPS GET请求。
         */
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        $response = curl_exec($curl);
        if ($response == FALSE) {
            return 500;
            // print "curl_exec failed!\n";
            curl_close($curl);
            return ;
        }
      
        /**
         * 处理服务端返回的响应。
         */
        $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $headers = substr($response, 0, $headerSize);
        $bodyContent = substr($response, $headerSize);
        $file= "/uploads/speech/".$audioSaveFile;
        curl_close($curl);
       
        if (stripos($headers, "Content-Type: audio/mpeg") != FALSE || stripos($headers, "Content-Type:audio/mpeg") != FALSE) {
     
            file_put_contents("./uploads/speech/".$audioSaveFile, $bodyContent);
            $data[]=['url'=>$file];
            return $file;
          // response($data);
        }
        else {
           
           return 400;
        }
    }
}

用的是阿里云语音合成功能。

具体逻辑根据自己的业务需求去屑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值