2014-09-04 1 views
4

안녕하세요. 저는 응답기를 추가하는 페이팔 플러그인을 만들고 있습니다. 제품을 추가하십시오.이메일은 sandox ipn을 사용하여 페이팔로 구매자에게 보내지 않습니다.

테스트를 위해 샌드 박스에서 작업 중입니다.

응답자는 제품 응답자를 추가하는 것보다 응답합니다. 프론트 엔드에서 "Buy"버튼을 클릭하면 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); 
     } 
    } 
?> 

나는 또한 mail() 제외 wp_mail()를 사용하지만 아무것도 일어나지는

여기 내 코드입니다.

누구든지 문제를 해결할 수 있습니다.

+0

로컬 컴퓨터 또는 온라인 서버에서 테스트 중이십니까? 'error_reporting'을 시도해보십시오. 문제를 디버그하는 데 도움이됩니다. –

+0

@SyedQarib sahib 온라인 서버를 사용하고 있습니다. – deemi

+0

오류보고를 시도 했습니까? 로그에서 찾을 수있는 것이 있습니까? –

답변

5

코드에 몇 가지 문제가 있으며 디버깅 프로세스를 시작하기 위해 몇 가지 작업을 수행 할 수 있습니다. 자유로운 질문이므로 여기에 직접적인 수정을 가할 수는 없습니다.

아무것도하기 전에, error_reportingE^ALL로 설정하고 display_errors이 당신의 php.iniOn로 설정되어 있는지 확인하십시오. ( Turorial, if you need it). 즉시 실마리를 찾으려면 error_log (있는 경우)을 확인하십시오.

더 많은 데이터를 추가하기 전에 $message을 선언해야합니다. 7735 번 ($message .= $responder_to_use->message_body;)의 $message에 데이터를 추가하기 시작했으나 아직 설정되지 않았으므로 경고가 표시됩니다.

  1. 서버가 메일을 보낼 설치되지 않습니다 :

    지금 왜 이메일 자체가 전송되지 않을 것 3 가지 이유가 있습니다.

  2. $txn_id_check이 설정되지 않았거나 false입니다. $txn_id이 데이터베이스에없는 경우에 해당됩니다. 트랜잭션을 시작할 때이 행을 추가한다고 가정하고 있지만 확인해 보셨습니까?
  3. 포함 된 파일 중 하나에 구문 오류가 있습니다.

하자의 주소 # 1. 서버에 간단한 전자 메일을 보내는 1 줄의 파일을 만듭니다.

브라우저에서 해당 파일을 방문하십시오. 받은 편지함을 확인하고 스팸을 확인하십시오. 메일이 없습니까? 그게 문제 야.


다음 # 2 : 사용자가 PayPal에 도착하기 전에 데이터베이스에 트랜잭션을 추가하는 스크립트에 문제가있는 것 같습니다. 우리는이 코드를 가지고 있지 않지만 쉽게 확인할 수 있습니다 - 행이 있는지 확인하기 위해 DB를 확인하십시오.


# 3 : 구문 오류는 여기에서 확인하기 쉽습니다. 브라우저에서 직접 IPN 스크립트를 방문하십시오. 치명적인 오류가 표시됩니다.


여전히 작동하지 않습니까? 다른 곳에 문제가있을 수 있습니다. 가장 좋은 방법은 몇 가지 기본적인 디버깅입니다.

전체 $_POST 배열을 전자 메일로 보내려면 스크립트 상단에서 시작하십시오.

<?php 
    mail('[email protected]', '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('[email protected]', '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('[email protected]', 'Output buffer - '.$time, $output_buffer); 
?> 
-1

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] 

라인을 ";" 주석 처리됩니다. 따라서 현재 사용중인 운영 체제에 따라 올바른 부분의 주석 처리를 제거하십시오.

+0

나는 플러그인과 플러그인을 사용하여 많은 사용자를 설치하고 있으며, 어떻게 phirt.ini 파일을 편집 할 수 있는지 설명해 주셨습니다. – deemi

1
$cleanedFrom = 'Ashutosh'; 
      $to ='[email protected]; 
      $subject = 'CONTACT US'; 
      $headers = "From: " . $cleanedFrom . "\r\n"; 
      $headers .= "MIME-Version: 1.0\r\n"; 
      $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
      $message= '<html><body>'; 
      $message .= '<table rules="all" style="border-color: #68A1D7;" cellpadding="15" width="450" align="center">'; 
      $message .= "<tr style='background: #68A1D7; color: #fff;'><td colspan='2'><strong>CONTACT US</strong></td></tr>"; 
      $message .= "<tr><td><strong>Name:</strong> </td><td>" .$ram[0]['name'] . "</td></tr>"; 

      $message .= "<tr style='background:#68A1D7;'><td colspan='2'>&nbsp;</td></tr>"; 
      $message .= "</table>"; 
      $message .= "</body></html>"; 
      $send = mail($to, $subject, $message, $headers); 
      if($send) 
      { 
      echo "<script> alert('Message Sent. Thank you') </script>"; 
      echo "<script>window.location='$webroot'</script>"; 
      exit; 


      } 
      else 
      { 
      echo "<script> alert('Message Not Sent. Thank you') </script>"; 
      echo "<script>window.location='$webroot'</script>"; 
      exit; 

      } 
+0

*이 코드는 잘 작동하고 있습니다. tesed 한 * –

+0

아무것도 모두 경고 $ 메시지의 정확한 값을 전달하십시오 – deemi

+0

표시되지 ... 일어나지 = "이름 :.". $ 램 [0] [ '이름']. ""; –