Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


 Поделиться

Рекомендованные сообщения

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

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

 

Решил принимать 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;
        }

 

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

Ссылка на комментарий
Поделиться на других сайтах


в итоге проходит 1 заказ, а за остальные заказы получаю оплату, но не вижу в админке интернет-магазина.

Ссылка на комментарий
Поделиться на других сайтах


посредник - WB?

нет, seller-online.com

 

к слову, смотрел wb - тоже интересно.

Ссылка на комментарий
Поделиться на других сайтах


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

 

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

 

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

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

Ссылка на комментарий
Поделиться на других сайтах


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

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

 

Если по 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 - всё понравилось, буду пробовать.

Ссылка на комментарий
Поделиться на других сайтах


у seller-online деньги зачисляются на ваш аккаунт мгновенно?

 

примерно 2-5 минут

Ссылка на комментарий
Поделиться на других сайтах


  • 1 год спустя...
  • 1 месяц спустя...

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

Изменено пользователем An84Drew
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.