連携設定

🚧

注意事項

EC-CUBEでのAPI連携には、プラグインのインストールが必要です。
プラグインは、カスタマイズや他社が提供するプラグインをインストールしていない、EC-CUBE 4.1.2で動作確認しています。
EC-CUBE側で発生するエラーについては、弊社で原因の特定を行うことが困難なため、サポートが出来ない場合もございます。

protegerとEC-CUBE4の連携設定を行います。

protegerの管理画面から連携設定

  1. protegerの管理画面にログインします。
  2. 右上の歯車マークから「EC-CUBE4」を選択します。

  1. 赤枠の3項目を入力します。
    1. EC-CUBE4管理画面ID
    2. EC-CUBE4管理画面パスワード
    3. EC-CUBE4店鋪URL
  2. 「保存」をクリックします。

protegerプラグイン追加

1.0.0:https://sdk.helloproteger.com/eccube-plugin/eccube4-v1-0-0.zip

EC-CUBE4管理画面からprotegerプラグインのインストールを行います。

  1. 管理画面にログインし、サイドバーの「オーナーズストア」→「プラグイン」→「プラグイン一覧」に遷移します。

  2. ユーザー独自プラグイン欄の「アップロードして新規追加」ボタンを押し、ProtegerプラグインのZIPファイルをアップロードします。

  3. 「プラグインをインストールしました。」という文言が表示され、インストールが成功したことを確認してください。

  4. ユーザー独自プラグイン欄にProtegerというプラグインが追加されていることを確認し、有効化ボタンを押します。

  5. ユーザー独自プラグイン欄のProtegerプラグインのステータスが「有効」になっていることを確認します。


protegerプラグイン設定

  1. proteger管理画面にログインし、右上歯車マークを押し、遷移したページで「API Authorization Key」を選択、表示されているキーの右横にあるボタンをクリックし、キーをコピーし控えておきます。

  2. 同じページで「店鋪設定」を選択、「店鋪ID」の横にあるボタンをクリックし、店鋪IDをコピーし控えておきます。

  3. protegerプラグインのインストール後、EC-CUBE4管理画面サイドバーの「設定」配下に「proteger」という項目が追加されます。「proteger」に遷移し、「新規登録」を押します。

  4. 「店鋪ID」のフォームに2でコピーした内容を、「アクセストークン」フォームに1でコピーした内容を貼り付けます。また、「本番環境」のトグルスイッチを「有効」にするとprotegerの本番環境に接続します。テスト環境用の設定をする場合は「無効」にしてください。そして右下の登録ボタンを押してください。

  5. 「保存しました」という内容が表示され、入力した店鋪IDとアクセストークン、環境設定が表示されていることを確認してください。


EC-CUBE4本体カスタマイズ

以下のように4つの本体ファイルを編集してください。
編集元のファイルは初期状態のEC-CUBE4 バージョン4.1のファイルを元にしています。
適宜手元のファイルの実装と照らし合わせて変えてください。

  1. ec-cube/src/Eccube/Service/CartService.php

CartService.phpのaddProduct関数にproteger保証商品がある場合の処理をif文のブロックで追加します。

332行目 
public function addProduct($ProductClass, $quantity = 1)
{
    if (!$ProductClass instanceof ProductClass) {
        $ProductClassId = $ProductClass;
        $ProductClass = $this->entityManager
            ->getRepository(ProductClass::class)
            ->find($ProductClassId);
        if (is_null($ProductClass)) {
            return false;
        }
    }

    $ClassCategory1 = $ProductClass->getClassCategory1();
    if ($ClassCategory1 && !$ClassCategory1->isVisible()) {
        return false;
    }
    $ClassCategory2 = $ProductClass->getClassCategory2();
    if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
        return false;
    }

    $newItem = new CartItem();
    $newItem->setQuantity($quantity);
    $newItem->setPrice($ProductClass->getPrice02IncTax());
    $newItem->setProductClass($ProductClass);

+   if (strpos($ProductClass->getProduct()->getName(), 'proteger') !== false) {
+       $newItem->setProtegerParentProductName($ProductClass->getProtegerParentProductName());
+       $newItem->setProtegerParentProductClassId($ProductClass->getProtegerParentProductClassId());
+       $newItem->setProtegerPlanId($ProductClass->getProtegerPlanId());
+   }
	
    $allCartItems = $this->mergeAllCartItems([$newItem]);
    $this->restoreCarts($allCartItems);

    return true;
}
  1. ec-cube/src/Eccube/Service/OrderHelper.php

OrderHelper.phpのcreateOrderItemsFromCartItems関数にproteger保証商品がある場合の処理をif文のブロックで追加します。
元々ある処理はelseブロックの後にそのまま残します。

