汪总电商平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

432 lines
13 KiB

<?php
namespace app\api\controller\wanlshop;
use app\common\controller\Api;
use addons\wanlshop\library\WanlChat\WanlChat;
use addons\wanlshop\library\WanlPay\WanlPay;
use think\View;
use think\Log;
/**
* WanlShop 回调接口
*/
class Callback extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function _initialize()
{
parent::_initialize();
}
/**
* 接收快递100推送消息
*
* @ApiSummary (WanlShop 快递接口-接收快递100推送消息)
* @ApiMethod (POST)
*
* @param string $status 物流状态 polling:监控中,shutdown:结束,abort:中止,updateall:重新推送
* @param array $lastResult 最新物流动态
*/
public function kuaidi()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$kuaidi = model('app\api\model\wanlshop\KuaidiSub');
$post = $this->request->post();
// 接收消息
try {
$param = json_decode($post["param"], true);
$status = $param['status']; // 状态 polling:监控中,shutdown:结束,abort:中止,updateall:重新推送
$message = $param['lastResult']['message']; // 消息体
$state = $param['lastResult']['state']; // 快递单当前状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投
$ischeck = $param['lastResult']['ischeck']; // 是否签收标记
$nu = $param['lastResult']['nu']; // 快递单号
$com = $param['lastResult']['com']; // 快递公司编码
$data = $param['lastResult']['data']; // 数组,包含多个对象,每个对象字段如展开所示
// 查询快递是否存在
$express = $kuaidi->get(['express_no' => $nu]);
if($express){
// 判断来源
if($post["sign"] != strtoupper(md5($post["param"].$express['sign']))){
return json(["result" => false, "returnCode" => "405", "message" => "校验码错误"]);
}
// 更新数据
$express->message = $message;
$express->status = $status;
$express->state = $state;
$express->ischeck = $ischeck;
$express->com = $com;
$express->data = json_encode($data);
$express->save();
// 判断更新状态
if($express){
return json(["result" => true, "returnCode" => "200", "message" => "接收成功"]);
}
}else{
return json(["result" => false, "returnCode" => "404", "message" => "快递单号不存在"]);
}
} catch (Exception $e) {
return json(["result" => false, "returnCode" => "500", "message" => "服务器错误"]);
}
}
return json(["result" => false, "returnCode" => "500", "message" => "非正常访问"]);
}
/**
* 推流状态回调
*
* @ApiSummary (WanlShop 直播接口-推流状态回调)
* @ApiMethod (POST)
*
* @param string $action 回调状态 publish / publish_done
* @param string $ip 回调地址ip
* @param string $id 推流流名
* @param string $app 推流域名
* @param string $appname 推流app名
* @param string $time timestamp
* @param string $usrargs 用户参数
* @param string $node 内部节点ip
*/
public function push($id, $action)
{
$row = model('app\api\model\wanlshop\Live')->get(['liveid' => $id]);
$find = model('app\api\model\wanlshop\find\Find');
if($row){
if($action == 'publish'){
$this->sendLiveGroup($id, ['type' => 'publish']);
$row->save(['state' => 1]);
// 避免多次推流,检查是否存在多个
$count = $find->where('live_id', $row['id'])->count();
// 发布动态
if($count == 0){
// 关联商品
$goods = model('app\api\model\wanlshop\Goods')
->where('id', 'in', $row['goods_ids'])
->limit(2)
->select();
$image = [$row['image']];
foreach ($goods as $vo) {
$image[] = $vo['image'];
}
// 1.1.2升级
$shop = model('app\api\model\wanlshop\Shop')->get($row['shop_id']);
$user = model('app\api\model\wanlshop\find\User')->get([
'user_id' => $shop['user_id']
]);
// 保存数据
$find->save([
'shop_id' => $shop['id'],
'user_id' => $shop['user_id'], // 1.1.2升级
'user_no' => $user['user_no'], // 1.1.2升级
'type' => 'live',
'goods_ids' => $row['goods_ids'],
'live_id' => $row['id'],
'content' => $row['content'],
'images' => implode(',', $image)
]);
}
}else if($action == 'publish_done'){
$this->sendLiveGroup($id, ['type' => 'publish_done']);
$row->save(['state' => 2]);
}
}else{
$this->error(__('没有找到相关推流'));
}
}
/**
* 录制文件回调
*
* @ApiSummary (WanlShop 直播接口-录制文件回调)
* @ApiMethod (POST)
*
* @param string $domain 回调状态 publish / publish_done
* @param string $app 回调地址ip
* @param string $stream 推流流名
* ------------------------------------
* @param string $event record_started/record_paused/record_resumed
*-------------------------------------
* @param string $uri 推流域名
* @param string $duration 推流app名
* @param string $start_time timestamp
* @param string $stop_time 用户参数
*/
public function record()
{
if ($this->request->isPost()) {
$event = $this->request->post('event');
$stream = $this->request->post('stream');
$uri = $this->request->post('uri');
if($event == 'record_started'){
// 录制开始
}else if($event == 'record_paused'){
// 录制暂停
}else if($event == 'record_resumed'){
// 录制继续
}else{
// 录制成功
if($uri && $stream){
$config = get_addon_config('wanlshop');
$live = model('app\api\model\wanlshop\Live')
->where('liveid', $stream)
->find();
// 修改CND拼接域名 1.1.2升级
$live->save(['recordurl' => ($config['live']['sslSwitch'] == 'Y' ? 'https://' : 'http://') . $config['live']['liveCnd'] . '/' . $uri]);
// 修改发现状态 1.1.4升级
$find = model('app\api\model\wanlshop\find\Find')
->where('live_id', $live['id'])
->find();
if($find){
$find->save(['state' => 'normal']);
}
}else{
$this->error(__('录制失败'));
}
}
}
$this->error(__('非正常访问'));
}
//file:///C:/Users/WanlShop/Desktop/wanlshop-1.1.3/application/api/controller/wanlshop/Callback.php
/**
* 安全审核
*
* @ApiSummary (WanlShop 直播接口-安全审核)
* @ApiMethod (POST)
*
* @param string $DomainName 用户域名
* @param string $AppName App名
* @param string $StreamName 流名
* @param string $OssEndpoint 存储对象 Endpoint
* @param string $OssBucket 存储对象的 Bucket
* @param string $OssObject 存储对象的文件名
* @param array $Result 参数
*/
public function detectporn($StreamName, $Result)
{
$res = $Result[0]['Result'][0];
if($res['Suggestion'] == 'block'){ // 违规
$live = model('app\api\model\wanlshop\Live')->get(['liveid' => $StreamName]);
model('app\api\model\wanlshop\find\Find')->where(['live_id' => $live['id']])->delete();
$live->save(['gestion' => $res['Scene'], 'state' => 3]);
// 封禁直播间
$this->sendLiveGroup($StreamName, ['type' => 'ban']);
}else if($res['Suggestion'] == 'review'){ // 直播间存在违规
$this->sendLiveGroup($StreamName, [
'type' => 'review',
'text' => '直播间存在违规,请主播及时更正'
]);
}
}
/**
* 视频点播回调
*
* @ApiSummary (WanlShop 视频接口-视频点播回调)
* @ApiMethod (POST)
*
* https://help.aliyun.com/document_detail/55627.html
*/
public function vod()
{
if ($this->request->isPost()) {
$server = $this->request->server();
$params = $this->request->post();
$config = get_addon_config('wanlshop');
if($server['HTTP_X_VOD_SIGNATURE'] == md5($this->request->url(true).'|'.$server['HTTP_X_VOD_TIMESTAMP'].'|'.$config['video']['privateKey']) && $params['Status'] == 'success'){
$data = [];
$videoId = $params['EventType'] == 'AIMediaAuditComplete' ? $params['MediaId'] : $params['VideoId'];
// 创建视频
if($params['EventType'] == 'FileUploadComplete'){
$video = model('app\api\model\wanlshop\Video');
$video->video_id = $videoId;
$video->state = 'screenshot';
$video->save();
// 发现更新条件
$data['state'] = 'screenshot';
}else{
$videoData = model('app\api\model\wanlshop\Video')
->where('video_id', $videoId)
->find();
// 视频截图完成
if($params['EventType'] == 'SnapshotComplete'){
$videoData->save([
'cover_url' => $params['CoverUrl'], // 封面图片地址
'snapshots' => $params['Snapshots'], // 截图列表---
'state' => 'transcoding'
]);
// 发现更新条件
$data['images'] = implode(",", $params['Snapshots']);
$data['state'] = 'transcoding';
}
// 智能审核完成
if($params['EventType'] == 'AIMediaAuditComplete'){
$state = 'pass';
// 发现更新条件
$complete = json_decode($params['Data'], true);
if($complete['Suggestion'] == 'block'){
$state = 'hazard';
$data['state'] = $state;
}else{
$data['state'] = $state;
}
// 更新视频
$videoData->save([
'suggestion' => $complete['Suggestion'],
'state' => $state
]);
}
// 视频转码完成
if($params['EventType'] == 'TranscodeComplete'){
$stream = $params['StreamInfos'][0];
// 更新视频
$videoData->save([
'bitrate' => $stream['Bitrate'], // 视频流码率,单位:Kbps
'definition' => $stream['Definition'], // 视频流清晰度定义
'duration' => $stream['Duration'], // 视频流长度,单位:秒
'url' => $stream['FileUrl'], // 视频流的播放地址
'format' => $stream['Format'], // 视频流格式
'fps' => $stream['Fps'], // 视频流帧率,每秒多少帧
'height' => $stream['Height'], // 视频流高度,单位:px
'width' => $stream['Width'], // 视频流宽度,单位:px
'size' => $stream['Size'], // 视频流大小,单位:Byte
'fit' => $stream['Height'] > $stream['Width'] ? 'cover' : 'contain', // 视频的表现形式
'state' => 'normal'
]);
// 发现更新条件
$data['state'] = 'normal';
}
}
// 查询FIND是否已存在
$find = model('app\api\model\wanlshop\find\Find')
->where('video_id', $videoId)
->find();
// 更新状态
if($find){
if($find['state'] == 'examine'){
$data['state'] = 'examine';
}
$find->save($data);
}
$this->success();
}
}
$this->error(__('非正常访问'));
}
/**
* 支付成功回调
*
* @ApiSummary (WanlShop 支付接口-支付成功回调)
* @ApiMethod (POST)
*
*/
public function notify($type)
{
if(empty($type)){
$this->error(__('非正常访问'));
}
$wanlpay = new WanlPay($type);
$result = $wanlpay->notify();
if($result['code'] == 200){
return $result['msg'];
}else{
Log::write($result, 'debug');
}
}
/**
* 支付成功回调
*
* @ApiSummary (WanlShop 支付接口-支付成功回调)
* @ApiMethod (POST)
*
*/
public function notify_recharge($type)
{
if(empty($type)){
$this->error(__('非正常访问'));
}
$wanlpay = new WanlPay($type);
$result = $wanlpay->notify_recharge();
if($result['code'] == 200){
return $result['msg'];
}else{
Log::write($result, 'debug');
}
}
/**
* 退款回调 1.1.5升级
*
* @ApiSummary (WanlShop 支付接口-支付成功回调)
* @ApiMethod (POST)
*
*/
public function notify_refund($type)
{
if(empty($type)){
$this->error(__('非正常访问'));
}
$wanlpay = new WanlPay($type);
$result = $wanlpay->notify_refund();
if($result['code'] == 200){
return $result['msg'];
}else{
Log::write($result, 'debug');
}
}
/**
* 支付成功返回
*
* @ApiSummary (WanlShop 支付接口-支付成功返回)
* @ApiMethod (POST)
*
*/
public function return($type)
{
if(empty($type)){
$this->error(__('非正常访问'));
}
$view = new View();
$wanlpay = new WanlPay($type);
$config = get_addon_config('wanlshop');
$view->row = $wanlpay->return();
$view->config = $config['h5'];
return $view->fetch('index@wanlshop/page/success');
}
/**
* 发送直播群组消息
* 内部方法
*/
private function sendLiveGroup($group, $message)
{
$wanlchat = new WanlChat();
$wanlchat->sendGroup($group, [
'type' => 'live',
'group' => $group,
'form' => [
'id' => 0,
'nickname' => '系统'
],
'message' => $message,
'online' => 0,
'like' => 0
]);
}
}