Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

PayPal IPN в Opencart 2 через посредника


Recommended Posts

Здравствуйте!

Тут вот какое дело)

 

Решил принимать paypal. Всё было бы радостно, но в Украине нельзя принять деньги на себя. И тут нашёл посредника, деньги уходят на его аккаунт, а потом он по CUSTOM сортирует их по пользователям в его системе.

 

Отредактировал catalog/controller/payment/pp_standard.php

Где и поместил свой CUSTOM:

 

$data['custom'] = 'мойкастом';

 

Посредник даёт возможность воспользоваться услугой уведомления и просит ссылку для IPN.

 

Изменил ссылку notify_url:

 

Было:

$data['notify_url'] = $this->url->link('payment/pp_standard/callback', '', 'SSL');

 

Стало:

$data['notify_url'] = $this->url->link('index.php?route=payment/pp_standard/callback', '', 'SSL')

 

Дал ему ссылку для IPN - http://мой.сайт/index.php?route=payment/pp_standard/callback

Ссылка открывается, на 404 не выкидывает.

 

Провожу платёж, деньги к нему пришли и я их получаю в его системе. Но, ipn не срабатывает, хотя и вижу на сайте посредника отчёт о доставке оповещения мне на указанный notify_url с ответом сервера 200.

 

Изменение статуса заказов в платёжном модуле PayPal стандартные платежи - сделал.

 

Но, не меняет статус заказа :ugeek:

 

Затаилась у меня мыслЯ, что в catalog/controller/payment/pp_standard.php лежит ответ.

 

class ControllerPaymentPPStandard extends Controller {
public function index() {
$this->language->load('payment/pp_standard');

$data['text_testmode'] = $this->language->get('text_testmode');
$data['button_confirm'] = $this->language->get('button_confirm');

$data['testmode'] = $this->config->get('pp_standard_test');

if (!$this->config->get('pp_standard_test')) {
$data['action'] = 'https://www.paypal.com/cgi-bin/webscr';
} else {
$data['action'] = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
}

$this->load->model('checkout/order');

$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);

if ($order_info) {
$data['business'] = $this->config->get('pp_standard_email');
$data['item_name'] = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');

$data['products'] = array();

foreach ($this->cart->getProducts() as $product) {
$option_data = array();

foreach ($product['option'] as $option) {
if ($option['type'] != 'file') {
$value = $option['value'];
} else {
$upload_info = $this->model_tool_upload->getUploadByCode($option['value']);

if ($upload_info) {
$value = $upload_info['name'];
} else {
$value = '';
}
}

$option_data[] = array(
'name' => $option['name'],
'value' => (utf8_strlen($value) > 20 ? utf8_substr($value, 0, 20) . '..' : $value)
);
}

$data['products'][] = array(
'name' => htmlspecialchars($product['name']),
'model' => htmlspecialchars($product['model']),
'price' => $this->currency->format($product['price'], $order_info['currency_code'], false, false),
'quantity' => $product['quantity'],
'option' => $option_data,
'weight' => $product['weight']
);
}

$data['discount_amount_cart'] = 0;

$total = $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $order_info['currency_code'], false, false);

if ($total > 0) {
$data['products'][] = array(
'name' => $this->language->get('text_total'),
'model' => '',
'price' => $total,
'quantity' => 1,
'option' => array(),
'weight' => 0
);
} else {
$data['discount_amount_cart'] -= $total;
}

$data['currency_code'] = $order_info['currency_code'];
$data['first_name'] = html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8');
$data['last_name'] = html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
$data['address1'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8');
$data['address2'] = html_entity_decode($order_info['payment_address_2'], ENT_QUOTES, 'UTF-8');
$data['city'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
$data['zip'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
$data['country'] = $order_info['payment_iso_code_2'];
$data['email'] = $order_info['email'];
$data['invoice'] = $this->session->data['order_id'] . ' - ' . html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
$data['lc'] = $this->session->data['language'];
$data['return'] = $this->url->link('checkout/success');
$data['notify_url'] = $this->url->link('payment/pp_standard/callback', '', 'SSL');
$data['cancel_return'] = $this->url->link('checkout/checkout', '', 'SSL');

if (!$this->config->get('pp_standard_transaction')) {
$data['paymentaction'] = 'authorization';
} else {
$data['paymentaction'] = 'sale';
}

$data['custom'] = 'мойкастом';

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/pp_standard.tpl')) {
return $this->load->view($this->config->get('config_template') . '/template/payment/pp_standard.tpl', $data);
} else {
return $this->load->view('default/template/payment/pp_standard.tpl', $data);
}
}
}

public function callback() {
if (isset($this->request->post['custom'])) {
$order_id = $this->request->post['custom'];
} else {
$order_id = 0;
}

$this->load->model('checkout/order');

$order_info = $this->model_checkout_order->getOrder($order_id);

if ($order_info) {
$request = 'cmd=_notify-validate';

foreach ($this->request->post as $key => $value) {
$request .= '&' . $key . '=' . urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
}

if (!$this->config->get('pp_standard_test')) {
$curl = curl_init('https://www.paypal.com/cgi-bin/webscr');
} else {
$curl = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
}

curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($curl);

if (!$response) {
$this->log->write('PP_STANDARD :: CURL failed ' . curl_error($curl) . '(' . curl_errno($curl) . ')');
}

if ($this->config->get('pp_standard_debug')) {
$this->log->write('PP_STANDARD :: IPN REQUEST: ' . $request);
$this->log->write('PP_STANDARD :: IPN RESPONSE: ' . $response);
}

if ((strcmp($response, 'VERIFIED') == 0 || strcmp($response, 'UNVERIFIED') == 0) && isset($this->request->post['payment_status'])) {
$order_status_id = $this->config->get('config_order_status_id');

switch($this->request->post['payment_status']) {
case 'Canceled_Reversal':
$order_status_id = $this->config->get('pp_standard_canceled_reversal_status_id');
break;
case 'Completed':
$receiver_match = (strtolower($this->request->post['receiver_email']) == strtolower($this->config->get('pp_standard_email')));

$total_paid_match = ((float)$this->request->post['mc_gross'] == $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false));

if ($receiver_match && $total_paid_match) {
$order_status_id = $this->config->get('pp_standard_completed_status_id');
}

if (!$receiver_match) {
$this->log->write('PP_STANDARD :: RECEIVER EMAIL MISMATCH! ' . strtolower($this->request->post['receiver_email']));
}

if (!$total_paid_match) {
$this->log->write('PP_STANDARD :: TOTAL PAID MISMATCH! ' . $this->request->post['mc_gross']);
}
break;
case 'Denied':
$order_status_id = $this->config->get('pp_standard_denied_status_id');
break;
case 'Expired':
$order_status_id = $this->config->get('pp_standard_expired_status_id');
break;
case 'Failed':
$order_status_id = $this->config->get('pp_standard_failed_status_id');
break;
case 'Pending':
$order_status_id = $this->config->get('pp_standard_pending_status_id');
break;
case 'Processed':
$order_status_id = $this->config->get('pp_standard_processed_status_id');
break;
case 'Refunded':
$order_status_id = $this->config->get('pp_standard_refunded_status_id');
break;
case 'Reversed':
$order_status_id = $this->config->get('pp_standard_reversed_status_id');
break;
case 'Voided':
$order_status_id = $this->config->get('pp_standard_voided_status_id');
break;
}

$this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
} else {
$this->model_checkout_order->addOrderHistory($order_id, $this->config->get('config_order_status_id'));
}

curl_close($curl);
}
}
}

 

