EC-CUBE / EC-CUBE/ec-cube2

複数商品種別環境で決済画面から戻った際にカートが空になる不具合

Open
#1,246 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
92
Forks
97
Avg merge
4d 2h
Merged PRs (30d)
9

Description

## 環境
- EC-CUBE バージョン: 2.13.0 以降
- 影響範囲: 複数商品種別を使用している環境
- 決済モジュールの決済画面で、注文確認画面から戻る際に `SC_Helper_Purchase::checkDbMyPendignOrder()` に処理を任せている場合
- `PENDING_ORDER_CANCEL_FLAG=false` の環境

## 問題の概要
複数の商品種別がカートに入っている状態で決済画面(クレジットカード入力画面等)から「戻る」ボタンをクリックした際に、購入対象の商品種別のカートが空になってしまう不具合が発生します。

## 再現手順
1. 2種類の商品種別(例:おなべとおなべレシピ)をカートに追加
2. 購入フローを進めて決済画面(クレジットカード入力画面)に到達
3. 決済画面で「戻る」ボタンをクリック
4. 購入確認画面に戻る

## 期待される結果
- 購入対象の商品種別のカートは復元される
- 購入対象外の商品種別のカートは保持される

## 実際の結果
- 購入対象の商品種別のカートが空になってしまう

## 根本原因
`data/class/helper/SC_Helper_Purchase.php` の `checkDbMyPendignOrder` メソッドにおいて:

1. **注文完了時**:`completeOrder` → `cleanupSession` で特定の商品種別のカートのみ削除
2. **戻る処理時**:`getKeys()` で全ての商品種別をチェック

この非対称な処理により、購入対象外の商品種別のカートが残存している場合、`rollbackOrder` ではなく `cancelOrder` が実行されてしまいます。

## 該当コード
```php
// 1550行目
$cartKeys = $objCartSess->getKeys(); // 全商品種別をチェック

// 1555行目
if (SC_Utils_Ex::isBlank($cartKeys) && $target_time < $create_time) {
SC_Helper_Purchase_Ex::rollbackOrder($order_id, ORDER_CANCEL, true);
} else {
SC_Helper_Purchase_Ex::cancelOrder($order_id, ORDER_CANCEL, true); // こちらが実行される
}
```

https://github.com/EC-CUBE/ec-cube2/blob/ca2e30d108f23d8067b7ca28f83894e53441b66a/data/class/helper/SC_Helper_Purchase.php#L1555-L1565

## 修正提案
注文詳細(`dtb_order_detail` → `dtb_products_class`)から購入対象の商品種別を取得し、その商品種別のカートのみをチェック対象とする:

```php
// 注文詳細から商品種別を取得
$arrOrderDetails = static::getOrderDetail($order_id);
$orderProductTypes = array_unique(array_column($arrOrderDetails, 'product_type_id'));

// 購入対象の商品種別のカートのみチェック
$purchaseCartEmpty = true;
foreach ($orderProductTypes as $productTypeId) {
if ($objCartSess->getTotalQuantity($productTypeId) > 0) {
$purchaseCartEmpty = false;
break;
}
}

if ($purchaseCartEmpty && $target_time < $create_time) {
SC_Helper_Purchase_Ex::rollbackOrder($order_id, ORDER_CANCEL, true);
} else {
SC_Helper_Purchase_Ex::cancelOrder($order_id, ORDER_CANCEL, true);
}
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.