Электронное письмо не отправляется покупателю в PayPal с использованием sandox ipn

Привет, я работаю над плагином PayPal, который добавляет ответчика, добавляет продукты.

Я работаю над песочницей для тестирования.

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

Вот мой код:

Пейпал форма:

<form name="_xclick" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_blank">
    <input type="hidden" name="cmd" value="_xclick">
    <input type="hidden" name="business" value="'.$paypalID.'">
    <input type="hidden" name="return" value="'.$return_url.'">
    <input type="hidden" name="currency_code" value="'.$currency.'">
    <input type="hidden" name="item_name" value="'.$product_name.'">
    <input type="hidden" name="amount" id="p'.$product_id.'" value="'.$product_price.'">
    <input type="hidden" name="custom" value="'.$responderID.'">
    <input name="notify_url" value="'.plugin_dir_url( __FILE__ ).'ipn_sandbox.php" type="hidden">
    <input type="image" src="'.$upload_image.'" border="0" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

А вот мой код ipn_sandbox.php:

<?php
    // STEP 1: Read POST data
    // reading posted data from directly from $_POST causes serialization 
    // issues with array data in POST
    // reading raw POST data from input stream instead. 

    $raw_post_data = file_get_contents('php://input');
    $raw_post_array = explode('&', $raw_post_data);

    $myPost = array();
    foreach ($raw_post_array as $keyval) {
        $keyval = explode ('=', $keyval);

        if (count($keyval) == 2)
            $myPost[$keyval[0]] = urldecode($keyval[1]);
    }

    // read the post from PayPal system and add 'cmd'
    $req = 'cmd=_notify-validate';
    if(function_exists('get_magic_quotes_gpc')) {
        $get_magic_quotes_exists = true;
    } 

    foreach ($myPost as $key => $value) {        
        if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { 
            $value = urlencode(stripslashes($value)); 
        } else {
            $value = urlencode($value);
        }
        $req .= "&$key=$value";
    }

    // STEP 2: Post IPN data back to paypal to validate
    $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

    if( !($res = curl_exec($ch)) ) {
        curl_close($ch);
        exit; 
    }
    curl_close($ch);

    $path = $_SERVER['DOCUMENT_ROOT'];

    include_once $path . '/wp-config.php';
    include_once $path . '/wp-load.php';
    include_once $path . '/wp-includes/wp-db.php';
    include_once $path . '/wp-includes/pluggable.php';

    global $wpdb;
    if (strcmp ($res, "VERIFIED") == 0) {
        $item_name              =   $_POST['item_name'];
        $item_number            =   $_POST['item_number'];
        $payment_status         =   $_POST['payment_status'];
        $payment_amount         =   $_POST['mc_gross'];
        $payment_currency       =   $_POST['mc_currency'];
        $txn_id                 =   $_POST['txn_id'];
        $receiver_email         =   $_POST['receiver_email'];
        $payer_email            =   $_POST['payer_email'];
        $responderID            =   $_POST['custom'];
        $name                   =   $_POST['first_name'];
        $payment_status         =   $_POST['payment_status'];
        $site_url               =   get_bloginfo('wpurl');
        $table_resp             =   $wpdb->prefix.'paypal_responders';
        $responder_to_use       =   $wpdb->get_row("SELECT * FROM $table_resp WHERE id ='$responderID'");
        $subject                =   $responder_to_use->subject;
        $from                   =   $responder_to_use->from_email;
        $attachment             =   $responder_to_use->attachment;
        $att_secure             =   $responder_to_use->att_secure;
        $message        .=  $responder_to_use->message_body;
        $message                .=  '<br /><br />
                                    <a title="Click here to download Attachment" href="'.plugin_dir_url(__FILE__).'responders/download.php?filename='.$att_secure.'" width="150" height="150" target="_blank">Click here to download Attachment</a>';

        if($message){
            $message    =   str_replace('[item_name]',$item_name,$message);
            $message    =   str_replace('[txn_id]',$txn_id,$message);
            $message    =   str_replace(' [mc_gross]',$payment_amount,$message);
            $message    =   str_replace('[mc_currency]',$payment_currency,$message);
            $message    =   str_replace('[receiver_email]',$receiver_email,$message);
            $message    =   str_replace('[payer_email]',$payer_email,$message);
            $message    =   str_replace('[name]',$name,$message);
            $message    =   str_replace('[site_url]',$site_url,$message);
            $message    =   str_replace('[payment_status]',$payment_status,$message);
        }else{
            $message    =       'Dear '.$name.',
                                Thank you for your purchase from '.$site_url.'. The details of your purchase are below.
                                Transaction ID: '.$txn_id.'
                                Item Name: '.$item_name.'
                                Payment Amount: '.$payment_amount.'
                                Payment Amount: '.$payment_status.'
                                Paid to: '.$receiver_email.'
                                Thanks and Enjoy!
                                ~Enigma Digital <br />
                                <br />
                                <a title="Click here to download Attachment" href="'.plugin_dir_url(__FILE__).'responders/download.php?filename='.$att_secure.'" width="150" height="150" target="_blank">Click here to download Attachment</a>';
        }

        $table          =   $wpdb->prefix . "paypal_transactions";
        $txn_id_check   =   $wpdb->get_results("SELECT * FROM $table WHERE txn_id ='$txn_id'");

        if(!$txn_id_check){
            $data   =   array(
                            'txn_id'            =>      $txn_id,
                            'product_name'      =>      $item_name,
                            'product_price'     =>      $payment_amount,
                            'payer_email'       =>      $payer_email,
                        );

            $wpdb->insert($table,$data) or die(mysql_error());
            $num = md5(time());

            $headers .= 'From: ' .$from. "\r\n" .'Reply-To: ' .$from . "\r\n";
            $headers  .= 'MIME-Version: 1.0' . "\r\n";
            $headers  .= "Content-Type: text/html; charset=iso-8859-1 ";
            $headers  .= "--".$num."--";

            //mail to buyer
            mail( $payer_email , $subject, $message, $headers );
        }
    }
