Files
ProxyPanel/app/Http/Controllers/Gateway/AbstractPayment.php
兔姬桑 077d41480d 重构支付系统 + 代码优化
0. 重置支付系统,
1. 添加 码支付
2. 添加 PayJs
3. 代码优化
2020-08-05 03:20:31 +08:00

177 lines
5.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers\Gateway;
use App\Components\Helpers;
use App\Http\Models\Goods;
use App\Http\Models\GoodsLabel;
use App\Http\Models\Order;
use App\Http\Models\Payment;
use App\Http\Models\ReferralLog;
use App\Http\Models\User;
use App\Http\Models\UserLabel;
use Illuminate\Http\Request;
use Log;
abstract class AbstractPayment
{
protected static $systemConfig;
function __construct()
{
self::$systemConfig = Helpers::systemConfig();
}
public static function generateGuid()
{
mt_srand((double)microtime()*10000);
$charid = strtoupper(md5(uniqid(mt_rand()+time(), TRUE)));
$hyphen = chr(45);
$uuid = chr(123)
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid, 12, 4).$hyphen
.substr($charid, 16, 4).$hyphen
.substr($charid, 20, 12)
.chr(125);
$uuid = str_replace(['}', '{', '-'], '', $uuid);
$uuid = substr($uuid, 0, 8);
return $uuid;
}
abstract public function purchase(Request $request);
abstract public function notify(Request $request);
abstract public function getReturnHTML(Request $request);
abstract public function getPurchaseHTML();
public function postPayment($sn, $method)
{
// 获取需要的信息
$payment = Payment::where('sn', $sn)->first();
$order = Order::find($payment->oid);
$goods = Goods::find($order->goods_id);
$user = User::find($order->user_id);
// 商品为流量或者套餐
switch($goods->type){
case 1:
$order->status = 2;
$order->save();
User::query()->where('id', $order->user_id)->increment('transfer_enable', $goods->traffic*1048576);
Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable, $user->transfer_enable+$goods->traffic*1048576, '[在线支付]加上用户购买的套餐流量');
break;
case 2:
$activePlan = Order::query()
->where('user_id', $user->id)
->where('is_expire', 0)
->where('status', 2)
->with(['goods'])
->whereHas('goods', function($q){
$q->where('type', 2);
})
->exists();
// 2为开始生效3为预支付
$order->status = $activePlan? 3 : 2;
$order->save();
if($activePlan){
// 预支付订单, 刷新账号有效时间用于流量重置判断
User::query()->where('id', $order->user_id)->update(['expire_time' => date('Y-m-d', strtotime("+".$goods->days." days", strtotime($user->expire_time)))]);
}else{
// 如果买的是套餐则先将之前购买的套餐都无效化重置用户已用、可用流量为0
Order::query()
->where('user_id', $user->id)
->with(['goods'])
->whereHas('goods', function($q){
$q->where('type', '<=', 2);
})
->where('is_expire', 0)
->where('status', 2)
->where('oid', '<>', $order->oid)
->update(['expire_at' => date('Y-m-d H:i:s'), 'is_expire' => 1]);
User::query()->where('id', $order->user_id)->update(['u' => 0, 'd' => 0, 'transfer_enable' => 0]);
Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable, 0, '[在线支付]用户购买新套餐,先清空流量');
$userTraffic = $goods->traffic*1048576;
// 添加账号有效期
$expireTime = date('Y-m-d', strtotime("+".$goods->days." days"));
//账号下一个重置时间
$nextResetTime = date('Y-m-d', strtotime("+".$goods->period." days"));
if($nextResetTime >= $expireTime){
$nextResetTime = NULL;
}
// 写入用户标签
if($goods->label){
// 删除用户所有标签
UserLabel::query()->where('user_id', $order->user_id)->delete();
//取出 商品默认标签 & 系统默认标签 去重
$newUserLabels = array_values(array_unique(array_merge(GoodsLabel::query()->where('goods_id', $order->goods_id)->pluck('label_id')->toArray(), self::$systemConfig['initial_labels_for_user']? explode(',', self::$systemConfig['initial_labels_for_user']) : [])));
// 生成标签
foreach($newUserLabels as $Label){
$obj = new UserLabel();
$obj->user_id = $order->user_id;
$obj->label_id = $Label;
$obj->save();
}
}
User::query()->where('id', $order->user_id)->increment('invite_num', $goods->invite_num? : 0, ['transfer_enable' => $userTraffic, 'reset_time' => $nextResetTime, 'expire_time' => $expireTime, 'enable' => 1]);
Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable, $userTraffic, '[在线支付]加上用户购买的套餐流量');
}
// 是否返利
if(self::$systemConfig['referral_type'] && $order->user->referral_uid){
//获取历史返利记录
$referral = ReferralLog::where('user_id', $order->user_id)->get();
// 无记录 / 首次返利
if(!$referral && self::$systemConfig['is_invite_register']){
// 邀请注册功能开启时,返还邀请者邀请名额
User::query()->where('id', $order->user->referral_uid)->increment('invite_num', 1);
}
//按照返利模式进行返利判断
if(self::$systemConfig['referral_type'] == 2 || (self::$systemConfig['referral_type'] == 1 && !$referral)){
$this->addReferralLog($order->user_id, $order->user->referral_uid, $order->oid, $order->amount, $order->amount*self::$systemConfig['referral_percent']);
}
}
break;
default:
Log::info('【处理订单】出现错误-未知套餐类型');
}
return 0;
}
/**
* 添加返利日志
*
* @param int $userId 用户ID
* @param int $refUserId 返利用户ID
* @param int $oid 订单ID
* @param int $amount 发生金额
* @param int $refAmount 返利金额
*
* @return int
*/
private function addReferralLog($userId, $refUserId, $oid, $amount, $refAmount)
{
$log = new ReferralLog();
$log->user_id = $userId;
$log->ref_user_id = $refUserId;
$log->order_id = $oid;
$log->amount = $amount;
$log->ref_amount = $refAmount;
$log->status = 0;
return $log->save();
}
}