А именно тут:

public function callback() {
        if (isset($this->request->post['custom'])) {
            $order_id = $this->request->post['custom'];
        } else {
            $order_id = 0;
        }

 

Буду благодарен за любые советы. :-(

Надіслати
Поділитися на інших сайтах


проблему решили?

 

Пока нет, как решу - отпишусь сюда.

 

Перечитал инструкцию wb - там всё гараздо проще. Деньги сортируются по параметру item_number.

В интеграции не увидел проблем и трудностей, но было бы хорошо протестировать.

Надіслати
Поділитися на інших сайтах


Разве не лучше когда по custom?

Покупатель лишней информации видеть не будет.

 

Если по item_number - у покупателя могут возникнуть сомнения.

 

Если по custom, то нужно что-то делать с:

 

public function callback() {

        if (isset($this->request->post['custom'])) {

            $order_id = $this->request->post['custom'];

        } else {

            $order_id = 0;

        }

 

В catalog/controller/payment/pp_standard.php

 

И получается, что деньги к посреднику зачисляются на Ваш аккаунт, но в админке магазина Вы не увидите заказ.

Надіслати
Поділитися на інших сайтах


Вы с seller-online.com давно работаете?

Переходите на WB - дешевле.

 

С селлер-онлайн работаю 7 месяцев.

WB - всё понравилось, буду пробовать.

Надіслати
Поділитися на інших сайтах


  • 1 year later...
  • 1 month later...

Недавно делал клиенту оплату PayPal через посредника "seller-online", обыскал весь интернет, но ничего толкового не нашел. Сделал все сам. Так что, если еще актуально могу описать свои действия.

Змінено користувачем An84Drew
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.