?>

Я также использую wp_mail(), кроме mail(), но ничего не происходит.

Помогите пожалуйста, в чем дело.


person deemi-D-nadeem    schedule 04.09.2014    source источник
comment
Вы тестируете на локальной машине или на онлайн-сервере? попробуйте error_reporting, возможно, это поможет вам решить проблему..   -  person Syed Qarib    schedule 11.09.2014
comment
@SyedQarib, сахиб, я использую онлайн-сервер   -  person deemi-D-nadeem    schedule 11.09.2014
comment
Вы пробовали сообщать об ошибках? В логах можно что-то найти?   -  person Syed Qarib    schedule 11.09.2014


Ответы (3)


Есть несколько проблем с кодом, и вы можете сделать несколько вещей, чтобы начать процесс отладки. Однако маловероятно, что вы получите здесь простое решение, поскольку это открытый вопрос.

Прежде чем что-либо делать, убедитесь, что error_reporting установлено на E^ALL, а display_errors установлено на On в вашем php.ini. (Turorial, если вам это нужно). Проверьте свой error_log - если он существует - для немедленных подсказок.

Вам нужно объявить $message, прежде чем добавлять к нему дополнительные данные. Вы начинаете добавлять данные к $message в строке 77 ($message .= $responder_to_use->message_body;), но они еще не установлены, что приведет к появлению предупреждения.

Теперь есть 3 причины, по которым само письмо не будет отправлено:

  1. Ваш сервер не настроен для отправки почты.
  2. $txn_id_check не установлено или установлено false. Это было бы так, если бы $txn_id не было в вашей базе данных. Я предполагаю, что вы добавляете эту строку в начале транзакции, но проверяли ли вы?
  3. У вас есть синтаксическая ошибка в одном из включенных файлов.

Давайте обращаться №1. Создайте файл на сервере с 1 строкой, которая отправляет вам простое электронное письмо:

<?php mail('your@email', 'Test email', 'Yay, I can send mail!'); ?>

Откройте этот файл в своем браузере. Проверьте свой почтовый ящик и проверьте спам. Нет почты? В этом проблема.


Далее #2: Вероятно, это проблема со сценарием, который добавляет транзакцию в базу данных еще до того, как пользователь попадет в PayPal. У нас нет этого кода, но вам легко это проверить — просто проверьте БД, чтобы увидеть, есть ли у вас какие-либо строки.


И № 3: синтаксические ошибки должно быть легко проверить здесь, просто откройте скрипт IPN прямо в своем браузере. Вам будут показаны фатальные ошибки.


До сих пор не работает? Могут быть проблемы в другом месте. Лучший способ проверить это с помощью базовой отладки...

Начните с отправки полного массива $_POST себе по электронной почте прямо в верхней части скрипта.

<?php
    mail('your@email', 'Full Post Data - '.time(), print_r($_REQUEST, true));

    // STEP 1: Read POST data
    // reading posted data from directly from $_POST causes serialization 
    // issues with array data in POST
    // reading raw POST data from input stream instead. 

    $raw_post_data = file_get_contents('php://input');
    $raw_post_array = explode('&', $raw_post_data);

    [...]

И отправьте себе по электронной почте вывод скрипта в самом конце.

<?php
    ob_start();

    $time = time(); // Referenced in your email subjects. It will get confusing with lots of these emails otherwise. Gmail and other clients who use a conversation view will properly catalogue these emails if the subjects match.

    mail('your@email', 'Full Post Data - '.$time, print_r($_REQUEST, true));

    // STEP 1: Read POST data
    // reading posted data from directly from $_POST causes serialization 
    // issues with array data in POST
    // reading raw POST data from input stream instead. 

    [...] // Rest of your script here...

    $output_buffer = ob_get_contents();
    ob_end_clean();

    mail('your@email', 'Output buffer - '.$time, $output_buffer);
?>
person Mike    schedule 12.09.2014

Включите почту в вашем php.ini.

У вас должно быть что-то вроде этого:

В php.ini:

[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25

; For Win32 only.
;sendmail_from = [email protected]

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i -f  [email protected]

Строки, начинающиеся с ";" закомментированы. Поэтому убедитесь, что вы раскомментировали нужную часть в зависимости от того, в какой операционной системе вы работаете.

person Rupert    schedule 11.09.2014
comment
Я думаю, что описываю, что я работаю над плагином, и плагин установлен многими пользователями, и, пожалуйста, скажите мне, как я могу редактировать ИХ файл php.ini - person deemi-D-nadeem; 12.09.2014

person    schedule
comment
Используйте этот код для сообщения, что все работает нормально, я проверил - person Ashutosh Kumar; 12.09.2014
comment
пожалуйста, передайте правильное значение в $message .= ‹tr›‹td›‹strong›Name:‹/strong› ‹/td›‹td› .$ram[0]['name'] . ‹/тд›‹/тр›; - person Ashutosh Kumar; 12.09.2014
comment
Ни этот ответ, ни ваш комментарий не имеют особого смысла в контексте этого вопроса. - person Andrew Barber; 19.09.2014