バージョン選択

フォーラム

メニュー

オンライン状況

95 人のユーザが現在オンラインです。 (67 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 95
もっと...

サイト内検索

質問 > フロント機能 > Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
PONK
投稿日時: 2019/11/21 16:15
対応状況: −−−
新米
登録日: 2019/11/15
居住地:
投稿: 9
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
居住地:
投稿: 1918
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について
Pointプラグインの
/Controller/FrontPointController.php function usePoint()内に
$app['monolog.point']->addInfo('usePoint end');

return $app->redirect($app->url('shopping'));

のような記述があるかと思います。

return $app->redirect($app->url('shopping'));
↑の記述でルーティング「shopping」を指定して
EC-CUBE本体の確認画面(/shopping)に遷移させています。

ここの部分をAmazonPay決済プラグインの注文内容の確認画面のルーティングを指定すれば良いのではないかと思います。
ルーティング名はAmazonPay決済プラグイン側で指定されているのと思いますので
ご自身で調べていただく必要があるかと思います。

多分、ルーティングはプラグイン内のServiceProviderで定義していると思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

PONK
投稿日時: 2019/11/26 17:29
対応状況: −−−
新米
登録日: 2019/11/15
居住地:
投稿: 9
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
居住地:
投稿: 9
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
居住地:
投稿: 1918
Re: Pointプラグイン(Point 1.0.0)とAmazon Pay 決済プラグイン(FgAmazonPay 2.0.0)の共存について
Pointプラグイン側はポイント利用の値引きをOrderに対して計算してからリダイレクトしているはずなのですが
AmazonPayのプラグイン側でリロード?が起きた後、
最終的に注文番号が1進んでいたりしますか?

何かしらの判定で値引き済みのOrderが破棄されて、
Cartから新しいOrderが作られていないでしょうか?

リロードが行われた直後、
データベースのdtb_orderテーブルのレコードはどのようになっていますか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

PONK
投稿日時: 2019/11/28 17:57
対応状況: −−−
新米
登録日: 2019/11/15
居住地:
投稿: 9
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
居住地:
投稿: 1918
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レコード作られているのが
よく分からない仕様ですね。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

PONK
投稿日時: 2019/11/28 20:37
対応状況: −−−
新米
登録日: 2019/11/15
居住地:
投稿: 9
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
居住地:
投稿: 1918
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で購入ボタンが追加される等)


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

PONK
投稿日時: 2019/11/29 10:32
対応状況: −−−
新米
登録日: 2019/11/15
居住地:
投稿: 9
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 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は54,400名です
総投稿数は94,215件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
2015
4
468
1918
5
yuh
1610
6
umebius
1414
7
red
1376
8
h_tanaka
940
9
fukap
907
10
tsuji
856
11
shutta
835
12 ramrun 789
13
tao_s
781
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
483
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.