LSA8881

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

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

LSA8881    0

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

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

нет, seller-online.com

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

Разве не лучше когда по 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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
LSA8881    0

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
jvz    119

это хорошо, потому что у WB только в ручном режиме в рабочее время

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу