Commit 75115354 by yink

2025-04-27更新分账逻辑备份

parent 53940f55
<?php
namespace App\Http\Controllers\Api;
use App\Command\Log;
use App\Models\Carousel;
use App\Models\User;
......@@ -7,6 +9,10 @@
use App\Models\OrderDivideRecord;
use Illuminate\Http\Request;
use NwVVVS\AdapayCore\AdaPay\Payment;
use Illuminate\Support\Facades\DB;
use App\Models\Adapay;
use App\Models\OrderInfo;
class OrderDivideRecordController extends BaseController
{
......@@ -45,15 +51,15 @@ public function manualDivide(Request $request)
{
$payment_confirm = new \NwVVVS\AdapaySdk\PaymentConfirm(); //支付确认
$member_id = $request->member_id ?? 0;//汇付会员id
$user_id = $request->user_id ?? 0;//用户
$amount = $request->amount;//分账金额·
$payment_id = $request->payment_id ;//支付记录表中的payment_id,每笔支付订单可以分账多次
if (!$amount||!$payment_id||!$user_id) {
$member_id = $request->member_id ?? 0; //汇付会员id
$user_id = $request->user_id ?? 0; //用户
$amount = $request->amount; //分账金额·
$payment_id = $request->payment_id; //支付记录表中的payment_id,每笔支付订单可以分账多次
if (!$amount || !$payment_id || !$user_id) {
return $this->JsonResponse('', '参数 amount、payment_id 不能为空', 201);
}
//参数介绍member_id:汇付会员id,amount:分账金额,fee_flag:是否内扣手续费
$div_members = ['member_id' => $member_id, 'amount' => sprintf("%.2f", $amount), 'fee_flag' => 'Y'];
$confirm_amt = sprintf("%.2f", $amount); // 确保金额格式化为两位小数
......@@ -64,7 +70,7 @@ public function manualDivide(Request $request)
"order_no" => 'payconfirm_' . date("YmdHis") . rand(100000, 999999),
"confirm_amt" => $confirm_amt, // 使用格式化后的金额
"description" => "",
"div_members" => $div_members,
"div_members" => $div_members,
);
// $payment_params['div_members'] = $div_members;
// $payment_params['confirm_amt'] = $confirm_amt;
......@@ -73,13 +79,13 @@ public function manualDivide(Request $request)
# 发起支付确认创建
$payment_confirm->create($payment_params);
# 对支付确认创建结果进行处理
$logData = [
'request_params' => $payment_params,
'response' => $payment_confirm->result
];
if ($payment_confirm->isError()) {
//失败处理
Log::addByName('manualDivide手动分账', json_encode($logData, JSON_UNESCAPED_UNICODE));
......@@ -88,12 +94,12 @@ public function manualDivide(Request $request)
//成功处理
$result = $payment_confirm->result;
Log::addByName('manualDivide手动分账', json_encode($logData, JSON_UNESCAPED_UNICODE));
if ($result['status'] == 'succeeded') {
//写入支付确认信息
$hfResult = (new HfPayconfirm())->add($payment_params, $result['fee_amt']);
$logData['hf_result'] = $hfResult;
//新增分佣记录
OrderDivideRecord::addRecord(
og_id: '', // og_id (这里没有商品ID信息,可以传空字符串)
......@@ -107,7 +113,7 @@ public function manualDivide(Request $request)
isExistAccount: 1, // isExistAccount (假设已实名)
payconfirm_no: $payment_params['order_no'] // payconfirm_no (使用生成的订单号)
);
return $this->JsonResponse($logData);
} else {
return $this->JsonResponse($logData, '支付确认处理中', 202);
......@@ -115,4 +121,38 @@ public function manualDivide(Request $request)
}
return $this->JsonResponse([]);
}
//后面改成消息队列,先单线程运行,快速开发
//轮训更新订单冻结状态,将冻结完成的订单进行分账
public function updateOrderStatusToDiv(Request $request)
{
//查询完成冻结的订单,分账
$orderList = DB::getList('SELECT id,order_sn,user_id,order_amount,start_freeze_time
FROM li_order_info
WHERE deleted_at IS NULL
AND pay_status = 1
AND is_div = 0
AND start_freeze_time is not null
AND start_freeze_time < NOW() - INTERVAL 6 DAY
AND order_status IN (3, 4);
');
if ($orderList) {
foreach ($orderList as $kk => $order) {
$orderObj = OrderInfo::find($order->id);
//分账
if (Adapay::handlePaymentConfirmAndDivide($orderObj->order_no, $orderObj->id)) {
$orderObj->is_div = 1;
$orderObj->save();
} else {
//分账失败,记录日志
Log::addByName('updateOrderStatusToDiv分账失败', json_encode($order, JSON_UNESCAPED_UNICODE));
}
}
}
return $this->JsonResponse([]);
}
}
......@@ -62,10 +62,10 @@ public function pay($order_title, $order_sn, $order_amount, $openid)
}
}
//支付回调-分账
//支付回调-分账--》改成冻结,6天后解冻分账
public function payNotify($params = [])
{
$payment_confirm = new \NwVVVS\AdapaySdk\PaymentConfirm(); //支付确认
$adapay_tools = new \NwVVVS\AdapaySdk\AdapayTools(); //验证签名
$post_data = json_decode($params['data'], 1);
$post_data_str = json_encode($post_data, JSON_UNESCAPED_UNICODE);
......@@ -136,10 +136,10 @@ public function payNotify($params = [])
//支付记录
// 创建新的PaymentRecord对象
$pay_cord = new PaymentRecord();
// 查询是否已存在相同order_sn的支付记录
$cordLog = $pay_cord->where(['order_sn' => $message['order_no']])->first();
// 如果不存在记录,则创建新记录
if (!$cordLog) {
// 设置支付记录的各项属性
......@@ -149,7 +149,7 @@ public function payNotify($params = [])
$pay_cord->party_order_id = $message['party_order_id']; // 合作方订单ID
$pay_cord->money = $message['real_amt']; // 实际支付金额
$pay_cord->uid = $orderObj->user_id; // 用户ID
// 保存支付记录到数据库
$pay_cord->save();
}
......@@ -167,51 +167,11 @@ public function payNotify($params = [])
return false;
}
$orderObj->freeze_stat = 'UNFREEZE';
$orderObj->start_freeze_time = date('Y-m-d H:i:s');
$orderObj->save();
//交易记录
$prObj = PaymentRecord::where('order_sn', $order_no)->first();
# 支付确认参数设置
$payment_params = array(
"payment_id" => $prObj->payment_id,
"order_no" => 'payconfirm_' . date("YmdHis") . rand(100000, 999999),
"confirm_amt" => $prObj->money,
"description" => "",
"div_members" => "" //分账参数列表 默认是数组List
);
DB::beginTransaction();
try {
//分账列表
$divResult = OrderDivideRecord::divide($orderObj->id, $payment_params['order_no']); //返回分账参数列表
$payment_params['div_members'] = $divResult['div_members'];
$payment_params['confirm_amt'] = $divResult['confirm_amt'];
Log::add('发起分账支付确认-向汇付' . $order_no, $payment_params);
# 发起支付确认创建
$payment_confirm->create($payment_params);
# 对支付确认创建结果进行处理
if ($payment_confirm->isError()) {
//失败处理
Log::add('支付确认失败', $payment_confirm->result);
$result = $payment_confirm->result;
throw new Exception($result['error_msg']);
} else {
//成功处理
Log::add('支付确认成功', $payment_confirm->result);
$result = $payment_confirm->result;
if ($result['status'] == 'succeeded') {
Log::add('分账成功', ['order_sn' => $order_no]);
//写入支付确认信息
(new HfPayconfirm())->add($payment_params, $result['fee_amt']);
}
}
DB::commit();
} catch (\Exception $e) {
Log::add('支付确认对象失败', $e->getMessage());
DB::rollBack();
return false;
}
// 调用汇付接口分账-6天后在解冻分账
//$this->handlePaymentConfirmAndDivide($order_no, $orderObj, $payment_confirm);
}
return true;
}
......@@ -455,4 +415,106 @@ public function queryBalance($account_params)
/**
* 处理支付确认和分账逻辑
* @param string $order_no 订单号
* @param OrderInfo $orderObj 订单对象
* @param \NwVVVS\AdapaySdk\PaymentConfirm $payment_confirm 支付确认对象
* @return bool 处理结果
* @throws Exception 处理失败时抛出异常
*/
public static function handlePaymentConfirmAndDivide($order_no, $order_id)
{
$payment_confirm = new \NwVVVS\AdapaySdk\PaymentConfirm(); //支付确认
//交易记录
$prObj = PaymentRecord::where('order_sn', $order_no)->first();
# 支付确认参数设置
$payment_params = array(
"payment_id" => $prObj->payment_id,
"order_no" => 'payconfirm_' . date("YmdHis") . rand(100000, 999999),
"confirm_amt" => $prObj->money,
"description" => "",
"div_members" => "" //分账参数列表 默认是数组List
);
DB::beginTransaction();
try {
//分账列表
$divResult = OrderDivideRecord::divide($order_id, $payment_params['order_no']); //返回分账参数列表
$payment_params['div_members'] = $divResult['div_members'];
$payment_params['confirm_amt'] = $divResult['confirm_amt'];
Log::add('发起分账支付确认-向汇付' . $order_no, $payment_params);
# 发起支付确认创建
$payment_confirm->create($payment_params);
# 对支付确认创建结果进行处理
if ($payment_confirm->isError()) {
//失败处理
Log::add('支付确认失败', $payment_confirm->result);
$result = $payment_confirm->result;
throw new Exception($result['error_msg']);
} else {
//成功处理
Log::add('支付确认成功', $payment_confirm->result);
$result = $payment_confirm->result;
if ($result['status'] == 'succeeded') {
Log::add('分账成功', ['order_sn' => $order_no]);
//写入支付确认信息
(new HfPayconfirm())->add($payment_params, $result['fee_amt']);
}
}
DB::commit();
return true;
} catch (\Exception $e) {
Log::add('支付确认对象失败', $e->getMessage());
DB::rollBack();
return false;
}
}
}
<?php
<?php
namespace App\Models;
use App\Command\Log;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
class OrderDivideRecord extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'order_divide_record';
public const COMMISSION_TYPE = [
1 => '直推佣金',//需求调整,不在分账,改成积分,支付时抵扣
2 => '间推佣金',//需求调整,不在分账,改成积分,支付时抵扣
3 => '用户取货佣金',
4 => '手动调账分账',
];
/**
* 收益分配
* order_id 订单ID
* payconfirm_no 发起确认支付,订单流水号
*/
public static function divide($order_id, $payconfirm_no = '')
{
$div_members = []; //汇付 分账对象
$orderObj = OrderInfo::find($order_id);
$merchant_id = $orderObj->merchant_id; //绑定的商户
$buyer_id = $orderObj->user_id; //下单用户ID
$userObj = User::find($buyer_id);
$spuid = $userObj->spuid; //直推分享人
$second_spuid = $userObj->second_spuid; //间推分享人
$total_amount = 0; //订单商品总价
$first_proportion = $second_proportion = $merchant_proportion = ''; //佣金比例
$sp_ogid = ''; //参与分佣商品ID
$commissionPreData = [
'first_member_id' => '',
'first_amount' => 0,
'second_member_id' => '',
'second_amount' => 0,
'merchant_member_id' => '',
'merchant_amount' => 0,
];
//直推是否实名
$isFirstRealName = 0;
if ($spuid) {
$isFirstRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $spuid])->count();
}
//间推是否实名
$isSecondRealName = 0;
if ($second_spuid) {
$isSecondRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $second_spuid])->count();
}
//商户是否实名
$isMerchantRealName = 0;
if ($merchant_id) {
$hfCompanyMObj = HfCompanyMember::where('merchant_id', $merchant_id)->first();
$isMerchantRealName = ($hfCompanyMObj->status == 'succeeded') ? 1 : 0;
}
$ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品
foreach ($ogList as $kk => $item) {
$goods_amount = $item->goods_price * $item->goods_number;
$total_amount += $goods_amount;
//商品信息
$goodObj = Good::find($item->goods_id);
$merchant_commission = $goodObj->merchant_commission;
$first_commission = $goodObj->first_commission;
$second_commission = $goodObj->second_commission;
$first_proportion .= $goodObj->first_commission . ",";
$second_proportion .= $goodObj->second_commission . ",";
$merchant_proportion .= $goodObj->merchant_commission . ",";
$sp_ogid = $item->id . ",";
//直推佣金
if ($spuid && $first_commission >= 1 && $first_commission < 100) {
$divide_price = number_format($goods_amount * ($first_commission / 100), 2);
$spObj = User::find($spuid);
//汇付参数
if ($spObj->member_id) {
$spObj->total_revenue += $divide_price; //总余额记录
$spObj->save();
//self::addRecord($item->id, $order_id, $goods_amount, $divide_price, $first_commission, $spuid, $user_id, 1, $isExistAccount);
$commissionPreData['first_member_id'] = $spObj->member_id;
$commissionPreData['first_amount'] += $divide_price;
}
}
//间推佣金
if ($second_spuid && $second_commission >= 1 && $second_commission < 100) {
$divide_price = number_format($goods_amount * ($second_commission / 100), 2);
$spObj = User::find($second_spuid);
//汇付参数
if ($spObj->member_id) {
$spObj->total_revenue += $divide_price;
$spObj->save();
$commissionPreData['second_member_id'] = $spObj->member_id;
$commissionPreData['second_amount'] += $divide_price;
}
}
//商户分佣记录
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) {
$divide_price = number_format($goods_amount * ($merchant_commission / 100), 2);
//收益直接到商户账户
$merObj = Merchant::find($merchant_id);
//汇付参数
$member_id = $hfCompanyMObj->member_id;
if ($member_id) {
$merObj->total_revenue += $divide_price;
$merObj->save();
$commissionPreData['merchant_member_id'] = $member_id;
$commissionPreData['merchant_amount'] += $divide_price;
}
}
}
//组合分账参数
//直推佣金
if ($spuid && $first_commission >= 1 && $first_commission < 100 && $commissionPreData['first_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['first_amount'], $first_proportion, $spuid, $buyer_id, 1, $isFirstRealName, $payconfirm_no);
if ($isFirstRealName) {
array_push($div_members, ['member_id' => $commissionPreData['first_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['first_amount']), 'fee_flag' => 'N']);
}
}
//间推佣金
if ($second_spuid && $second_commission >= 1 && $second_commission < 100 && $commissionPreData['second_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['second_amount'], $second_proportion, $second_spuid, $buyer_id, 2, $isSecondRealName, $payconfirm_no);
if ($isSecondRealName) {
array_push($div_members, ['member_id' => $commissionPreData['second_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['second_amount']), 'fee_flag' => 'N']);
}
}
//商户佣金
if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100 && $commissionPreData['merchant_amount'] > 0) {
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['merchant_amount'], $merchant_proportion, $merchant_id, $buyer_id, 3, $isMerchantRealName, $payconfirm_no);
if ($isMerchantRealName) {
array_push($div_members, ['member_id' => $commissionPreData['merchant_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['merchant_amount']), 'fee_flag' => 'N']);
}
}
//平台本身
$aimeiyuePrice = $total_amount - $commissionPreData['first_amount'] - $commissionPreData['second_amount'] - $commissionPreData['merchant_amount'];
self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $aimeiyuePrice, '', 0, $buyer_id, 0, 1, $payconfirm_no);
array_push($div_members, ['member_id' => 0, 'amount' => sprintf("%.2f", $aimeiyuePrice), 'fee_flag' => 'Y']);
//确认分佣金额
if (!$isFirstRealName) {
$commissionPreData['first_amount'] = 0;
}
if (!$isSecondRealName) {
$commissionPreData['second_amount'] = 0;
}
if (!$isMerchantRealName) {
$commissionPreData['merchant_amount'] = 0;
}
$confirm_amt = $aimeiyuePrice + $commissionPreData['first_amount'] + $commissionPreData['second_amount'] + $commissionPreData['merchant_amount'];
return ['div_members' => $div_members, 'confirm_amt' => sprintf("%.2f", $confirm_amt)];
}
//新增分账记录
public static function addRecord($og_id, $order_id, $goods_amount, $divide_price, $commission = '', $um_id = 0, $buyer_id, $sh_type = 0, $isExistAccount, $payconfirm_no)
{
$recordObj = new self();
$recordObj->order_id = $order_id;
$recordObj->user_id = $buyer_id;
$recordObj->og_id = trim($og_id, ',');
$recordObj->order_price = $goods_amount;
$recordObj->divide_price = $divide_price;
$recordObj->proportion = trim($commission, ',');
$recordObj->um_id = $um_id;
$recordObj->sh_type = $sh_type;
$recordObj->is_div = $isExistAccount ? 1 : 0; //是否分账
$recordObj->payconfirm_no = $isExistAccount ? $payconfirm_no : '';
$recordObj->save();
Log::add('订单分佣记录', $recordObj->toArray());
}
public function order()
{
return $this->belongsTo(OrderInfo::class, 'order_id', 'id');
}
public function users()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
}
......@@ -14,8 +14,8 @@ class OrderDivideRecord extends Model
protected $table = 'order_divide_record';
public const COMMISSION_TYPE = [
1 => '直推佣金',
2 => '间推佣金',
1 => '直推佣金',//需求调整,不在分账,改成积分,支付时抵扣
2 => '间推佣金',//需求调整,不在分账,改成积分,支付时抵扣
3 => '用户取货佣金',
4 => '手动调账分账',
];
......
......@@ -23,6 +23,7 @@ class OrderInfo extends Model
4 => '已完成',
7 => '已取消',
//8 => '已退款',
//9 => '已收货',//分账资金冻结7天,用户确认收货后汇付会立即解冻资金,t+1后资金分账,所以需要平台自己控制6天冻结,不分账,这期间可以退款
];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment