Files
webman_duanju/app/czg/app/controller/WuyouController.php
2025-08-15 17:40:31 +08:00

290 lines
9.5 KiB
PHP

<?php
namespace app\czg\app\controller;
use app\api\model\TbUserBlacklist;
use app\common\controller\BaseController;
use app\common\library\DatabaseRoute;
use app\exception\SysException;
use app\utils\RedisUtils;
use app\api\validate\WuyouValidate;
use app\utils\WuYouPayUtils;
use extend\ba\Random;
use app\api\model\Orders;
use support\Log;
use think\facade\Db;
use Throwable;
class WuyouController extends BaseController
{
protected array $noNeedLogin = ['payOrder', 'index', 'test', 'notify', 'queryOrder', 'extractNotify'];
protected array $noNeedPermission = [];
public function queryOrder($orderId)
{
$userId = $this->getUserId();
$order = DatabaseRoute::getDb('orders', $userId)->where([
'orders_id' => $orderId
])->find();
if (!$order) {
$this->error('订单不存在');
}
$detail = DatabaseRoute::getDb('pay_details', $userId)->where([
'order_id' => $order['orders_no']
])->find();
if (!$detail) {
$this->error('订单不存在2');
}
$this->successWithData($detail['state'] == 1 ? 1 : 0);
}
public function payOrder()
{
$params = $this->request->get();
(new WuyouValidate())->scene('payOrder')->check($params);
$userId = $this->getUserId();
// debounce('payOrder' . $params['orderId']);
Log::info(format('生成商品订单信息接口入参为: {}', $params));
$order = DatabaseRoute::getDb('orders', $userId)->where([
'orders_id' => $params['orderId'],
'user_id' => $userId
])->find();
if (!$order) {
throw new SysException("订单不存在");
}
if ($order['status'] != 0) {
throw new SysException("订单已支付");
}
if (RedisUtils::setCreateOrderFlagAndCheckLimit($userId, $params['orderId'])) {
//todo 待办
// (new TbUserBlacklist())->addBlackUser($userId, '一分钟频繁下单超22次');
}
$orderDetail = DatabaseRoute::getDb('pay_details', $userId)->where([
'order_id' => $params['orderId']
])->find();
if ($orderDetail) {
DatabaseRoute::getDb('pay_details', $userId, true)->where([
'order_id' => $params['orderId']
])->update([
'trade_no' => $orderDetail['trade_no']
]);
} else {
$orderDetail = [
'id' => Random::generateRandomPrefixedId(19),
'state' => 0,
'create_time' => date('Y-m-d H:i:s'),
'order_id' => $order['orders_no'],
'user_id' => $order['user_id'],
'money' => (float)$order['pay_money'],
'type' => 1,
'classify' => 9,
'trade_no' => uuid(),
];
DatabaseRoute::getDb('pay_details', $userId, true)->insert($orderDetail);
}
if (bccomp($order['pay_money'], '0', 2) === 0) {
// ordersTask.updateOrderStatus(payDetails, order);
$this->successWithData([
'tradeNo' => $orderDetail['trade_no'],
'payStatus' => 1
]);
}
$result = WuYouPayUtils::payOrder($orderDetail['trade_no'], $userId, $order['pay_money'], request()->header('user-agent'),
// $result = WuYouPayUtils::payOrderTest($orderDetail['trade_no'], $userId, $order['pay_money'], request()->header('user-agent'),
format("{}-{}", $order['course_id'], $order['course_details_id']), $params['payType']);
// $result = [
// 'code' => 200,
// ];
if (!$result) {
DatabaseRoute::getDb('orders', $userId, true)->where([
'orders_id' => $params['orderId'],
'user_id' => $userId
])->update([
'status' => 3
]);
DatabaseRoute::getDb('pay_details', $userId, true)->where([
'id' => $orderDetail['id'],
'user_id' => $userId
])->update([
'status' => 2
]);
throw new SysException("系统繁忙,请稍后再尝试购买");
}
if (!isset($result['code']) || $result['code'] !== '200') {
throw new SysException($result['msg'] ?? $result['error_msg']);
}
$result['data']['orderId'] = $params['orderId'];
$result['data']['h5Url'] = $result['data']['h5_url'];
$this->successWithData($result['data']);
}
public function extractNotify()
{
$params = $this->request->post();
Log::info("无忧支付提现回调,入参: " . json_encode($params));
$signData = [
'callbacks' => $params['callbacks'],
'total' => $params['total'],
'out_trade_no' => $params['out_trade_no'],
'pay_time' => $params['pay_time'],
];
$sign = WuYouPayUtils::getParamsSign($signData);
if ($sign != $params['sign']) {
Log::info("无忧支付回调,验签失败, 签名结果: {$sign}");
// return 'success';
}
$split = explode("-", $params['out_trade_no']);
if (count($split) != 2) {
Log::info("无忧支付回调,订单号分割错误");
return 'success';
}
$orderNo = $split[0];
$userId = $split[1];
$cashOut = DatabaseRoute::getAllDbData('cash_out', function ($query) use ($orderNo, $userId) {
$query->where([
'order_number' => $orderNo
]);
if ($userId) {
$query->where([
'user_id' => $userId
]);
}
return $query;
})->where([
'order_number' => $orderNo
])->find();
if ($cashOut) {
\app\admin\model\Order::executeExtractCallback($cashOut, $params);
}else{
$info = DatabaseRoute::getDb('user_info', $userId)->find();
DatabaseRoute::getDb('cash_out', $userId, true)->insert([
'user_id' => $userId,
'order_number' => $orderNo,
'money' => $params['total'],
'relation_id' => $params['msg'],
'state' => 9,
'zhifubao_name' => $info ? $info['cert_name'] : '',
]);
}
return "success";
}
/**
* 无忧支付回调
*/
public function notify()
{
try {
$params = $this->request->post();
// $params = json_decode('{"callbacks": "CODE_SUCCESS","order_sn": "test001","out_trade_no": "bcf60b80e805480984a9956088e74225-357901754385306920","pay_time": "1751584904","sign": "495D873175D4A7762B3B7162DA6C9F35","total": 1.50}', true);
Log::info("无忧支付回调,入参: " . json_encode($params));
$signData = [
'callbacks' => $params['callbacks'],
'total' => $params['total'],
'out_trade_no' => $params['out_trade_no'],
'pay_time' => $params['pay_time'],
];
$sign = WuYouPayUtils::getParamsSign($signData);
if ($sign != $params['sign']) {
Log::info("无忧支付回调,验签失败, 签名结果: {$sign}");
// return 'success';
}
throw new SysException("1");
if ($params['callbacks'] != 'CODE_SUCCESS') {
Log::info("无忧支付回调,支付失败");
return 'success';
}
$split = explode("-", $params['out_trade_no']);
if (count($split) != 2) {
Log::info("无忧支付回调,订单号分割错误");
return 'success';
}
$orderNo = $split[0];
$userId = $split[1];
$payDetails = DatabaseRoute::getDb('pay_details', $userId)->where([
'trade_no' => $orderNo,
'user_id' => $userId
])->select();
if (count($payDetails) == 0) {
Log::info("无忧支付回调,订单不存在");
return 'success';
}
if (count($payDetails) > 1) {
Log::info("无忧支付回调,订单存在多个");
return 'success';
}
$payDetail = $payDetails[0];
if ($payDetail['state'] == 1) {
Log::info("无忧支付回调,重复回调");
return 'success';
}
$order = DatabaseRoute::getDb('orders', $userId)->where([
'orders_no' => $payDetail['order_id'],
'user_id' => $userId
])->limit(1)->find();
if (!$order) {
Log::info("无忧支付回调,订单不存在");
return '订单不存在';
}
if ($order['status'] != 0) {
Log::info("无忧支付回调,订单已支付");
return '订单已支付';
}
$payDetail['third_order_no'] = $params['order_sn'];
Orders::updateOrderStatus($payDetail, $order, $userId);
}catch (Throwable $e) {
Log::info("异常".$e->getMessage());
throw $e;
}
return "success";
}
public function test()
{
$data = DatabaseRoute::getAllDbData('tb_user', function ($query) {
return $query->where([
'user_id' => 14256
]);
})->find();
$this->successWithData($data);
}
}