|
@@ -30,6 +30,7 @@ use Illuminate\Support\Facades\Auth;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
use Illuminate\Support\Facades\Redis;
|
|
|
+use SimpleSoftwareIO\QrCode\Facades\QrCode;
|
|
|
|
|
|
class OrderService
|
|
|
{
|
|
@@ -424,7 +425,7 @@ class OrderService
|
|
|
}
|
|
|
$refundAmount -= $deductAmount;
|
|
|
|
|
|
- // 优先从余额支付金额中扣除
|
|
|
+ // 优先余额支付金额中扣除
|
|
|
$balanceRefund = min($order->balance_amount, $refundAmount);
|
|
|
if ($balanceRefund > 0) {
|
|
|
$this->createRefundRecords($user, $order, $balanceRefund);
|
|
@@ -489,7 +490,7 @@ class OrderService
|
|
|
*/
|
|
|
private function logCancelOrderError(Exception $e, int $userId, int $orderId): void
|
|
|
{
|
|
|
- // 复用之前的日志记录方法
|
|
|
+ // 复用之前的日记录方法
|
|
|
Log::error('取消订单失败:', [
|
|
|
'message' => $e->getMessage(),
|
|
|
'user_id' => $userId,
|
|
@@ -1246,36 +1247,73 @@ class OrderService
|
|
|
/**
|
|
|
* 生成订单核销码
|
|
|
*
|
|
|
+ * @param int $userId 用户ID
|
|
|
* @param int $orderId 订单ID
|
|
|
* @return array 返回核销码信息
|
|
|
*
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
- public function generateVerificationCode(int $orderId): array
|
|
|
+ public function generateVerificationCode(int $userId, int $orderId): array
|
|
|
{
|
|
|
try {
|
|
|
- // 1. 验证订单
|
|
|
- $order = Order::where('id', $orderId)
|
|
|
- ->where('user_id', Auth::id())
|
|
|
- ->where('state', OrderStatus::PAID->value)
|
|
|
+ // 1. 验证用户
|
|
|
+ $user = MemberUser::where('id', $userId)
|
|
|
+ ->where('state', UserStatus::OPEN->value)
|
|
|
+ ->firstOrFail();
|
|
|
+
|
|
|
+ // 2. 验证订单状态和归属
|
|
|
+ $order = $user->orders()
|
|
|
+ ->where('id', $orderId)
|
|
|
+ ->whereIn('state', [
|
|
|
+ OrderStatus::PAID->value,
|
|
|
+ OrderStatus::ACCEPTED->value,
|
|
|
+ OrderStatus::DEPARTED->value,
|
|
|
+ OrderStatus::ARRIVED->value,
|
|
|
+ ])
|
|
|
->firstOrFail();
|
|
|
|
|
|
- // 2. 生成时间戳
|
|
|
+ // 3. 生成时间戳
|
|
|
$timestamp = time();
|
|
|
|
|
|
- // 3. 生成签名 (使用订单ID、时间戳和应用密钥)
|
|
|
+ // 4. 生成签名
|
|
|
$sign = md5("order_{$order->id}_{$timestamp}_".config('app.key'));
|
|
|
|
|
|
- // 4. 组装二维码内容
|
|
|
+ // 5. 组装二维码内容
|
|
|
$qrCode = "order_{$order->id}_{$timestamp}_{$sign}";
|
|
|
|
|
|
+ // 6. 生成二维码图片
|
|
|
+ try {
|
|
|
+ $qrCodeImage = QrCode::encoding('UTF-8')
|
|
|
+ ->size(300)
|
|
|
+ ->margin(1)
|
|
|
+ ->style('square')
|
|
|
+ ->eye('square')
|
|
|
+ ->backgroundColor(255, 255, 255)
|
|
|
+ ->color(0, 0, 0)
|
|
|
+ ->generate($qrCode);
|
|
|
+
|
|
|
+ $qrCodeBase64 = 'data:image/png;base64,'.base64_encode($qrCodeImage);
|
|
|
+ } catch (Exception $e) {
|
|
|
+ Log::error('生成二维码图片失败:', [
|
|
|
+ 'order_id' => $orderId,
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ ]);
|
|
|
+ // 如果二维码生成失败,仍然返回文本内容
|
|
|
+ $qrCodeBase64 = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 7. 返回结果
|
|
|
return [
|
|
|
+ 'order_id' => $order->id,
|
|
|
'qr_code' => $qrCode,
|
|
|
- 'expired_at' => date('Y-m-d H:i:s', $timestamp + 300), // 5分钟后过期
|
|
|
+ 'qr_image' => $qrCodeBase64,
|
|
|
+ 'expired_at' => date('Y-m-d H:i:s', $timestamp + 300),
|
|
|
+ 'state' => $order->state,
|
|
|
];
|
|
|
|
|
|
} catch (Exception $e) {
|
|
|
Log::error('生成订单核销码失败:', [
|
|
|
+ 'user_id' => $userId,
|
|
|
'order_id' => $orderId,
|
|
|
'error' => $e->getMessage(),
|
|
|
'trace' => $e->getTraceAsString(),
|