Skip to content
Code-Schnipsel Gruppen Projekte
Commit 66e396ba erstellt von Patrick Müller's avatar Patrick Müller
Dateien durchsuchen

feat: recurring payments (temp commit)

Übergeordneter 3ae38d99
No related branches found
No related tags found
Keine zugehörigen Merge Requests gefunden
werden angezeigt mit 2190 Ergänzungen und 49 Löschungen
<?php
use QUI\ERP\Order\Handler;
use QUI\ERP\Payments\Amazon\Recurring\BillingAgreements;
use QUI\ERP\Payments\Amazon\AmazonPayException;
use QUI\Utils\Security\Orthos;
/**
* Create / set up a billing agreement with Amazon Pay
*
* @param string $billingAgreementId - Amazon BillingAgreementId; if false try to retrieve from Order
* @param string $orderHash - Unique order hash to identify Order
* @return bool - success
* @throws AmazonPayException
*/
QUI::$Ajax->registerFunction(
'package_quiqqer_payment-amazon_ajax_recurring_createBillingAgreement',
function ($billingAgreementId, $orderHash) {
$orderHash = Orthos::clear($orderHash);
try {
$Order = Handler::getInstance()->getOrderByHash($orderHash);
BillingAgreements::setBillingAgreementDetails(Orthos::clear($billingAgreementId), $Order);
BillingAgreements::confirmBillingAgreement($Order);
BillingAgreements::validateBillingAgreement($Order);
} catch (AmazonPayException $Exception) {
QUI\System\Log::writeDebugException($Exception);
throw $Exception;
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
return false;
}
return true;
},
['billingAgreementId', 'orderHash']
);
......@@ -53,6 +53,11 @@ $GoToStep = new OrderProcessStepPayments([
'Order' => $Order
]);
\QUI\System\Log::writeRecursive($_REQUEST);
// Differentiate between standard order and recurring payment
if ($_REQUEST['AuthenticationStatus'] === 'Success') {
// If the SCA was successful -> Authorize the Order
try {
......
[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"] > .qui-loader {
z-index: 1000 !important;
}
.quiqqer-payment-paypal-recurring-paymentdisplay-btn {
background: #ffc439;
color: #111;
}
.fa-paypal {
font-family: FontAwesome, "Font Awesome 5 Brands";
}
.fa-paypal:before {
content: "\f1ed";
}
\ No newline at end of file
Dieser Diff ist reduziert.
<?xml version="1.0" encoding="UTF-8"?>
<database>
<global>
<table name="amazon_billing_agreements">
<field type="VARCHAR(255) NOT NULL">amazon_agreement_id</field>
<field type="MEDIUMTEXT NOT NULL">customer</field>
<field type="VARCHAR(250) NULL DEFAULT NULL">global_process_id</field>
<field type="TINYINT(1) NOT NULL DEFAULT 1">active</field>
<primary>amazon_agreement_id</primary>
<index>global_process_id</index>
</table>
<table name="amazon_billing_agreement_transactions">
<field type="VARCHAR(255) NOT NULL">amazon_transaction_id</field>
<field type="VARCHAR(255) NOT NULL">amazon_agreement_id</field>
<field type="MEDIUMTEXT NOT NULL">amazon_transaction_data</field>
<field type="DATETIME NOT NULL">amazon_transaction_date</field>
<field type="VARCHAR(255) NULL">quiqqer_transaction_id</field>
<field type="TINYINT(1) NOT NULL DEFAULT 0">quiqqer_transaction_completed</field>
<field type="VARCHAR(250) NOT NULL">global_process_id</field>
<primary>amazon_transaction_id,amazon_transaction_date</primary>
</table>
</global>
</database>
\ No newline at end of file
......@@ -21,6 +21,15 @@
<de><![CDATA[Komfortable Bezahlung mit ihrem Amazon-Konto.]]></de>
<en><![CDATA[Comfortable payment with your Amazon account.]]></en>
</locale>
<locale name="payment.recurring.title">
<de><![CDATA[Amazon Pay - Wiederkehrende Zahlungen]]></de>
<en><![CDATA[Amazon Pay - Recurring payments]]></en>
</locale>
<locale name="payment.recurring.description">
<de><![CDATA[Komfortable Bezahlung mit ihrem Amazon-Konto.]]></de>
<en><![CDATA[Comfortable payment with your Amazon account.]]></en>
</locale>
<locale name="payment.step.title">
<de><![CDATA[Bezahlung mit Amazon]]></de>
<en><![CDATA[Payment with Amazon]]></en>
......@@ -258,6 +267,34 @@
<en><![CDATA[The payment process with Amazon was not successful. Your chosen payment method was not debited. Please try again or choose another payment method.]]></en>
</locale>
<!-- BillingAgreements -->
<locale name="recurring.BillingAgreement.seller_note">
<de><![CDATA[Ihre Abonnement aus Bestellung [orderId] auf [url]]]></de>
<en><![CDATA[Your subscription from order [orderId] at [url]]]></en>
</locale>
<!-- BillingAgreements -->
<locale name="history.BillingAgreement.set_details">
<de><![CDATA[Amazon Pay :: Details für wiederkehrende Zahlung festgelegt (Amazon BillingAgreement ID: [billingAgreementId])]]></de>
<en><![CDATA[Amazon Pay :: Details for recurring payment set (Amazon BillingAgreement ID: [billingAgreementId])]]></en>
</locale>
<locale name="history.BillingAgreement.confirm_billing_agreement">
<de><![CDATA[Amazon Pay :: Wiederkehrende Zahlung eingerichtet]]></de>
<en><![CDATA[Amazon Pay :: Recurring payment set up]]></en>
</locale>
<locale name="history.BillingAgreement.confirm_billing_agreement_error">
<de><![CDATA[Amazon Pay :: Wiederkehrende Zahlung konnte nicht eingerichtet werden]]></de>
<en><![CDATA[Amazon Pay :: Recurring payment could not be set up]]></en>
</locale>
<locale name="history.BillingAgreement.validate_billing_agreement">
<de><![CDATA[Amazon Pay :: Wiederkehrende Zahlung validiert; das Amazon-Konto des Kunden kann nun für wiederkehrende Zahlungen verwendet werden]]></de>
<en><![CDATA[Amazon Pay :: Recurring payment validated; the Amazon account of the customer is now usable for recurring payments]]></en>
</locale>
<locale name="history.BillingAgreement.billing_agreement_not_validated">
<de><![CDATA[Amazon Pay :: Wiederkehrende Zahlung konnte nicht validiert werden]]></de>
<en><![CDATA[Amazon Pay :: Recurring payment could not be validated]]></en>
</locale>
</groups>
<groups name="quiqqer/payment-amazon" datatype="js">
......@@ -303,6 +340,12 @@
<de><![CDATA[Beim Bezahlungsvorgang mit Amazon Pay ist ein Fehler aufgetreten. Die Zahlung konnte nicht durchgeführt werden. Ihre ausgewählte Zahlungsweise wurde nicht belastet. Bitte wählen Sie eine andere Zahlungsweise.]]></de>
<en><![CDATA[An error occurred while paying with Amazon Pay. The payment could not be processed. Your selected payment method has not been charged. Please choose a different payment method.]]></en>
</locale>
<!-- Control: recurring/PaymentDisplay -->
<locale name="controls.recurring.PaymentDisplay.consent_denied">
<de><![CDATA[Sie haben die Genehmigung für eine wiederkehrende Zahlung mit Ihrem Amazon Pay Konto nicht erteilt. Bitte wiederholen Sie den Vorgang und erteilen Sie die Genehmigung oder wählen Sie eine andere Zahlungsmethode.]]></de>
<en><![CDATA[You have not given permission for a recurring payment with your Amazon Pay account. Please repeat the process and give approval or choose another payment method.]]></en>
</locale>
</groups>
</locales>
......@@ -58,7 +58,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
*
* @var AmazonPayClient
*/
protected $AmazonPayClient = null;
protected static $AmazonPayClient = null;
/**
* Current Order that is being processed
......@@ -148,7 +148,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
*/
public function executeGatewayPayment(QUI\ERP\Accounting\Payments\Gateway\Gateway $Gateway)
{
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
$Order = $Gateway->getOrder();
$Order->addHistory('Amazon Pay :: Check if payment from Amazon was successful');
......@@ -316,7 +316,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
return;
}
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
// Re-confirm Order after previously declined Authorization because of "InvalidPaymentMethod"
if ($reConfirm) {
......@@ -377,8 +377,8 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
$AmazonPay->confirmOrderReference([
'amazon_order_reference_id' => $orderReferenceId,
'success_url' => $this->getSuccessUrl($Order),
'failure_url' => $this->getFailureUrl($Order)
'success_url' => Utils::getSuccessUrl($Order),
'failure_url' => Utils::getFailureUrl($Order)
]);
$Order->setPaymentData(self::ATTR_ORDER_REFERENCE_SET, true);
......@@ -407,7 +407,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
return;
}
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
$PriceCalculation = $Order->getPriceCalculation();
$orderReferenceId = $Order->getPaymentDataEntry(self::ATTR_AMAZON_ORDER_REFERENCE_ID);
......@@ -561,7 +561,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
return;
}
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
$orderReferenceId = $Order->getPaymentDataEntry(self::ATTR_AMAZON_ORDER_REFERENCE_ID);
if (empty($orderReferenceId)) {
......@@ -712,7 +712,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
$RefundTransaction->pending();
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
$AmountValue = new QUI\ERP\Accounting\CalculationValue($amount, $Transaction->getCurrency(), 2);
$sum = $AmountValue->get();
$refundReferenceId = $this->generateRefundReferenceId($RefundTransaction);
......@@ -830,7 +830,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
*/
protected function closeOrderReference(AbstractOrder $Order, $reason = null)
{
$AmazonPay = $this->getAmazonPayClient();
$AmazonPay = self::getAmazonPayClient();
$orderReferenceId = $Order->getPaymentDataEntry(self::ATTR_AMAZON_ORDER_REFERENCE_ID);
$AmazonPay->closeOrderReference([
......@@ -1058,14 +1058,15 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
* Get Amazon Pay Client for current payment process
*
* @return AmazonPayClient
* @throws \Exception
*/
protected function getAmazonPayClient()
public static function getAmazonPayClient()
{
if (!is_null($this->AmazonPayClient)) {
return $this->AmazonPayClient;
if (!is_null(self::$AmazonPayClient)) {
return self::$AmazonPayClient;
}
$this->AmazonPayClient = new AmazonPayClient([
self::$AmazonPayClient = new AmazonPayClient([
'merchant_id' => Provider::getApiSetting('merchant_id'),
'access_key' => Provider::getApiSetting('access_key'),
'secret_key' => Provider::getApiSetting('secret_key'),
......@@ -1074,7 +1075,7 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
'region' => Provider::getApiSetting('region')
]);
return $this->AmazonPayClient;
return self::$AmazonPayClient;
}
/**
......@@ -1099,33 +1100,6 @@ class Payment extends QUI\ERP\Accounting\Payments\Api\AbstractPayment implements
$Process->addHistory('Amazon Pay :: '.$message);
}
/**
* Get confirmation flow success url
*
* @param AbstractOrder $Order
* @return string
*/
protected function getSuccessUrl(AbstractOrder $Order)
{
return Payments::getInstance()->getHost().
URL_OPT_DIR.
'quiqqer/payment-amazon/bin/confirmation.php?hash='.$Order->getHash();
}
/**
* Get confirmation flow error url
*
* @param AbstractOrder $Order
* @return string
*/
protected function getFailureUrl(AbstractOrder $Order)
{
return Payments::getInstance()->getHost().
URL_OPT_DIR.
'quiqqer/payment-amazon/bin/confirmation.php?hash='.$Order->getHash().'&error=1';
}
/**
* @param int $id
* @return OrderProcessMessage
......
<?php
/**
* This file contains QUI\ERP\Payments\Amazon\Provider
*/
namespace QUI\ERP\Payments\Amazon;
use QUI;
use QUI\ERP\Accounting\Payments\Api\AbstractPaymentProvider;
use QUI\ERP\Payments\Amazon\Recurring\Payment as PaymentRecurring;
/**
* Class Provider
......@@ -22,7 +19,8 @@ class Provider extends AbstractPaymentProvider
public function getPaymentTypes()
{
return [
Payment::class
Payment::class,
PaymentRecurring::class
];
}
......@@ -112,9 +110,9 @@ class Provider extends AbstractPaymentProvider
if (empty($v)) {
QUI\System\Log::addError(
'Your Amazon Pay API credentials seem to be (partially) missing.'
. ' Amazon Pay CAN NOT be used at the moment. Please enter all your'
. ' API credentials. See https://dev.quiqqer.com/quiqqer/payment-amazon/wikis/api-configuration'
. ' for further instructions.'
.' Amazon Pay CAN NOT be used at the moment. Please enter all your'
.' API credentials. See https://dev.quiqqer.com/quiqqer/payment-amazon/wikis/api-configuration'
.' for further instructions.'
);
return false;
......
Dieser Diff ist reduziert.
<?php
namespace QUI\ERP\Payments\Amazon\Recurring;
use QUI;
use QUI\ERP\Accounting\Invoice\Invoice;
use QUI\ERP\Accounting\Payments\Types\RecurringPaymentInterface;
use QUI\ERP\Order\AbstractOrder;
use QUI\ERP\Payments\Amazon\Payment as BasePayment;
class Payment extends BasePayment implements RecurringPaymentInterface
{
/**
* Amazon API Order attributes for recurring payments
*/
const ATTR_AMAZON_BILLING_AGREEMENT_ID = 'amazon-AmazonBillingAgreementId';
const ATTR_AMAZON_BILLING_AGREEMENT_CONFIRMED = 'amazon-AmazonBillingAgreementConfirmed';
const ATTR_AMAZON_BILLING_AGREEMENT_VALIDATED = 'amazon-AmazonBillingAgreementValidated';
/**
* @return string
*/
public function getTitle()
{
return $this->getLocale()->get('quiqqer/payment-amazon', 'payment.recurring.title');
}
/**
* @return string
*/
public function getDescription()
{
return $this->getLocale()->get('quiqqer/payment-amazon', 'payment.recurring.description');
}
/**
* If the Payment method is a payment gateway, it can return a gateway display
*
* @param AbstractOrder $Order
* @param QUI\ERP\Order\Controls\OrderProcess\Processing $Step
* @return string
*
* @throws QUI\Exception
*/
public function getGatewayDisplay(AbstractOrder $Order, $Step = null)
{
$Control = new PaymentDisplay();
$Control->setAttribute('Order', $Order);
$Control->setAttribute('Payment', $this);
$Step->setTitle(
QUI::getLocale()->get(
'quiqqer/payment-amazon',
'payment.step.title'
)
);
$Engine = QUI::getTemplateManager()->getEngine();
$Step->setContent($Engine->fetch(dirname(__FILE__, 2).'/PaymentDisplay.Header.html'));
return $Control->create();
}
/**
* Does the payment ONLY support recurring payments (e.g. for subscriptions)?
*
* @return bool
*/
public function supportsRecurringPaymentsOnly()
{
return true;
}
/**
* Create a Scubscription from a (temporary) Order
*
* @param AbstractOrder $Order
* @return void
*/
public function createSubscription(AbstractOrder $Order)
{
// There is no need to create a BillingAgreement here since this
// is done in the frontend via the Amazon BillingAgreement consent widget
}
/**
* Capture subscription amount based on an Invoice
*
* @param Invoice $Invoice
* @return void
*/
public function captureSubscription(Invoice $Invoice)
{
// TODO: Implement captureSubscription() method.
}
/**
* Cancel a Subscription
*
* @param int|string $subscriptionId
* @param string $reason (optional) - The reason why the subscription is cancelled
* @return void
*/
public function cancelSubscription($subscriptionId, $reason = '')
{
// TODO: Implement cancelSubscription() method.
}
/**
* Sets a subscription as inactive (on the side of this QUIQQER system only!)
*
* IMPORTANT: This does NOT mean that the corresponding subscription at the payment provider
* side is cancelled. If you want to do this please use cancelSubscription() !
*
* @param $subscriptionId
* @return void
*/
public function setSubscriptionAsInactive($subscriptionId)
{
// TODO: Implement setSubscriptionAsInactive() method.
}
/**
* Can the Subscription of this payment method be edited
* regarding essential data like invoice frequency, amount etc.?
*
* @return bool
*/
public function isSubscriptionEditable()
{
// TODO: Implement isSubscriptionEditable() method.
}
/**
* Check if a Subscription is associated with an order and
* return its ID (= identification at the payment method side; e.g. PayPal)
*
* @param AbstractOrder $Order
* @return int|string|false - ID or false of no ID associated
*/
public function getSubscriptionIdByOrder(AbstractOrder $Order)
{
// TODO: Implement getSubscriptionIdByOrder() method.
}
/**
* Checks if the subscription is active at the payment provider side
*
* @param string|int $subscriptionId
* @return bool
*/
public function isSubscriptionActiveAtPaymentProvider($subscriptionId)
{
// TODO: Implement isSubscriptionActiveAtPaymentProvider() method.
}
/**
* Checks if the subscription is active at QUIQQER
*
* @param string|int $subscriptionId - Payment provider subscription ID
* @return bool
*/
public function isSubscriptionActiveAtQuiqqer($subscriptionId)
{
// TODO: Implement isSubscriptionActiveAtQuiqqer() method.
}
/**
* Get IDs of all subscriptions
*
* @param bool $includeInactive (optional) - Include inactive subscriptions [default: false]
* @return int[]
*/
public function getSubscriptionIds($includeInactive = false)
{
// TODO: Implement getSubscriptionIds() method.
}
/**
* Get global processing ID of a subscription
*
* @param string|int $subscriptionId
* @return string|false
*/
public function getSubscriptionGlobalProcessingId($subscriptionId)
{
// TODO: Implement getSubscriptionGlobalProcessingId() method.
}
}
.quiqqer-payment-amazon-content {
float: left;
width: 100%;
}
.quiqqer-payment-amazon-btn-elm {
margin-top: 35px;
text-align: center;
}
.quiqqer-payment-amazon-btn-elm img {
max-width: 100% !important;
}
#quiqqer-payment-amazon-wallet {
margin: 35px auto 0 auto;
min-width: 300px;
max-width: 600px;
min-height: 228px;
height: 240px;
max-height: 400px;
}
#quiqqer-payment-amazon-consent {
margin: 35px auto 0 auto;
min-width: 300px;
max-width: 600px;
min-height: 228px;
height: 240px;
max-height: 400px;
}
#quiqqer-payment-amazon-btn-pay {
margin: 50px 0 0 0;
text-align: right;
}
.quiqqer-payment-amazon__hidden {
display: none !important;
}
\ No newline at end of file
<noscript>
<p>{locale group="quiqqer/payment-amazon" var="PaymentDisplay.no_javascript"}</p>
</noscript>
{if !$apiSetUp}
<p class="message-error">
{locale group="quiqqer/payment-amazon" var="controls.PaymentDisplay.configuration_error"}
</p>
{else}
<div class="quiqqer-payment-amazon-message"></div>
<div class="quiqqer-payment-amazon-content">
<div id="quiqqer-payment-amazon-btn" class="quiqqer-payment-amazon-btn-elm" data-size="{$btn_size}" data-color="{$btn_color}"></div>
<div id="quiqqer-payment-amazon-wallet" class="quiqqer-payment-amazon__hidden"></div>
<div id="quiqqer-payment-amazon-consent" class="quiqqer-payment-amazon__hidden"></div>
<div id="quiqqer-payment-amazon-btn-pay"
data-price="{$display_price}"
data-currencycode="{$currency_code}"
>
</div>
</div>
{/if}
\ No newline at end of file
<?php
namespace QUI\ERP\Payments\Amazon\Recurring;
use QUI;
use QUI\ERP\Payments\Amazon\Provider;
/**
* Class PaymentDisplay
*
* Display PayPal Billing payment process
*/
class PaymentDisplay extends QUI\Control
{
/**
* Constructor
*
* @param array $attributes
* @throws QUI\ERP\Order\ProcessingException
*/
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->setJavaScriptControl('package/quiqqer/payment-amazon/bin/controls/recurring/PaymentDisplay');
$this->addCSSFile(dirname(__FILE__).'/PaymentDisplay.css');
$this->setJavaScriptControlOption('sandbox', boolval(Provider::getApiSetting('sandbox')));
$this->setJavaScriptControlOption('sellerid', Provider::getApiSetting('merchant_id'));
$this->setJavaScriptControlOption('clientid', Provider::getApiSetting('client_id'));
}
/**
* Return the body of the control
* Here you can integrate the payment form, or forwarding functionality to the gateway
*
* @return string
* @throws QUI\Exception
*/
public function getBody()
{
$Engine = QUI::getTemplateManager()->getEngine();
/* @var $Order QUI\ERP\Order\OrderInProcess */
$Order = $this->getAttribute('Order');
$PriceCalculation = $Order->getPriceCalculation();
$Engine->assign([
'btn_size' => Provider::getWidgetsSetting('btn_size'),
'btn_color' => Provider::getWidgetsSetting('btn_color'),
'display_price' => $PriceCalculation->getSum()->formatted(),
'apiSetUp' => Provider::isApiSetUp(),
'currency_code' => $Order->getCurrency()->getCode()
]);
$this->setJavaScriptControlOption('orderhash', $Order->getHash());
// Check if an Amazon Pay authorization already exists (i.e. Order is successful / can be processed)
$this->setJavaScriptControlOption('successful', $Order->isSuccessful());
return $Engine->fetch(dirname(__FILE__).'/PaymentDisplay.html');
}
}
<?php
namespace QUI\ERP\Payments\Amazon;
use QUI;
use QUI\ERP\Accounting\CalculationValue;
use QUI\ERP\Accounting\Payments\Payments;
use QUI\ERP\Order\AbstractOrder;
use QUI\ERP\Shipping\Shipping;
/**
* Class Utils
*
* Utility methods for quiqqer/payment-amazon
*/
class Utils
{
/**
* Get base URL (with host) for current Project
*
* @return string
*/
public static function getProjectUrl()
{
try {
$url = QUI::getRewrite()->getProject()->get(1)->getUrlRewrittenWithHost();
$url = \str_replace(['http://', 'https://'], '', $url); // remove protocol
return rtrim($url, '/');
} catch (\Exception $Exception) {
QUI\System\Log::writeDebugException($Exception);
return '';
}
}
/**
* Save Order with SystemUser
*
* @param AbstractOrder $Order
* @return void
*/
public static function saveOrder(AbstractOrder $Order)
{
$Order->update(QUI::getUsers()->getSystemUser());
}
/**
* Get translated history text
*
* @param string $context
* @param array $data (optional) - Additional data for translation
* @return string
*/
public static function getHistoryText(string $context, $data = [])
{
return QUI::getLocale()->get('quiqqer/payment-amazon', 'history.'.$context, $data);
}
/**
* Get confirmation flow success url
*
* @param AbstractOrder $Order
* @return string
*/
public static function getSuccessUrl(AbstractOrder $Order)
{
return Payments::getInstance()->getHost().
URL_OPT_DIR.
'quiqqer/payment-amazon/bin/confirmation.php?hash='.$Order->getHash();
}
/**
* Get confirmation flow error url
*
* @param AbstractOrder $Order
* @return string
*/
public static function getFailureUrl(AbstractOrder $Order)
{
return Payments::getInstance()->getHost().
URL_OPT_DIR.
'quiqqer/payment-amazon/bin/confirmation.php?hash='.$Order->getHash().'&error=1';
}
}
0% oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren