业务方要求是客户支付成功要在后台进行语言播报,比如收款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;
}
}
}
用的是阿里云语音合成功能。
具体逻辑根据自己的业务需求去屑