378行目
protected function createOrderItemsFromCartItems($CartItems)
{
    $ProductItemType = $this->orderItemTypeRepository->find(OrderItemType::PRODUCT);

    return array_map(function ($item) use ($ProductItemType) {
        /* @var $item CartItem */
        /* @var $ProductClass \Eccube\Entity\ProductClass */
        $ProductClass = $item->getProductClass();
        /* @var $Product \Eccube\Entity\Product */
        $Product = $ProductClass->getProduct();

        $OrderItem = new OrderItem();

+       if (strpos($Product->getName(), 'proteger') !== false) {
+           $OrderItem
+               ->setProduct($Product)
+               ->setProductClass($ProductClass)
+               ->setProductName($Product->getName().'-'.$item->getProtegerParentProductName().'-'.$item->getProtegerParentProductClassId())
+               ->setProductCode($ProductClass->getCode())
+               ->setPrice($item->getPrice())
+               ->setQuantity($item->getQuantity())
+               ->setOrderItemType($ProductItemType)
+               ->setProtegerPlanId($item->getProtegerPlanId());
+       } else {
            $OrderItem
                ->setProduct($Product)
                ->setProductClass($ProductClass)
                ->setProductName($Product->getName())
                ->setProductCode($ProductClass->getCode())
                ->setPrice($ProductClass->getPrice02())
                ->setQuantity($item->getQuantity())
                ->setOrderItemType($ProductItemType);
+       }

        $ClassCategory1 = $ProductClass->getClassCategory1();
        if (!is_null($ClassCategory1)) {
            $OrderItem->setClasscategoryName1($ClassCategory1->getName());
            $OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
        }
        $ClassCategory2 = $ProductClass->getClassCategory2();
        if (!is_null($ClassCategory2)) {
            $OrderItem->setClasscategoryName2($ClassCategory2->getName());
            $OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
        }

        return $OrderItem;
    }, $CartItems instanceof Collection ? $CartItems->toArray() : $CartItems);
}
  1. ec-cube/src/Eccube/Service/PurchaseFlow/Processor/PriceChangeValidator.php

PriceChangeValidator.phpのvalidate関数に以下のようにproteger保証商品の場合の処理を追加します。

32行目 
public function validate(ItemInterface $item, PurchaseContext $context)
{
    if (!$item->isProduct()) {
        return;
    }

    if ($item instanceof OrderItem) {
        $price = $item->getPrice();
        $realPrice = $item->getProductClass()->getPrice02();
+       $productName = $item->getProductClass()->getProduct()->getName();
    } else {
        // CartItem::priceは税込金額.
        $price = $item->getPrice();
        $realPrice = $item->getProductClass()->getPrice02IncTax();
+       $productName = $item->getProductClass()->getProduct()->getName();
    }

+   if (strpos($productName, 'proteger') !== false) {
+       return;
+   }

    if ($price != $realPrice) {
        $item->setPrice($realPrice);
        $this->throwInvalidItemException('front.shopping.price_changed', $item->getProductClass());
    }
}
  1. ec-cube/src/Eccube/Service/Cart/ProductClassComparator.php

ProductClassComparator.phpのCompare関数の先頭にproteger保証商品の場合の処理を追加します。

21行目
class ProductClassComparator implements CartItemComparator
{

    public function compare(CartItem $Item1, CartItem $Item2)
    {
+       if (strpos($Item1->getProductClass()->getCode(), 'proteger') !== false && strpos($Item2->getProductClass()->getCode(), 'proteger') !==false) {
+           $protegerPlanId1 = $Item1->getProtegerPlanId();
+           $protegerPlanId2 = $Item2->getProtegerPlanId();

+           $proteger_plan_id1 = $protegerPlanId1 ? (string) $protegerPlanId1 : null;
+           $proteger_plan_id2 = $protegerPlanId2 ? (string) $protegerPlanId2 : null;

+           if ($proteger_plan_id1 === $proteger_plan_id2) {
+               return true;
+           } else {
+               return false;
+           }
+       }

        ...
    }
}
             
  1. ec-cube/src/Eccube/Service/PurchaseFlow/Processor/TaxProcessor.php

TaxProcessor.phpのprocess関数にproteger保証商品の場合の処理を追加します。
proteger保証商品は管理画面の注文商品上でも常に税込表示となります。

66行目
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
    if (!$itemHolder instanceof Order) {
        return;
    }

    foreach ($itemHolder->getOrderItems() as $item) {
        // 明細種別に応じて税区分, 税表示区分を設定する,
        $OrderItemType = $item->getOrderItemType();

        if (!$item->getTaxType()) {
            $item->setTaxType($this->getTaxType($OrderItemType));
        }
        if (!$item->getTaxDisplayType()) {
            $item->setTaxDisplayType($this->getTaxDisplayType($OrderItemType));
        }

        // 税区分: 非課税, 不課税
        if ($item->getTaxType()->getId() != TaxType::TAXATION) {
            $item->setTax(0);
            $item->setTaxRate(0);
            $item->setRoundingType(null);

            continue;
        }

        // 注文フロー内で税率が変更された場合を考慮し反映する
        // 受注管理画面内では既に登録された税率は自動で変更しない
        if ($context->isShoppingFlow() || $item->getRoundingType() === null) {
            $TaxRule = $item->getOrderItemType()->isProduct()
                ? $this->taxRuleRepository->getByRule($item->getProduct(), $item->getProductClass())
                : $this->taxRuleRepository->getByRule();

            $item->setTaxRate($TaxRule->getTaxRate())
                ->setTaxAdjust($TaxRule->getTaxAdjust())
                ->setRoundingType($TaxRule->getRoundingType());
        }

+       if ($item->getProtegerPlanId()) {
+           $item->setTaxDisplayType($this->entityManager->find(TaxDisplayType::class, TaxDisplayType::INCLUDED));
+       }
          
        // 税込表示の場合は, priceが税込金額のため割り戻す.
        if ($item->getTaxDisplayType()->getId() == TaxDisplayType::INCLUDED) {
            $tax = $this->taxRuleService->calcTaxIncluded(
            $item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
            $item->getTaxAdjust());
        } else {
            $tax = $this->taxRuleService->calcTax(
            $item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
            $item->getTaxAdjust());
        }

        $item->setTax($tax);
    }
}