Jump to content

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;
        }

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

нет, seller-online.com

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Проблему с SOL решили? Также интересует.

Share this post


Link to post
Share on other sites

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

Edited by An84Drew

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.