Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> EC-Cube3 -> 【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策

【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策

株式会社ブラテック製のお届け日調整プラグインと、
アイピーロジック製のAmazon Payプラグインの併用で、
Amazon Payでの注文時に、お届け日が、きちんと調整されない不具合がありましたので、
メモです。

以下のバージョンに対して修正を行いました。
ECCube : 3.0.15
お届け日調整プラグイン: 1.0.10
Amazon Pay: 1.2.1

修正方法ですが、Amazon Pay側のプラグインを修正します。

/app/Plugin/AmazonPayments/Controller/AmazonShoppingController.php: 539行目あたり: 青の部分を、赤の部分に移動します。 要するに、ちゃんと住所を取得出来てから、 注文フォームを作成するわけです。 // $builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order); // $form = $builder->getForm(); // $form->handleRequest($request); // $data = $form->getData(); // $message = $data['message']; // Amazonからお届け先取得 $arrAmznAddr = $app['eccube.plugin.amazonpayments.service.amazon_request']->getDeliveryAddress($amazonOrderReferenceId, $addressConsentToken); // EC-CUBEに対応付け $Shippings = $Order->getShippings(); foreach ($Shippings as $key => $Shipping) { $app['eccube.plugin.amazonpayments.service.amazon_shopping']->convertAddress($Order, $Shippings[$key], $arrAmznAddr); } $builder = $app['eccube.plugin.amazonpayments.service.amazon_shopping']->getShippingFormBuilder($Order); $form = $builder->getForm(); $form->handleRequest($request); $data = $form->getData(); $message = $data['message'];
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php: 40行目あたり: use宣言で、DeliveryDateプラグインを使う事を宣言します。 use Plugin\DeliveryDate\Repository\ProductClassRepository; use Plugin\DeliveryDate\Repository\HolidayRepository; use Plugin\DeliveryDate\Repository\DeliveryDateRepository;
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php: 1147行目あたり: 赤文字の部分を追加します。 要するに、Amazon Paymentから取得した住所を、セッションに保持して、後で使用します。 $Pref = $this->app['eccube.repository.master.pref']->findOneBy(array('name' => $arrAmznAddr['StateOrRegion'])); if (!empty($Pref)) { $_SESSION["order_pref"] = $Pref->getId(); $Shipping->setPref($Pref); } else { // 存在しない都道府県の場合 $this->app['monolog.amazonpayments']->addInfo('*** 都道府県マッチングエラー *** addr = '.print_r($arrAmznAddr, true)); $Shipping->setPref(null); $addr01 = $arrAmznAddr['StateOrRegion'] . $addr01; }
/app/Plugin/AmazonPayments/Service/AmazonShoppingService.php: 858行目あたり: 赤文字が、追加したコードです。 public function getFormDeliveryDates(Order $Order) { // お届け日の設定 $deliveryDatePluginFlg = 1; $minDate = 0; $deliveryDateFlag = false; if($deliveryDatePluginFlg){ $deliveryDateFlag = true; } // 配送時に最大となる商品日数を取得 foreach ($Order->getOrderDetails() as $detail) { if($deliveryDatePluginFlg){ $deliveryDate = $this->app['eccube.deliverydate.repository.product_class']->findOneBy(array('product_class_id' => $detail->getProductClass()->getId())); if (!is_null($deliveryDate)) { $days = $deliveryDate->getDays(); if(!is_null($days)){ if ($minDate < $days) { $minDate = $days; } }else{ $deliveryDateFlag = false; break; } }else{ $deliveryDateFlag = false; break; } }else{ // ここはデフォルトの処理 $deliveryDate = $detail->getProductClass()->getDeliveryDate(); if (!is_null($deliveryDate)) { if ($minDate < $deliveryDate->getValue()) { $minDate = $deliveryDate->getValue(); } // 配送日数が設定されている $deliveryDateFlag = true; } } } // 配達最大日数期間を設定 $deliveryDates = array(); if($deliveryDateFlag && $deliveryDatePluginFlg){ $Method = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'method')); $AcceptTime = $this->app['eccube.deliverydate.repository.config']->findOneBy(array('name' => 'accept_time')); if($AcceptTime){ $time = (int)$AcceptTime->getValue(); if($minDate == 0 && $time > 0){ $isHoliday = false; if($Method){ if($Method->getValue() != 1){ $date = new \DateTime(); if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){ $isHoliday = true; } } } if(!$isHoliday){ $now = getdate(); if($now['hours'] >= $time){ $minDate = 1; } } } } // 発送までの日数を計算 if($Method){ if($Method->getValue() != 1){ $shippingDate = $minDate; $i=0; while($shippingDate >= 0){ $date = new \DateTime($i . 'day'); if($this->app['eccube.deliverydate.repository.holiday']->checkHoliday($date)){ $minDate++; }else{ $shippingDate--; } $i++; } } } // 都道府県ごとの配送日数を加算 if($_SESSION["order_pref"]){ $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array( 'Delivery' => empty($Delivery) ? 1 : $Delivery, 'Pref' => $_SESSION["order_pref"], )); unset($_SESSION["order_pref"]); }else{ // このあたりの処理、冗長なので、後で修正するかも。 if(!empty($Order->getPref())){ $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array( 'Delivery' => empty($Delivery) ? 1 : $Delivery, 'Pref' => (int)@$Order->getPref()->getId(), )); }else{ $plgDeliveryDate = $this->app['eccube.deliverydate.repository.delivery_date']->findOneBy(array( 'Delivery' => empty($Delivery) ? 1 : $Delivery, 'Pref' => 13, )); } } if($plgDeliveryDate){ $dates = $plgDeliveryDate->getDates(); if(!is_null($dates))$minDate += $dates; } // 配達最大日数期間を設定 $deliveryDates = array(); $period = new \DatePeriod ( new \DateTime($minDate . ' day'), new \DateInterval('P1D'), new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day') ); foreach ($period as $day) { $deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d'); } } else{ // ここはデフォルトの処理 // 配送日数が設定されている if ($deliveryDateFlag) { $period = new \DatePeriod ( new \DateTime($minDate . ' day'), new \DateInterval('P1D'), new \DateTime($minDate + $this->app['config']['deliv_date_end_max'] . ' day') ); foreach ($period as $day) { $deliveryDates[$day->format('Y/m/d')] = $day->format('Y/m/d'); } } } return $deliveryDates; }
結論: あーーーー、もう、ECCubeめんどくさいwww

この記事の最終更新日:2018/06/19
最初に記事を書いた日:2018/06/19

この記事をシェアする

このエントリーをはてなブックマークに追加

関連記事

資料室のトップに戻る
Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> EC-Cube3 -> 【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策
▲Top English