質問 > フロント機能 > Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
PONK |
投稿日時: 2019/11/21 16:15
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について [EC-CUBE] EC-CUBE 3.0.15
[レンタルサーバ] コアサーバー [OS] Ubuntu [PHP] 7.1.32 [データベース] MySQL 5.7.27 [WEBサーバ] Apache [導入プラグイン] Pointプラグイン(Point 1.0.0)、Amazon Pay 決済プラグイン(FgAmazonPay 2.0.0) 公式Pointプラグイン https://www.ec-cube.net/products/detail.php?product_id=1101 と NIPPON PAY(現NIPPON Platform)のAmazon Pay 決済プラグイン を導入しております。 Amazon Pay 決済プラグインは、注文内容の確認画面がEC-CUBE本体のものとはURLが異なり(/plugin/fgamazonpay/index?access_token=hoge)、ポイント利用に関する項目も表記されないため、公式Pointプラグインのevent.ymlとPointEvent.phpに以下の様に手を加え、ポイント利用に関する項目を表記させる事が出来る段階までカスタマイズ出来ました。 app/Plugin/Point/event.ymlに追記 FgAmazonPay/Resource/template/index.twig: - [onRenderFgAmazonPayShoppingIndex, NORMAL] app/Plugin/Point/PointEvent.phpに追記 public function onRenderFgAmazonPayShoppingIndex(TemplateEvent $event) { // ログイン判定 if ($this->isAuthRouteFront()) { $helper = new FrontShopping(); $helper->createTwig($event); } } 上記追記により、注文内容の確認画面にポイント利用に関する項目を表記される事が出来ておりますが、利用ポイントの設定画面(/shopping/use_point)にてポイントを設定した後、「ポイントを利用する」ボタンをクリックすると、EC-CUBE本体の確認画面(/shopping)にページ移動してしまいます。 Amazon Payでの決済時にもポイント利用出来るようにしたいので、Amazon Payでの決済が選択されている場合は、ポイント設定後にAmazon Pay 決済プラグインの注文内容の確認画面(/plugin/fgamazonpay/index?access_token=hoge)に戻らせたいです。 対応方法が分かりましたら教えてください。 |
468 |
投稿日時: 2019/11/25 10:22
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について Pointプラグインの
/Controller/FrontPointController.php function usePoint()内に
のような記述があるかと思います。 return $app->redirect($app->url('shopping')); ↑の記述でルーティング「shopping」を指定して EC-CUBE本体の確認画面(/shopping)に遷移させています。 ここの部分をAmazonPay決済プラグインの注文内容の確認画面のルーティングを指定すれば良いのではないかと思います。 ルーティング名はAmazonPay決済プラグイン側で指定されているのと思いますので ご自身で調べていただく必要があるかと思います。 多分、ルーティングはプラグイン内のServiceProviderで定義していると思います。
|
PONK |
投稿日時: 2019/11/26 17:29
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について 株式会社シロハチ様
ご助言いただき、ありがとうございます。 return $app->redirect($app->url('shopping')); のルーティングを変更する事で、目的のページに遷移させることが出来ました。 ただ、目的のページに遷移しましたが、遷移後のページに使用ポイントの情報が反映されません。 値引き情報はPointプラグインの PointEvent.phpの onFrontChangeTotal にて制御しているという認識で良いのでしょうか? 重ねて質問で申し訳ありませんが、遷移後のページに値引き情報を表示させる方法を教えてください。 |
PONK |
投稿日時: 2019/11/28 15:23
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について 度々の投稿で申し訳ありません。
その後色々と試しておりますが、やはりポイント情報(値引き情報)が上手くアマゾンペイ決済プラグインに渡せていない状況です。 起こっている状況ですが、ポイントプラグインの利用ポイントの設定画面(/shopping/use_point)にて利用ポイントを入力した後、上の株式会社シロハチ様の投稿でご提案いただきましたルーティング設定の変更をしたアマゾンペイ決済プラグインの注文内容の確認画面に遷移した際に値引き情報が無くなってしまうという状況です。 更に詳しく調べましたところ、アマゾンペイ決済プラグインの注文内容の確認画面に遷移した直後は $cartService = $app['eccube.service.cart']; $cartService->lock(); より前に $app['eccube.service.shopping']->getOrder($app['config']['order_processing'])->getDiscount(); にて値引き額(利用ポイント設定額)を取得できますが、 その後直ぐに自ページへリダイレクトしたような状況となり(ページが再読み込みされているようです)、その時点で $app['eccube.service.shopping']->getOrder($app['config']['order_processing'])->getDiscount(); をしても戻ってくる値が「0」となってしまいます。 以下はアマゾンペイ決済プラグインのコントローラーとなります。 対応方法が分かる方がいらっしゃいましたら、何かご助言いただけますと幸いです。 <?php /* * This file is part of the FgAmazonPay * * Copyright (C) 2017 FourGlobe Co.,Ltd. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Plugin\FgAmazonPay\Controller; use Eccube\Application; use Eccube\Common\Constant; use Eccube\Entity\Customer; use Eccube\Event\EccubeEvents; use Eccube\Event\EventArgs; use Plugin\FgAmazonPay\Exception\AmazonPayApiException; use Symfony\Component\HttpFoundation\Request; require_once(__DIR__.'/../vendor/amazon-pay-sdk-php/AmazonPay/Client.php'); use AmazonPay\Client; class FgAmazonPayController { /** * @var string 非会員用セッションキー */ private $sessionKey = 'eccube.front.shopping.nonmember'; /** * @var string 非会員用セッションキー */ private $sessionCustomerAddressKey = 'eccube.front.shopping.nonmember.customeraddress'; /** * @var string 複数配送警告メッセージ */ private $sessionMultipleKey = 'eccube.front.shopping.multiple'; /** * @var string 受注IDキー */ private $sessionOrderKey = 'eccube.front.shopping.order.id'; /** * FgAmazonPay画面 * * @param Application $app * @param Request $request * @return \Symfony\Component\HttpFoundation\Response */ public function index(Application $app, Request $request) { $cartService = $app['eccube.service.cart']; $cartService->lock(); $cartService->save(); // カートチェック if (!$cartService->isLocked()) { log_info('カートが存在しません'); // カートが存在しない、カートがロックされていない時はエラー return $app->redirect($app->url('cart')); } // カートチェック if (count($cartService->getCart()->getCartItems()) <= 0) { log_info('カートに商品が入っていないためショッピングカート画面にリダイレクト'); // カートが存在しない時はエラー return $app->redirect($app->url('cart')); } $PluginSetting = $app['fg_amazon_pay.repository.fg_amazon_pay_setting']->findOneBy(array(), array('id' => 'desc')); $client_id = $PluginSetting->getClientKey(); $seller_id = $PluginSetting->getSellerKey(); $view_type = $PluginSetting->getViewType(); $have_confirm = $PluginSetting->getHaveConfirm(); if ($PluginSetting->getIsSandbox()) { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/sandbox/lpa/js/Widgets.js'; } else { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/lpa/js/Widgets.js'; } // 登録済みの受注情報を取得 $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); // 初回アクセス(受注情報がない)の場合は, 受注情報を作成 if (is_null($Order)) { /*-----------2018-06-28手数料追加start--------*/ $access_key = $PluginSetting->getAccessKey(); $secret_key = $PluginSetting->getSecretKey(); /*-----------2018-06-28手数料追加end--------*/ // 未ログインの場合, アマゾンのユーザ情報を利用する if (!$app->isGranted('IS_AUTHENTICATED_FULLY')) { $config = array( 'merchant_id' => $seller_id, 'access_key' => $access_key, 'secret_key' => $secret_key, 'client_id' => $client_id, 'region' => 'jp', 'sandbox' => $PluginSetting->getIsSandbox(), ); $client = new Client($config); //$aa = $_REQUEST; //print_r($aa); $PluginSetting = $app['fg_amazon_pay.repository.fg_amazon_pay_setting']->findOneBy(array(), array('id' => 'desc')); $view_type = $PluginSetting->getViewType(); $client_id = $PluginSetting->getClientKey(); if(!$view_type && !isset($_GET['access_token']) ){ return $app->render('FgAmazonPay/Resource/template/element/popupFalse.twig', array("client_id"=>$client_id,"widget_url"=>$widget_url)); } $amazon_userinfo = $client->getUserInfo($_GET['access_token']); $Customer = new Customer(); $Customer->setName01(html_entity_decode($amazon_userinfo['name'])); $Customer->setEmail($amazon_userinfo['email']); $Customer->setPref($app['eccube.repository.master.pref']->find(3)); } else { $Customer = $app->user(); } try { // 受注情報を作成 $Order = $app['eccube.service.shopping']->createOrder($Customer); $Order->setPayment(null); $Order->setPaymentMethod('Amazon Pay'); $Order->setCharge(0); } catch (CartException $e) { log_error('初回受注情報作成エラー', array($e->getMessage())); $app->addRequestError($e->getMessage()); return $app->redirect($app->url('cart')); } // セッション情報を削除 if (isset($this->sessionOrderKey)) { $app['session']->remove($this->sessionOrderKey); } if (isset($this->sessionMultipleKey)) { $app['session']->remove($this->sessionMultipleKey); } } /*-----------2018-06-11手数料追加start--------*/ $payment = $app['eccube.repository.payment']->find("99"); $Order->setPayment($payment); $Order->setCharge($payment->getCharge()); //$Order->setDeliveryFeeTotal(19); //echo $Order->getDeliveryFeeTotal(); $Order = $app['eccube.service.shopping']->calculatePrice($Order); //echo $Order->getDeliveryFeeTotal(); // 受注関連情報を最新状態に更新 //$app['orm.em']->refresh($Order); /*-----------2018-06-11手数料追加end--------------*/ // form作成 $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order); $event = new EventArgs( array( 'builder' => $builder, 'Order' => $Order, ), $request ); $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_INDEX_INITIALIZE, $event); $form = $builder->getForm(); /*-----------2018-06-11手数料追加start--------*/ /* * 配送業者変更処理 */ if ($_SERVER['REQUEST_METHOD'] == "POST") { //print_r($_POST);exit; /* Array ( [order_reference_id] => S03-7330465-5163350 [shopping] => Array ( [_token] => PR4iEttg0iKqCvJem-AeypOWUlbQLNlBVsHjJNoqRYM [shippings] => Array ( [0] => Array ( [delivery] => 1 [shippingDeliveryDate] => [deliveryTime] => ) ) [message] => ) ) */ $config = array( 'merchant_id' => $seller_id, 'access_key' => $access_key, 'secret_key' => $secret_key, 'client_id' => $client_id, 'region' => 'jp', 'sandbox' => $PluginSetting->getIsSandbox(), ); $client = new Client($config); $result = $client->getOrderReferenceDetails(array( 'AddressConsentToken' => $_POST['_token'], 'amazon_order_reference_id' => $_POST['order_reference_id'], )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('getOrderReferenceDetails() に失敗')); throw new \Exception('Amazon Pay API の処理に失敗しました'); }else{ $destination = $response_values['GetOrderReferenceDetailsResult']['OrderReferenceDetails']['Destination']['PhysicalDestination']; //echo $destination['StateOrRegion'];exit; $pref = $app['eccube.repository.master.pref']->findOneBy(array('name' => $destination['StateOrRegion'])); } log_info('配送業者変更処理開始', array($Order->getId())); $form->handleRequest($request); $data = $form->getData(); $shippings = $data['shippings']; $productDeliveryFeeTotal = 0; $BaseInfo = $app['eccube.repository.base_info']->get(); foreach ($shippings as $Shipping) { $Delivery = $Shipping->getDelivery(); if ($Delivery) { $deliveryFee = $app['eccube.repository.delivery_fee']->findOneBy(array( 'Delivery' => $Delivery, 'Pref' => $pref )); // 商品ごとの配送料合計 if ($BaseInfo->getOptionProductDeliveryFee() === Constant::ENABLED) { $productDeliveryFeeTotal += $app['eccube.service.shopping']->getProductDeliveryFee($Shipping); } if($pref){ $pref_fee = $deliveryFee->getFee(); }else{ $pref_fee = 0; } $Shipping->setDeliveryFee($deliveryFee); $Shipping->setShippingDeliveryFee( $pref_fee + $productDeliveryFeeTotal); $Shipping->setShippingDeliveryName($Delivery->getName()); } } $message = $data['message']; $Order->setDeliveryFeeTotal($app['eccube.service.shopping']->getShippingDeliveryFeeTotal($shippings)); // 合計金額の再計算 $Order = $app['eccube.service.shopping']->getAmount($Order); // 受注関連情報を最新状態に更新 $app['orm.em']->flush(); $event = new EventArgs( array( 'form' => $form, 'Order' => $Order, ), $request ); $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_DELIVERY_COMPLETE, $event); log_info('配送業者変更処理完了', array($Order->getId())); } /*-----------2018-06-11手数料追加end--------------*/ if ($Order->getTotalPrice() < 0) { // 合計金額がマイナスの場合、エラー log_info('受注金額マイナスエラー', array($Order->getId())); $message = $app->trans('shopping.total.price', array('totalPrice' => number_format($Order->getTotalPrice()))); $app->addError($message); return $app->redirect($app->url('shopping_error')); } /*-----------2018-06-11手数料追加start--------*/ $delivery_p = "?"; $delivery_idx = 0; foreach ($_GET as $key => $item) { if($key == 'delivery') continue; if($delivery_idx > 0) $delivery_p = $delivery_p."&"; $delivery_p = $delivery_p . $key."=".$item; $delivery_idx++; } /*-----------2018-06-11手数料追加end--------------*/ return $app->render('FgAmazonPay/Resource/template/index.twig', array( 'form' => $form->createView(), 'Order' => $Order, 'delivery_p' => $delivery_p, 'seller_id' => $seller_id, 'client_id' => $client_id, 'widget_url' => $widget_url, 'view_type' => $view_type, 'have_confirm' =>$have_confirm, 'REQUEST_METHOD' =>$_SERVER['REQUEST_METHOD'], )); } /** * 配送業者選択処理 */ public function delivery(Application $app, Request $request) { // カートチェック if (!$app['eccube.service.cart']->isLocked()) { // カートが存在しない、カートがロックされていない時はエラー log_info('カートが存在しません'); return $app->redirect($app->url('cart')); } $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); if (!$Order) { log_info('購入処理中の受注情報がないため購入エラー'); $app->addError('front.shopping.order.error'); return $app->redirect($app->url('shopping_error')); } if ('POST' !== $request->getMethod()) { return $app->redirect($app->url('shopping')); } $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order); $form = $builder->getForm(); $form->handleRequest($request); $PluginSetting = $app['fg_amazon_pay.repository.fg_amazon_pay_setting']->findOneBy(array(), array('id' => 'desc')); $client_id = $PluginSetting->getClientKey(); $seller_id = $PluginSetting->getSellerKey(); $have_confirm = $PluginSetting->getHaveConfirm(); if ($PluginSetting->getIsSandbox()) { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/sandbox/lpa/js/Widgets.js'; } else { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/lpa/js/Widgets.js'; } if ($form->isSubmitted()) { log_info('配送業者変更処理開始', array($Order->getId())); $data = $form->getData(); $access_key = $PluginSetting->getAccessKey(); $secret_key = $PluginSetting->getSecretKey(); $config = array( 'merchant_id' => $seller_id, 'access_key' => $access_key, 'secret_key' => $secret_key, 'client_id' => $client_id, 'region' => 'jp', 'sandbox' => $PluginSetting->getIsSandbox(), ); $client = new Client($config); $shippings = $data['shippings']; $productDeliveryFeeTotal = 0; $BaseInfo = $app['eccube.repository.base_info']->get(); $result = $client->getOrderReferenceDetails(array( 'merchant_id' => $seller_id, 'amazon_order_reference_id' => $_POST['order_reference_id'], )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('getOrderReferenceDetails() に失敗')); throw new \Exception('Amazon Pay API の処理に失敗しました'); } $destination = $response_values['GetOrderReferenceDetailsResult']['OrderReferenceDetails']['Destination']['PhysicalDestination']; $pref = $app['eccube.repository.master.pref']->findOneBy(array('name' => $destination['StateOrRegion'])); foreach ($shippings as $Shipping) { $Delivery = $Shipping->getDelivery(); if ($Delivery) { $deliveryFee = $app['eccube.repository.delivery_fee']->findOneBy(array( 'Delivery' => $Delivery, 'Pref' => $pref, )); // 商品ごとの配送料合計 if ($BaseInfo->getOptionProductDeliveryFee() === Constant::ENABLED) { $productDeliveryFeeTotal += $app['eccube.service.shopping']->getProductDeliveryFee($Shipping); } $Shipping->setDeliveryFee($deliveryFee); $Shipping->setShippingDeliveryFee($deliveryFee->getFee() + $productDeliveryFeeTotal); $Shipping->setShippingDeliveryName($Delivery->getName()); } } $message = $data['message']; $Order->setPayment(NULL); $Order->setPaymentMethod('Amazon Pay'); $Order->setMessage($message); $Order->setCharge(0); $Order->setDeliveryFeeTotal($app['eccube.service.shopping']->getShippingDeliveryFeeTotal($shippings)); // 合計金額の再計算 $Order = $app['eccube.service.shopping']->getAmount($Order); // 受注関連情報を最新状態に更新 $app['orm.em']->flush(); log_info('配送業者変更処理完了', array($Order->getId())); return $app->redirect($app->url('plugin_FgAmazonPay_confirm')); } log_info('配送業者変更入力チェックエラー', array($Order->getId())); return $app->render('FgAmazonPay/Resource/template/index.twig', array( 'form' => $form->createView(), 'Order' => $Order, 'seller_id' => $seller_id, 'client_id' => $client_id, 'widget_url' => $widget_url, 'have_confirm' => $have_confirm, )); } public function confirm(Application $app, Request $request) { $cartService = $app['eccube.service.cart']; // カートチェック if (!$cartService->isLocked()) { // カートが存在しない、カートがロックされていない時はエラー log_info('カートが存在しません'); return $app->redirect($app->url('cart')); } $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); if (!$Order) { log_info('購入処理中の受注情報がないため購入エラー'); $app->addError('front.shopping.order.error'); return $app->redirect($app->url('shopping_error')); } // form作成 $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order); $form = $builder->getForm(); $form->handleRequest($request); $PluginSetting = $app['fg_amazon_pay.repository.fg_amazon_pay_setting']->findOneBy(array(), array('id' => 'desc')); $client_id = $PluginSetting->getClientKey(); $seller_id = $PluginSetting->getSellerKey(); if ($PluginSetting->getIsSandbox()) { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/sandbox/lpa/js/Widgets.js'; } else { $widget_url = 'https://static-fe.payments-amazon.com/OffAmazonPayments/jp/lpa/js/Widgets.js'; } if ($form->isSubmitted()) { $data = $form->getData(); log_info('購入処理開始', array($Order->getId())); $access_key = $PluginSetting->getAccessKey(); $secret_key = $PluginSetting->getSecretKey(); $have_confirm = $PluginSetting->getHaveConfirm(); $config = array( 'merchant_id' => $seller_id, 'access_key' => $access_key, 'secret_key' => $secret_key, 'client_id' => $client_id, 'region' => 'jp', 'sandbox' => $PluginSetting->getIsSandbox(), ); $client = new Client($config); // トランザクション制御 $em = $app['orm.em']; $em->getConnection()->beginTransaction(); try { /*-----------2018-06-11手数料追加start--------*/ $payment = $app['eccube.repository.payment']->find("99"); $Order->setPayment($payment); $Order->setCharge($payment->getCharge()); $Order = $app['eccube.service.shopping']->calculatePrice($Order); $Order->setPaymentMethod('Amazon Pay'); /*-----------2018-06-11手数料追加end--------------*/ $BaseInfo = $app['eccube.repository.base_info']->get(); // お問い合わせ、配送時間などのフォーム項目をセット $app['eccube.service.shopping']->setFormData($Order, $data); $result = $client->setOrderReferenceDetails(array( 'merchant_id' => $seller_id, 'amazon_order_reference_id' => $_POST['order_reference_id'], 'amount' => $Order->getPaymentTotal(), 'currency_code' => 'JPY', 'seller_note' => $PluginSetting->getMailText(), 'seller_order_id' => $Order->getId(), 'store_name' => $BaseInfo->getShopName(), )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('setOrderReferenceDetails() に失敗')); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } $result = $client->confirmOrderReference(array( 'merchant_id' => $seller_id, 'amazon_order_reference_id' => $_POST['order_reference_id'], )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('confirmOrderReference() に失敗')); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } $result = $client->getOrderReferenceDetails(array( 'merchant_id' => $seller_id, 'amazon_order_reference_id' => $_POST['order_reference_id'], )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('getOrderReferenceDetails() に失敗')); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } $destination = $response_values['GetOrderReferenceDetailsResult']['OrderReferenceDetails']['Destination']['PhysicalDestination']; $pref = $app['eccube.repository.master.pref']->findOneBy(array('name' => $destination['StateOrRegion'])); $zip_code = preg_replace('/-/', '', $destination['PostalCode']); if (is_null($Order->getCustomer())) { $Order->setPref($pref); $Order->setZipCode($zip_code); $Order->setZip01(substr($zip_code, 0, 3)); $Order->setZip02(substr($zip_code, 3, 4)); $Order->setAddr01($destination['City'] . $destination['AddressLine1']); if (isset($destination['AddressLine2'])) { $Order->setAddr02($destination['AddressLine2']); } else { $Order->setAddr02(''); } if (preg_match('/^(\d+)-(\d+)-(\d{4})$/', $destination['Phone'], $matches)) { $Order->setTel01($matches[1]); $Order->setTel02($matches[2]); $Order->setTel03($matches[3]); } elseif (preg_match('/^(0[36])-?(\d{4})-?(.*)$/', $destination['Phone'], $matches)) { $Order->setTel01($matches[1]); $Order->setTel02($matches[2]); $Order->setTel03($matches[3]); } elseif (preg_match('/^(\d{3})-?(\d*)-?(\d{4})$/', $destination['Phone'], $matches)) { $Order->setTel01($matches[1]); $Order->setTel02($matches[2]); $Order->setTel03($matches[3]); } else { $Order->setTel01($destination['Phone']); } } /*-----------2018-06-11手数料追加start--------*/ /* $Order->setPayment(null); $Order->setPaymentMethod('Amazon Pay'); $Order->setCharge(0); */ /*-----------2018-06-11手数料追加end--------------*/ foreach ($Order->getShippings() as $shipping) { $shipping->setPref($pref); $shipping->setZipCode($zip_code); $shipping->setZip01(substr($zip_code, 0, 3)); $shipping->setZip02(substr($zip_code, 3, 4)); $shipping->setAddr01($destination['City'] . $destination['AddressLine1']); if (isset($destination['AddressLine2'])) { $shipping->setAddr02($destination['AddressLine2']); } else { $shipping->setAddr02(''); } if (preg_match('/^(\d+)-(\d+)-(\d{4})$/', $destination['Phone'], $matches)) { $shipping->setTel01($matches[1]); $shipping->setTel02($matches[2]); $shipping->setTel03($matches[3]); } elseif (preg_match('/^(0[36])-?(\d{4})-?(.*)$/', $destination['Phone'], $matches)) { $shipping->setTel01($matches[1]); $shipping->setTel02($matches[2]); $shipping->setTel03($matches[3]); } elseif (preg_match('/^(\d{3})-?(\d*)-?(\d{4})$/', $destination['Phone'], $matches)) { $shipping->setTel01($matches[1]); $shipping->setTel02($matches[2]); $shipping->setTel03($matches[3]); } else { $shipping->setTel01($destination['Phone']); } $shipping->setName01($destination['Name']); $shipping->setName02(''); $shipping->setKana01(''); $shipping->setKana02(''); } // オーソリ API 呼び出し $authorization_reference_id = sprintf('%d-%s', $Order->getId(), uniqid()); $result = $client->authorize(array( 'merchant_id' => $seller_id, 'amazon_order_reference_id' => $_POST['order_reference_id'], 'authorization_amount' => $Order->getPaymentTotal(), 'currency_code' => 'JPY', 'transaction_timeout' => 0, 'authorization_reference_id' => $authorization_reference_id, 'capture_now' => false, )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('authorize() に失敗')); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } if ($response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['State'] == 'Declined') { // オーソリ処理で承認がえられなかった場合 if ($response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['ReasonCode'] == 'AmazonRejected' || $response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['ReasonCode'] == 'InvalidPaymentMethod') { $app->addError('オーソリ処理が拒否されました。他のお支払い方法でためして下さい。'); } elseif ($response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['ReasonCode'] == 'TransactionTimedOut' || $response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['ReasonCode'] == 'ProcessingFailure') { $app->addError('オーソリ処理が完了出来ませんでした。しばらく待ってから、もう一度注文してください。'); } else { log_error('Amazon Pay API エラー', array('authorize() 結果ステータスが不明なステータスです')); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } $em->getConnection()->rollback(); return $app->redirect($app->url('plugin_FgAmazonPay_confirm')); } elseif ($response_values['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['State'] == 'Open') { // 購入処理 $app['eccube.service.shopping']->processPurchase($Order); /////////////////////////////////////// /* 注文状態 1:注文処理中(Open) 2:オーソリ済 3:売上請求済 4:返金済 */ $app['db']->insert('dtb_order_amazonpay', array( 'order_id' => $Order->getId(), 'amazon_pay_no' => substr($response_values['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'],0,-8), 'amazon_authorization_id' => $response_values['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'], 'amazon_amount' => $Order->getPaymentTotal(), 'amazon_pay_status' => '2', 'create_date' => date("Y-m-d H:i:s"), 'update_date' => date("Y-m-d H:i:s") )); $TargetOrder = $app['eccube.repository.order']->find($Order->getId()); $TargetOrder->setOrderStatus($app['eccube.repository.order_status']->find($app['config']['order_pre_end']));//仮売上 or 売上 -> 入金済み //$em->flush(); $sale_type = $PluginSetting->getSaleType();//1:仮売上 :売上 if(!$sale_type){ $result = $client->capture(array( 'merchant_id' => $seller_id, 'amazon_authorization_id' => $response_values['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'], 'capture_amount' => $TargetOrder->getPaymentTotal(), 'currency_code' => 'JPY', 'capture_reference_id' => date("Ymd").$Order->getId() )); $response_values = $result->toArray(); if ($response_values['ResponseStatus'] != 200) { log_error('Amazon Pay API エラー', array('capture() に失敗')); log_error('Amazon Pay API エラー', $response_values); throw new AmazonPayApiException('Amazon Pay API の処理に失敗しました'); } } $em->flush(); $em->getConnection()->commit(); $app['db']->update('dtb_order', array( 'payment_id' => '99' ), array( 'order_id' => $Order->getId() )); $em->getConnection()->commit(); /////////////////////////////////////// log_info('購入処理完了', array($Order->getId())); } else { throw new AmazonPayApiException('System Error: オーソリ処理に失敗しました。'); } } catch (AmazonPayApiException $e) { log_error('Amazon Pay API エラー', array($e->getMessage())); $em->getConnection()->rollback(); $app->log($e); $app->addError($e->getMessage()); return $app->redirect($app->url('plugin_FgAmazonPay_confirm')); } catch (ShoppingException $e) { log_error('購入エラー', array($e->getMessage())); $em->getConnection()->rollback(); $app->log($e); $app->addError($e->getMessage()); return $app->redirect($app->url('plugin_FgAmazonPay_confirm')); } catch (\Exception $e) { log_error('予期しないエラー', array($e->getMessage())); $em->getConnection()->rollback(); $app->log($e); $app->addError('front.shopping.system.error'); return $app->redirect($app->url('shopping_error')); } // カート削除 $app['eccube.service.cart']->clear()->save(); // 受注IDをセッションにセット $app['session']->set($this->sessionOrderKey, $Order->getId()); // メール送信 $MailHistory = $app['eccube.service.shopping']->sendOrderMail($Order); // 完了画面表示 return $app->redirect($app->url('shopping_complete')); } log_info('購入チェックエラー', array($Order->getId())); return $app->render('FgAmazonPay/Resource/template/index.twig', array( 'form' => $form->createView(), 'Order' => $Order, 'seller_id' => $seller_id, 'client_id' => $client_id, 'widget_url' => $widget_url, 'have_confirm' => $have_confirm, )); } } |
468 |
投稿日時: 2019/11/28 17:12
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について Pointプラグイン側はポイント利用の値引きをOrderに対して計算してからリダイレクトしているはずなのですが
AmazonPayのプラグイン側でリロード?が起きた後、 最終的に注文番号が1進んでいたりしますか? 何かしらの判定で値引き済みのOrderが破棄されて、 Cartから新しいOrderが作られていないでしょうか? リロードが行われた直後、 データベースのdtb_orderテーブルのレコードはどのようになっていますか?
|
PONK |
投稿日時: 2019/11/28 17:57
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について 株式会社シロハチ様
何度もご助言いただき、ありがとうございます。 dtb_orderテーブルのレコードですが、以下のようになります。 1)カート画面からAmazon Pay決済ボタンをクリックし、Amazonアカウントにログインした上でAmazonPayの購入内容確認画面へ order_id : 455 discunt : 0 payment_method : クレジットカード決済 create_date : 2019-11-28 17:30:56 update_date : 2019-11-28 17:30:56 order_id : 456 discunt : 0 payment_method : Amazon Pay create_date : 2019-11-28 17:30:58 update_date : 2019-11-28 17:30:58 2)ポイント入力画面にてポイントを設定し、AmazonPayの購入内容確認画面へ order_id : 455 discunt : 0 payment_method : クレジットカード決済 create_date : 2019-11-28 17:30:56 update_date : 2019-11-28 17:30:56 order_id : 456 discunt : 500 payment_method : Amazon Pay create_date : 2019-11-28 17:30:58 update_date : 2019-11-28 17:32:41 order_id : 457 discunt : 0 payment_method : クレジットカード決済 create_date : 2019-11-28 17:32:42 update_date : 2019-11-28 17:32:42 order_id : 458 discunt : 0 payment_method : Amazon Pay create_date : 2019-11-28 17:32:44 update_date : 2019-11-28 17:32:45 となります。 Amazon Pay決済プラグインの購入内容確認画面に遷移する度に、決済方法がクレジットカード決済、Amazon Payの順に登録されております。 クレジットカード決済が頭になっているのは、決済方法の1番目がクレジットカード決済となっているためだと思われます。 上記の場合、ポイント設定直後には order_id:456 にて discount が設定した 500 に更新され正しい挙動を示しておりますが、その直後に新たに2レコード登録されてしまっております。 上記(1)の初回AmazonPayの購入内容確認画面はURLがGETパラメータの付いたものとなっておりますが、ポイントプラグインからAmazonPayの購入内容確認画面に戻る際の return $app->redirect($app->url('shopping')); から書き換えた return $app->redirect($app->url('plugin_FgAmazonPay_index')); ではパラメータを渡せていない事が原因なのでしょうか? 再度お知恵をお貸しいただけますと幸いです。 |
468 |
投稿日時: 2019/11/28 19:23
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について ご提示いただいたデータのorder_id:456のstatusはどのようになっていますか?
もしかして決済処理中になっていますか? FgAmazonPayController function index()内の // 登録済みの受注情報を取得 $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); の箇所は購入処理中のデータを対象に取り出す為、ステータスが他の状態に変わっていると新しく受注データを作り出すのではないかと思います。 ただ、AmazonPayのプラグイン側で毎回2レコード作られているのが よく分からない仕様ですね。
|
PONK |
投稿日時: 2019/11/28 20:37
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について order_id:455
order_id:456 order_id:457 order_id:458 全て status は 8 となっており、購入処理中です。 FgAmazonPayController function index()内の // 登録済みの受注情報を取得 $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); の箇所は $cartService = $app['eccube.service.cart']; $cartService->lock(); の前だと$Orderに値が入っていますが、 $cartService = $app['eccube.service.cart']; $cartService->lock(); の後だと$Orderはnullになっています。 このあたりが怪しいような気もしているのですが、分かりません。 |
468 |
投稿日時: 2019/11/29 10:02
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について $cartService->lock();
の処理でセッション内のカートのPreOrderIdにnullをセットしていますので $this->cart ->setLock(true) ->setPreOrderId(null); それが原因で $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); でOrderが取り出せず、新規作成されているようです。 ShoppingController->index()には $cartService = $app['eccube.service.cart']; $cartService->lock(); $cartService->save(); の記述はありませんので (ShoppingControllerの遷移前にCartController->buystepで処理済み) この処理が原因のようです。 ただ、この記述があるという事はプラグインの想定した遷移に カートを経由せずにAmazonPayの注文確認画面に遷移する流れがあるという事でしょうか? (例えば商品詳細画面にAmazonPayで購入ボタンが追加される等)
|
PONK |
投稿日時: 2019/11/29 10:32
対応状況: −−−
|
半人前 登録日: 2019/11/15 居住地: 投稿: 16 |
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について $cartService->lock();
の処理でセッション内のカートのPreOrderIdにnullをセットしているということは毎回 // 初回アクセス(受注情報がない)の場合は, 受注情報を作成 if (is_null($Order)) { に条件分岐しているという事ですね。 $cartService = $app['eccube.service.cart']; $cartService->lock(); $cartService->save(); より前に $pointDiscount = $app['eccube.service.shopping']->getOrder($app['config']['order_processing'])->getDiscount(); で値引き額を取得した上で、 // 初回アクセス(受注情報がない)の場合は, 受注情報を作成 if (is_null($Order)) { 内で $Order->setDiscount($pointDiscount); してみましたが、上手くいきませんでした。 カートを経由せずにAmazonPayの注文確認画面に遷移する流れは、こちらで確認する限りありません。 以下が event.yml となります。 eccube.event.render.cart.before: - [onRenderCartIndexBefore, FIRST] Admin/Order/index.twig: - [onAdminOrderIndexRender, NORMAL] Admin/Product/product.twig: - [onAdminProductProductRender, NORMAL] admin.product.edit.initialize: - [onAdminProductEditInitialize, NORMAL] admin.product.edit.complete: - [onAdminProductEditComplete, NORMAL] Mypage/login.twig: - [onLoginIndexBefore, NORMAL] eccube.event.render.shopping.before: - [onRenderShoppingIndexBefore, NORMAL] event.ymlを見る限りフロントまわりでは、カートと商品購入確認画面とマイページに介入しているようです。 AmazonPay決済プラグインに商品詳細画面にAmazonPayで購入ボタンが追加される機能があっても使用しませんので、 ShoppingController->index()と同じように $cartService = $app['eccube.service.cart']; $cartService->lock(); $cartService->save(); の記述を外す事も試したのですが、単純に外すだけだとエラーが発生します。 |
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |