Сохранение как заказ, когда транзакция PayPal отменена пользователем
-
28-09-2020 - |
Вопрос
Как сохранить заказ в таблице заказов в любом состоянии при отмене платежа через стандарт PayPal.
Решение
Потратив на это несколько часов, я впервые узнал, что magento 1.9 включает в себя PayPal Express наряду со стандартом PayPal.поэтому, проясняя это, я просто деактивировал экспресс через изменения sql и перезапись блоков (имея в виду некоторый Внешние источники).Возвращаясь к тому моменту, нам нужно переопределить действие отмены PayPal.Это может получить наблюдатель sales_order_payment_cancel
, остальные приведенные ниже коды также объясняют другой процесс.Надеюсь, это кому-то поможет.
локальный/Stackoverflow/Paypalstandard/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Stackoverflow_Paypalstandard>
<version>0.1.0</version>
</Stackoverflow_Paypalstandard>
</modules>
<global>
<models>
<custom_paypalstandard>
<class>Stackoverflow_Paypalstandard_Model</class>
</custom_paypalstandard>
</models>
<blocks>
<custom_paypalstandard>
<class>Stackoverflow_Paypalstandard_Block</class>
</custom_paypalstandard>
<paypal>
<rewrite>
<standard_redirect>Stackoverflow_Paypalstandard_Block_Standard_Redirect</standard_redirect>
<adminhtml_system_config_fieldset_location>Stackoverflow_Paypalstandard_Block_Adminhtml_System_Config_Fieldset_Location</adminhtml_system_config_fieldset_location>
</rewrite>
</paypal>
</blocks>
<events>
<sales_order_payment_cancel>
<observers>
<after_placing_order>
<class>custom_paypalstandard/observer</class>
<method>implementOrderStatus</method>
</after_placing_order>
</observers>
</sales_order_payment_cancel>
</events>
</global>
</config>
локальный/Stackoverflow/Paypalstandard/Block/Adminhtml/System/Config/Fieldset/Location.php
Это часть отмены активации PayPal Express. Для этого см. Некоторый связь.
локальный/Stackoverflow/Paypalstandard/Блокировать/Standard/Redirect.php
class Stackoverflow_Paypalstandard_Block_Standard_Redirect extends Mage_Paypal_Block_Standard_Redirect
{
public function _toHtml()
{
$standard = Mage::getModel('paypal/standard');
$form = new Varien_Data_Form();
$form->setAction($standard->getConfig()->getPaypalUrl())
->setId('paypal_standard_checkout')
->setName('paypal_standard_checkout')
->setMethod('POST')
->setUseContainer(true);
foreach ($standard->getStandardCheckoutFormFields() as $field=>$value) {
$form->addField($field, 'hidden', array('name'=>$field, 'value'=>$value));
}
$idSuffix = Mage::helper('core')->uniqHash();
$submitButton = new Varien_Data_Form_Element_Submit(array(
'value' => $this->__('Click here if you are not redirected within 10 seconds...'),
));
$id = "submit_to_paypal_button_{$idSuffix}";
$submitButton->setId($id);
$form->addElement($submitButton);
$html = '<html><body>';
$html.= $this->__('You will be redirected to the PayPal website in a few seconds.');
$html.= $form->toHtml();
$html.= '<script type="text/javascript">document.getElementById("paypal_standard_checkout").submit();</script>';
$html.= '</body></html>';
return $html;
}
}
локальный/Stackoverflow/Paypalstandard/Model/Observer.php
class Stackoverflow_Paypalstandard_Model_Observer
{
public function implementOrderStatus($observer)
{
$payment = $observer->getEvent()->getPayment();
$order = $payment->getOrder();
$order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);
$orderIds = Mage::getSingleton('adminhtml/session')->getNonCancelledOrders();
if (!$orderIds) {
$orderIds = array($order->getId());
} else {
$orderIds[] = $order->getId();
}
Mage::getSingleton('adminhtml/session')->setNonCancelledOrders($orderIds);
}
}
и т. д./модули/Stackoverflow_Paypalstandard.xml
<config>
<modules>
<Stackoverflow_Paypalstandard>
<active>true</active>
<codePool>local</codePool>
</Stackoverflow_Paypalstandard>
</modules>
</config>