收款通知性能优化

This commit is contained in:
技术老胡 2024-11-06 16:17:23 +08:00
parent 6acecb0596
commit 4228355d36
6 changed files with 60 additions and 58 deletions

View File

@ -155,15 +155,17 @@ class PayController
return \json(\backMsg(1, '更新失败')); return \json(\backMsg(1, '更新失败'));
} }
} }
// 处理收款通知 public function payHeart(Request $request)
public function payHeart($pid = '', $aid = '', $sign = '')
{ {
$pid = $request->get('pid');
$aid = $request->get('aid');
$sign = $request->get('sign');
// 检测请求参数 // 检测请求参数
if (!($pid && $aid && $sign)) { if (!($pid && $aid && $sign)) {
return '参数错误'; return json(['code' => 0, 'msg' => '参数错误']);
} }
// 检测收款通知 // 检测收款通知
$payList = request()->post(); $payList = $request->post();
if (!$payList) { if (!$payList) {
return json(['code' => 0, 'msg' => '空收款通知']); return json(['code' => 0, 'msg' => '空收款通知']);
} }
@ -174,58 +176,60 @@ class PayController
} }
// 当前用户账号 // 当前用户账号
$query = ['pid' => $pid, 'aid' => $aid]; $query = ['pid' => $pid, 'aid' => $aid];
// 排除有效期内的已支付订单 // 排除已支付订单
$doneOrders = Order::scope('dealOrder')->where($query)->column('platform_order'); $doneOrders = Order::scope('dealOrder')->where($query)->column('platform_order');
if ($doneOrders) { $new_orders = [];
$num = count($payList['order_no']); foreach ($payList as $order) {
for ($i = 0; $i < $num; $i++) { if (!in_array($order['order_no'], $doneOrders)) $new_orders[] = $order;
if (in_array($payList['order_no'][$i], $doneOrders)) {
$payList['price'][$i] = 0;
}
}
}
if (array_sum($payList['price']) === 0) {
return json(['code' => 0, 'msg' => '查询无新订单']);
} }
if (!count($new_orders)) return json(['code' => 0, 'msg' => '查询无新订单']);
// 有效订单列表 // 有效订单列表
$activeOrders = Order::scope('activeOrder')->where($query)->select(); $activeOrders = Order::scope('activeOrder')->where($query)->select();
if (!\count($activeOrders)) { if (!count($activeOrders)) return json(['code' => 0, 'msg' => '数据库无有效期订单']);
return json(['code' => 0, 'msg' => '无有效期订单']); // 查找所有支付渠道
} $channels = $activeOrders->column('cid');
// $msg = []; 订单高并发预留 $cids = PayChannel::whereIn('id', $channels)->column('channel', 'id');
foreach ($activeOrders as $order) { // 订单处理
$index = array_search($order->really_price, $payList['price']); $notify = [];
// 付款金额检查 foreach ($new_orders as $new_order) {
if ($index !== false) { foreach ($activeOrders as $order) {
// 已支付订单容错查询
$is_order_no = Order::where('platform_order', $payList['order_no'][$index])->where($query)->find();
// 支付方式核对 // 支付方式核对
$is_payway = $order->type === $payList['payway'][$index]; $is_payway = $order->type === $new_order['payway'];
// 支付渠道核对 // 支付渠道核对
$is_channel = PayChannel::where('id', $order->cid)->value('channel') === $payList['channel'][$index]; $is_channel = $cids[$order->cid] === $new_order['channel'];
// 全部核对通过,修改订单状态 // 金额核对
if (!$is_order_no && $is_payway && $is_channel) { $is_money = $order->money === $new_order['price'];
// 支付成功 // 订单核对
$set_order_state = $order->save(['state' => 1, 'pay_time' => date('Y-m-d H:i:s', time()), 'platform_order' => $payList['order_no'][$index]]); if ($is_payway && $is_channel && $is_money) {
// 订单成交通知 $res = $this->updateOrderState($order, $new_order['order_no']);
if (!$set_order_state) { $notify[] = $res;
return json(['code' => 0, 'msg' => '修改订单状态失败']);
}
$notify = self::crateNotify($order);
// 字符串签名
$user_key = User::where('pid', $order->pid)->value('secret_key');
$sign = self::getSign($notify, $user_key);
$notify['sign'] = $sign;
// 异步通知
$res_notify = self::getHttpResponse($order->notify_url . '?' . http_build_query($notify));
if ($res_notify === 'success') {
return json(['code' => 0, 'msg' => 'success']);
} else {
return json(['code' => 1, 'msg' => '异步通知失败']);
}
} }
} }
} }
if (!$notify) $notify = ['code' => 0, 'msg' => '收款通知无匹配订单'];
return json($notify);
}
// 修改订单状态并通知
private function updateOrderState(Order $order, string $order_no = ''): array
{
// 支付成功
$set_order_state = $order->save(['state' => 1, 'pay_time' => date('Y-m-d H:i:s', time()), 'platform_order' => $order_no]);
if (!$set_order_state) {
return ['order' => $order->order_id, 'code' => 0, 'msg' => '修改订单状态失败'];
}
// 订单成交通知
$notify = self::crateNotify($order);
// 字符串签名
$user_key = User::where('pid', $order->pid)->value('secret_key');
$sign = self::getSign($notify, $user_key);
$notify['sign'] = $sign;
// 异步通知
$res_notify = self::getHttpResponse($order->notify_url . '?' . http_build_query($notify));
if ($res_notify === 'success') {
return ['order' => $order->order_id, 'code' => 1, 'msg' => 'notify success'];
} else {
return ['order' => $order->order_id, 'code' => 0, 'msg' => 'notify fail'];
}
} }
// [定时任务]获取收款明细,提交收款通知[本地版] // [定时任务]获取收款明细,提交收款通知[本地版]
public function checkPayResult(Request $request) public function checkPayResult(Request $request)
@ -258,9 +262,7 @@ class PayController
$res_new_order = $Mpay->orderHeart(); $res_new_order = $Mpay->orderHeart();
$new_order = json_decode($res_new_order, true); $new_order = json_decode($res_new_order, true);
// 检测新订单 // 检测新订单
if ($new_order['code'] !== 1) { if ($new_order['code'] !== 1) return $res_new_order;
return $res_new_order;
}
// 订单列表 // 订单列表
$order_list = $new_order['orders']; $order_list = $new_order['orders'];
// 检测本账号订单 // 检测本账号订单

View File

@ -176,7 +176,7 @@ class Order extends BaseModel
// 查询有效期内的成交订单 // 查询有效期内的成交订单
public function scopeDealOrder($query) public function scopeDealOrder($query)
{ {
$query->where('close_time', '>', self::getFormatTime())->where('state', 1); $query->where('close_time', '>', self::getFormatTime(time() - self::$activity_time))->where('state', 1);
} }
// 查询超时过期订单 // 查询超时过期订单
public function scopeTimeoutOrder($query) public function scopeTimeoutOrder($query)

View File

@ -26,7 +26,7 @@ class MpayClass
public function upRecords($records, $aid) public function upRecords($records, $aid)
{ {
$header = ['Content-Type: application/json;charset=UTF-8']; $header = ['Content-Type: application/json;charset=UTF-8'];
$url = $this->submit_records_url . "/{$this->pid}/{$aid}/{$this->getSign()}"; $url = $this->submit_records_url . "?pid={$this->pid}&aid={$aid}&sign={$this->getSign()}";
$res = $this->getHttpResponse($url, $header, json_encode($records)); $res = $this->getHttpResponse($url, $header, json_encode($records));
return $res; return $res;
} }

View File

@ -95,10 +95,10 @@ class ShouQianBa
{ {
$new_query = $query; $new_query = $query;
$now = $this->now; $now = $this->now;
$begin_time = (int)(($now - 175) . mt_rand(100, 999)); $begin_time = (int)(($now - 175) . 000);
$end_time = (int)($now . mt_rand(100, 999)); $end_time = (int)($now . 999);
$query['date_start'] = $begin_time; $new_query['date_start'] = $begin_time;
$query['date_end'] = $end_time; $new_query['date_end'] = $end_time;
return $new_query; return $new_query;
} }
// 登陆账号 // 登陆账号

View File

@ -13,7 +13,7 @@ Route::rule('getOrderState/[:order_id]', 'Pay/getOrderState');
// 监控新订单 // 监控新订单
Route::rule('checkOrder/[:pid]/[:sign]', 'Pay/checkOrder'); Route::rule('checkOrder/[:pid]/[:sign]', 'Pay/checkOrder');
// 处理收款通知 // 处理收款通知
Route::rule('payHeart/[:pid]/[:aid]/[:sign]', 'Pay/payHeart'); Route::rule('payHeart', 'Pay/payHeart');
// 监听收款通知 // 监听收款通知
Route::rule('checkPayResult', 'Pay/checkPayResult'); Route::rule('checkPayResult', 'Pay/checkPayResult');
// 验证支付结果 // 验证支付结果

View File

@ -1 +1 @@
{"code":1,"msg":"\u67091\u4e2a\u65b0\u8ba2\u5355","orders":[{"id":36315,"pid":1001,"aid":7,"cid":7,"patt":1}]} {"code":0,"msg":"没有新订单"}