467 lines
17 KiB
PHP
467 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
|
|
use App\Jobs\NotifyOrderJob;
|
|
use App\Models\Gateway;
|
|
use App\Models\GatewayWind;
|
|
use App\Models\Merchant;
|
|
use App\Models\MerchantCommission;
|
|
use App\Models\MerchantMoneyLog;
|
|
use App\Models\MerchantWallet;
|
|
use App\Models\Order;
|
|
use App\Models\OrderHandleLog;
|
|
use App\Models\PayForLog;
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Controllers\Controller;
|
|
use DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Ixudra\Curl\Facades\Curl;
|
|
use PayServices;
|
|
use App\Models\SystemCommission;
|
|
|
|
class OrderHandleApiController extends BaseController
|
|
{
|
|
|
|
|
|
public $input_status;
|
|
public $order_id;
|
|
public $orderObj;
|
|
public $userObj;
|
|
public $serverObj;
|
|
|
|
public function __construct(Request $request)
|
|
{
|
|
parent::__construct();
|
|
//通过之后再获取
|
|
$this->middleware(function ($request, $next) {
|
|
$this->input_status = $request->status;
|
|
$this->order_id = $request->order_id;
|
|
$this->orderObj = Order::find($this->order_id);
|
|
if ($this->orderObj->merchant_id != 0) {
|
|
$this->serverObj = $this->orderObj->merchants;
|
|
}
|
|
view()->share('order_id', $this->order_id);
|
|
view()->share('order', $this->orderObj);
|
|
return $next($request);
|
|
});
|
|
|
|
}
|
|
|
|
public function handle($order_id, $type, Request $request)
|
|
{
|
|
|
|
return $this->$type($request);
|
|
}
|
|
|
|
public function handlePost($order_id, $type, Request $request)
|
|
{
|
|
return $this->$type($request);
|
|
}
|
|
|
|
public function __call($method, $parameters)
|
|
{
|
|
|
|
return response()->json(['error' => 1, 'msg' => '该方法不存在']);
|
|
}
|
|
|
|
//更新支付订单
|
|
public function pay(Request $request)
|
|
{
|
|
$this->setViewPath('', 'pay');
|
|
$data = [
|
|
'pay_type' => config('adconfig.pay_type')
|
|
];
|
|
return $this->display($data);
|
|
}
|
|
|
|
public function payUpdate(Request $request)
|
|
{
|
|
//更新订单支付,支付类型,支付时间,支付状态,订单状态,写入更新操作日志
|
|
if ($request->input('pay_time') == '' || $request->input('pay_price') == '') {
|
|
return $this->msg(['error' => 1, 'msg' => '请填写必要参数']);
|
|
}
|
|
|
|
|
|
//更新订单
|
|
$order = $this->orderObj;
|
|
$order->pay_ok_at = $request->input('pay_time');//支付时间
|
|
$order->pay_money = $request->input('pay_price');//支付金额
|
|
$order->pay_type = $request->input('pay_type');
|
|
|
|
// $pay_rate=($request->input('pay_price')*$this->serverObj->ratio)/1000;
|
|
if($order->pay_status==1)
|
|
{
|
|
return $this->msg(['error' => 1, 'msg' => '已经支付']);
|
|
}
|
|
$order->pay_status = 1;
|
|
|
|
|
|
|
|
//最后金额计算,这里提交订单的时候就计算了,所以注释掉
|
|
// $order->total_money=$request->input('pay_price')-$pay_rate;
|
|
//$order->ratio=$this->serverObj->ratio;
|
|
//手续费
|
|
//$order->pay_rate=$pay_rate;
|
|
//原价
|
|
//本站也回调更新
|
|
$order->notify_status = 1;//
|
|
$order->status = 2;//订单状态:已支付,待回调
|
|
$r = $order->save();
|
|
|
|
|
|
if ($r) {
|
|
if ($order->merchant_id != 0) {
|
|
//后台确认支付的,需要判断是否有代理,如果有代理需要给佣金
|
|
|
|
//判断是否有股东佣金
|
|
|
|
if ($order->top_money != 0 || $order->next_ratio != 0) {
|
|
//如果有,再来判断订单的商户上级商户是否还有上级
|
|
$top_id = Merchant::find($this->serverObj->from_id);
|
|
//3级
|
|
if ($top_id->from_id != 0) {
|
|
//代理上面的股东
|
|
//给股东算佣金
|
|
$merchant_data = [
|
|
'merchant_id' => $order->merchant_id,
|
|
'from_merchant_id' => $top_id->from_id,
|
|
'gateway_id' => $order->gateway_id,
|
|
'order_id' => $order->id,
|
|
'order_sn' => $order->order_sn,
|
|
'order_money' => $order->order_money,
|
|
'pay_money' => $order->pay_money,
|
|
'money' => $order->top_money,
|
|
'ratio' => $order->top_ratio,//返点
|
|
'name' => $this->serverObj->name . '的订单佣金',
|
|
'order_at' => $order->order_at,
|
|
'pay_ok_at' => $order->pay_ok_at,
|
|
'status' => '2',//佣金状态,改为处理中,结算时是按后台结算
|
|
];
|
|
$this->merchantCommission($merchant_data, $top_id->from_id);//股东商户佣金写入
|
|
//推广上级佣金写入
|
|
$merchant_data = [
|
|
'merchant_id' => $order->merchant_id,
|
|
'from_merchant_id' => $this->serverObj->from_id,
|
|
'gateway_id' => $order->gateway_id,
|
|
'order_id' => $order->id,
|
|
'order_sn' => $order->order_sn,
|
|
'order_money' => $order->order_money,
|
|
'pay_money' => $order->pay_money,
|
|
'money' => $order->next_money,
|
|
'ratio' => $order->next_ratio,//返点
|
|
'name' => $this->serverObj->name . '的订单佣金',
|
|
'order_at' => $order->order_at,
|
|
'pay_ok_at' => $order->pay_ok_at,
|
|
'status' => '2',//佣金状态,改为处理中,结算时是按后台结算
|
|
];
|
|
$this->merchantCommission($merchant_data, $this->serverObj->from_id);//推广商户佣金写入
|
|
} else {
|
|
//推广上级佣金写入
|
|
$merchant_data = [
|
|
'merchant_id' => $order->merchant_id,
|
|
'from_merchant_id' => $this->serverObj->from_id,
|
|
'gateway_id' => $order->gateway_id,
|
|
'order_id' => $order->id,
|
|
'order_sn' => $order->order_sn,
|
|
'order_money' => $order->order_money,
|
|
'pay_money' => $order->pay_money,
|
|
'money' => $order->next_money,
|
|
'ratio' => $order->next_ratio,//返点
|
|
'name' => $this->serverObj->name . '的订单佣金',
|
|
'order_at' => $order->order_at,
|
|
'pay_ok_at' => $order->pay_ok_at,
|
|
'status' => '2',//佣金状态,改为处理中,结算时是按后台结算
|
|
];
|
|
$this->merchantCommission($merchant_data, $this->serverObj->from_id);//推广商户佣金写入
|
|
}
|
|
//2级的时候
|
|
}
|
|
|
|
$ysytem_pate = $order->system_ratio * $order->pay_money / 1000;
|
|
//写入平台佣金
|
|
$sys_data = [
|
|
'merchant_id' => $order->merchant_id,
|
|
'gateway_id' => $order->gateway_id,
|
|
'order_id' => $order->id,
|
|
'order_sn' => $order->order_sn,
|
|
'order_money' => $order->order_money,
|
|
'pay_money' => $order->pay_money,
|
|
'payfor_money' => $order->total_money,
|
|
'money' => $ysytem_pate,
|
|
'ratio' => $order->system_ratio,//系统佣金比率
|
|
'name' => $order->merchant_name . '的订单佣金',
|
|
'order_at' => $order->order_at,
|
|
'pay_ok_at' => $order->pay_ok_at,
|
|
'gateway_money' => $order->gateway_money,//通道扣除费用金额
|
|
'gateway_ratio' => $order->gateway_ratio,//通道扣点
|
|
'final_money' => $order->final_money,//最后盈利金额
|
|
'final_ratio' => $order->final_ratio,//最后盈利扣点
|
|
'status' => '1',
|
|
];
|
|
$this->debugLog('写入平台佣金:', $sys_data);
|
|
$this->systemCommission($sys_data);//平台佣金
|
|
|
|
//资金变动
|
|
$this->addMerchantMoneyLog($order->total_money, $order->pay_money);
|
|
|
|
}
|
|
//写入日志
|
|
$this->orderHandleLog(['from_status' => 0, 'to_status' => 2, 'name' => '完成订单支付操作'], $this->order_id);
|
|
//回调队列
|
|
//队列回调加入
|
|
NotifyOrderJob::dispatch($order,1)->onQueue('order_notify');
|
|
//风控
|
|
$gateway=Gateway::find($order->gateway_id);
|
|
$this->gategoryWind($gateway,$order->pay_money);
|
|
|
|
|
|
return $this->msg(['error' => 0, 'msg' => '操作成功']);
|
|
}
|
|
return $this->msg(['error' => 1, 'msg' => '操作失败']);
|
|
|
|
}
|
|
//支付风控写入
|
|
public function gategoryWind($gateway,$money)
|
|
{
|
|
$gateway_id=$gateway->id;
|
|
$gateway_name=$gateway->name.'('.$gateway->mch_id.')';
|
|
//风控
|
|
$obj = new GatewayWind();
|
|
$has = GatewayWind::where(['gateway_id' => $gateway_id, 'day' => date('Y-m-d')])->first();
|
|
|
|
if ($has) {
|
|
|
|
$now_money = $money + $has->amount_total;
|
|
$has->increment('amount_total', $money);//增加金额
|
|
|
|
//判断金额是否大于最大的限额,如果是,则更新通道并且关闭
|
|
if ($now_money >= $has->max_total) {
|
|
//更新通道为关闭,并且时系统设置
|
|
Gateway::where('id', $gateway_id)->update(['is_checked' => 0, 'is_system_close' => 1]);
|
|
write_gateway();//写入文件
|
|
}
|
|
|
|
} else {
|
|
|
|
$obj->day = date('Y-m-d');
|
|
$obj->gateway_name =$gateway_name;//通道
|
|
$obj->amount_total = $money;
|
|
$obj->gateway_id = $gateway_id;
|
|
$obj->save();
|
|
$this->debugLog('风控完成写入成功');
|
|
}
|
|
|
|
}
|
|
|
|
//推广商户佣金写入
|
|
public function merchantCommission($data, $mid)
|
|
{
|
|
|
|
return MerchantCommission::getOrCreate($data, ['order_id' => $this->orderObj->id, 'merchant_id' => $mid]);
|
|
}
|
|
|
|
//商户钱包写入
|
|
public function addMerchantWallet($trans_money, $money)
|
|
{
|
|
|
|
return MerchantWallet::addWallte($this->orderObj->merchant_id, $trans_money, $money);
|
|
}
|
|
|
|
//资金变动交易写入
|
|
public function addMerchantMoneyLog($money, $pay_money)
|
|
{
|
|
DB::beginTransaction();
|
|
$r = MerchantMoneyLog::addMoney($this->orderObj, $money);
|
|
if ($r) {
|
|
//插入钱包变动
|
|
$w_r=$this->addMerchantWallet($pay_money, $money);
|
|
if($w_r)
|
|
{
|
|
DB::commit();
|
|
}else{
|
|
DB::rollBack();
|
|
}
|
|
}else
|
|
{
|
|
DB::rollBack();
|
|
}
|
|
}
|
|
|
|
public function msg($arr)
|
|
{
|
|
return response()->json($arr);
|
|
}
|
|
|
|
//系统佣金写入
|
|
public function systemCommission($data)
|
|
{
|
|
return SystemCommission::getOrCreate($data, ['order_id' => $this->orderObj->id]);
|
|
}
|
|
|
|
|
|
public function notifyPost(Request $request)
|
|
{
|
|
//发送curl过去
|
|
$order_info = $this->orderObj->infos;
|
|
if ($order_info) {
|
|
$notify_url = $order_info->notify_url;//回调地址
|
|
//签名计算
|
|
$data = [
|
|
'app_id' => $this->serverObj->app_key,
|
|
'token' => $this->serverObj->token,
|
|
'money' => $this->orderObj->order_money,
|
|
'return_url' => $order_info->return_url,
|
|
'notify_url' => $order_info->notify_url,
|
|
'out_trade_sn' => $this->orderObj->out_trade_sn
|
|
];
|
|
//dump($data);
|
|
//回调携带参数回去
|
|
//返回付款金额,原来充值金额,本站订单号,支付流水号,原网站订单号,附加消息原样返回
|
|
$notify_data = [
|
|
'pay_money' => $this->orderObj->pay_money,
|
|
'money' => $this->orderObj->order_money,
|
|
'order_sn' => $this->orderObj->order_sn,
|
|
'out_trade_sn' => $this->orderObj->out_trade_sn,
|
|
'pay_order_sn' => $this->orderObj->pay_order_sn,
|
|
// 'sign' => PayServices::sign($data, 1),
|
|
'sign' => md5($this->serverObj->token . $order_info->sign . 'pay_money=' . $this->orderObj->pay_money . 'pay_status=' . $this->orderObj->pay_status),
|
|
'attch' => $order_info->attach,
|
|
'pay_status' => $this->orderObj->pay_status,
|
|
'return_url' => $order_info->return_url,
|
|
'notify_url' => $order_info->notify_url
|
|
];
|
|
//dd($notify_data);
|
|
Log::channel('pay_order')->info('总后台手动回调信息', $notify_data);
|
|
if (!$notify_url) {
|
|
return response(['error' => 1, 'msg' => '回调失败,缺少回调地址', 'back' => '']);
|
|
}
|
|
|
|
//发送curl
|
|
$r = Curl::to($notify_url)->withData($notify_data)->post();
|
|
//返回success表示回调成功
|
|
//dump(gettype($r));
|
|
|
|
if ($r == 'success') {
|
|
|
|
DB::beginTransaction();
|
|
//更新订单
|
|
$this->orderObj->out_notify_status = 1;
|
|
$this->orderObj->status = 1;
|
|
$or = $this->orderObj->save();
|
|
|
|
//
|
|
$order_info->notify_data = json_encode($notify_data);
|
|
$order_info->notify_status = $r;
|
|
$lr = $order_info->save();
|
|
if ($lr && $or) {
|
|
//写入日志
|
|
$this->orderHandleLog(['from_status' => 2, 'to_status' => 3, 'name' => '外站回调成功'], $this->order_id);
|
|
DB::commit();
|
|
return response(['error' => 0, 'msg' => '回调成功', 'back' => $r]);
|
|
}
|
|
DB::rollBack();
|
|
$this->orderHandleLog(['from_status' => 2, 'to_status' => 3, 'name' => '外站回调失败'], $this->order_id);
|
|
return response(['error' => 1, 'msg' => '对方回调成功,本站更新失败', 'back' => $r]);
|
|
} else {
|
|
|
|
return response(['error' => 1, 'msg' => '回调失败,外部没有返回success', 'back' => $r, 'sign_data' => $data, 'url' => $notify_url, 'notify_data' => $notify_data]);
|
|
}
|
|
|
|
}
|
|
return response(['error' => 1, 'msg' => '回调失败,缺少回调地址', 'back' => '']);
|
|
|
|
|
|
}
|
|
|
|
//结算该笔订单
|
|
public function payFor()
|
|
{
|
|
$this->setViewPath('', 'payfor');
|
|
$status = config('adconfig.payfor_status');
|
|
unset($status[0]);
|
|
$data = [
|
|
'status' => $status
|
|
];
|
|
return $this->display($data);
|
|
}
|
|
|
|
//结算提交
|
|
public function PayForUpdate(Request $request)
|
|
{
|
|
if ($request->input('pay_time') == '') {
|
|
return $this->msg(['error' => 1, 'msg' => '请填写必要参数']);
|
|
}
|
|
$status = $request->input('status');
|
|
DB::beginTransaction();
|
|
//更新订单
|
|
$order = $this->orderObj;
|
|
$order->success_status = $status;//结算状态
|
|
$order->success_at = $request->input('pay_time');//结算时间
|
|
$order->status = 1;
|
|
|
|
$r = $order->save();
|
|
//如果结算为失败则不添加到结算日志里面
|
|
|
|
//写入结算日志
|
|
$pay_for_data = [
|
|
'status' => $status,
|
|
'order_sn' => $order->order_sn,
|
|
'money' => $order->total_money,
|
|
'mark' => $request->input('mark'),
|
|
'success_at' => $request->input('pay_time'),
|
|
'out_trade_sn' => $order->out_trade_sn
|
|
];
|
|
$log_r = $this->payForLog($pay_for_data);
|
|
if ($log_r && $r) {
|
|
DB::commit();
|
|
$this->orderHandleLog(['from_status' => 3, 'to_status' => 1, 'name' => '结算操作'], $this->order_id);
|
|
return response(['error' => 0, 'msg' => '结算操作成功', 'back' => '']);
|
|
}
|
|
DB::rollBack();
|
|
return response(['error' => 1, 'msg' => '结算操作失败', 'back' => '']);
|
|
|
|
}
|
|
|
|
//结算日志
|
|
public function payForLog($config)
|
|
{
|
|
$log = new PayForLog();
|
|
$log->order_id = $this->order_id;
|
|
|
|
foreach ($config as $k => $v) {
|
|
$log->$k = $v;
|
|
}
|
|
$log->admin_id = admin('id');
|
|
$log->admin_name = admin('account');
|
|
$r = $log->save();
|
|
if ($r) {
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
//订单操作日志
|
|
public function orderHandleLog($config)
|
|
{
|
|
$log = new OrderHandleLog();
|
|
foreach ($config as $k => $v) {
|
|
$log->$k = $v;
|
|
}
|
|
$log->order_id = $this->order_id;
|
|
$log->handle_user_id = admin('id');//
|
|
$log->handle_user_name = admin('account');//
|
|
$log->handle_user_type = 'admin';//
|
|
$r = $log->save();
|
|
$this->insertLog('操作订单,行为是' . $config['name']);
|
|
if ($r) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
}
|