支付成功后无法找回Paypal信息

Posted

技术标签:

【中文标题】支付成功后无法找回Paypal信息【英文标题】:impossible to retrieve Paypal information after successful payment 【发布时间】:2020-04-29 14:50:37 【问题描述】:

我正在尝试在销售网站上集成贝宝付款。客户部分运作良好,客户付款并且钱在卖方帐户中。允许恢复交易号、金额、客户地址等数据的第二部分不起作用。但我使用的是 Paypal 提供的脚本。

此文件 index.php 付费作品



    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
      <title>Radiofil</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"
            integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" 
    		crossorigin="anonymous">
      
    </head>
    <body>

    <nav class="navbar navbar-expand-lg navbar-dark bg-primary mb-1">

      <a class="navbar-brand" href="#">Boutique Tubes</a>


    </nav>

    <div class="container">

      <h1>Récapitulatif</h1>

      <table class="table table-striped">
     
        <thead>
        <tr>
          <th>Tube</th>
          <th>Qte</th>
          <th>Prix</th>
    	  
        </tr>
        </thead>
        <tbody>

         <?php 
    	     $user_id = 8000;
    		 $RefBonCommande= '20000';
    	include('../config/dbconn.php');
    $query = mysqli_query($dbconn,"SELECT * FROM detailcde WHERE user_id='$user_id' AND RefBonCommande='$RefBonCommande'") or die (mysqli_error());

     while ($row3 = mysqli_fetch_array($query, MYSQLI_NUM)) 


    $count = mysqli_num_rows($query);
    	
    $numerotube=$row3[3];
    $qty= $row3[4];
    $totalp = $row3[5];

          echo "<tr>";
          echo  "<td>".$numerotube."</td>";
    	  echo "<td>".$qty."</td>";
    	  echo "<td>".$totalp.'€'."</td>";
    
    	$query1 = mysqli_query($dbconn,"SELECT * FROM commandes WHERE Refcde='$RefBonCommande' AND adherent1='$user_id'") or die (mysqli_error()); 
    	$row4 = mysqli_fetch_array($query1);
    	$port=$row4['FraisTransport'];
    	$total=$row4['Total'];
    	  echo "<tr>";
          echo  "<td>".'Total + port '."</td>";
    	  echo "<td>".'1 '."</td>";
    	  echo "<td>".$total.'€'."</td>";
    	  echo "<tr>";
    	  echo "<td><b><font size = 5>".'Commande de l\'adherent RFL n° '.$user_id."</b></br></td>"; 
    ?>
        </tbody>
      </table>

      <!--<p class="text-right">
        <div id="paypal-button"></div>
        <!--<a href="payment.php" class="btn btn-success">Acheter</a>-->
      </p>

    </div><!-- /.container -->

      <script
        src="https://www.paypal.com/sdk/js?client-id=client-id&currency=EUR"> // Required. Replace SB_CLIENT_ID with your sandbox client ID.

        paypal.Buttons().render('#paypal-button-container');

        // This function displays Smart Payment Buttons on your web page.
    	</script>
    <center>	
      <div id="paypal-button-container"></div> 
      </center>
      <script>
      paypal.Buttons(
        createOrder: function(data, actions) 
          return actions.order.create(
            purchase_units: [
              amount: 
                value: <?php echo $total ;?>  //'5.60'
              
            ]
          );
        ,
        onApprove: function(data, actions) 
          return actions.order.capture().then(function(details) 
            alert('Transaction completed by adherent ' + details.payer.name.given_name);
            // Call your server to save the transaction
            return fetch('/paypal-transaction-complete', 
              method: 'post',
              headers: 
                'content-type': 'application/json'
              ,
              body: JSON.stringify(
                orderID: data.orderID,
    			payerID: data.payerID
    			)
    			
            );
          );
        
      ).render('#paypal-button-container');

      </script>

    </body>
    </html>
**the script below does not work** <!-- language: lang-PHP --> <?php require 'vendor/autoload.php'; ?> <script> // 1. Set up your server to make calls to PayPal // 1a. Add your client ID and secret PAYPAL_CLIENT = cliet id'; PAYPAL_SECRET = secret'; // 1b. Point your server to the PayPal API PAYPAL_OAUTH_API = 'https://api.sandbox.paypal.com/v1/oauth2/token/'; PAYPAL_ORDER_API = 'https://api.sandbox.paypal.com/v2/checkout/orders/'; // 1c. Get an access token from the PayPal API basicAuth = base64encode(`$ PAYPAL_CLIENT :$ PAYPAL_SECRET `); auth = http.post(PAYPAL_OAUTH_API , headers: Accept: `application/json`, Authorization: `Basic $ basicAuth ` , data: `grant_type=client_credentials` ); // 2. Set up your server to receive a call from the client function handleRequest(request, response), // 2a. Get the order ID from the request body orderID = request.body.orderID; // 3. Call PayPal to capture the order capture = http.post(PAYPAL_ORDER_API + orderID + '/capture', headers: Accept: `application/json`, Authorization: `Bearer $ auth.access_token ` ); // 4. Save the capture ID to your database if (!capture.error) captureID = capture.purchase_units[0] .payments.captures[0].id; database.saveCaptureID(captureID); // 5. Handle any errors from the call if (capture.error) console.error(capture.error); return response.send(500); // 6. Return a successful response to the client response.send(200); hello, according to the advice of PHPology I set up the return call URL and of course used the PAYPAL script. I went to the history of IPN messages and I have an HTTP 500 error. I think there may be a syntax error in the PAYPAL script they are specialists in this kind of error. <?php function ipn($ipn_data) define('SSL_P_URL', 'https://www.paypal.com/cgi-bin/webscr'); define('SSL_SAND_URL', 'https://www.sandbox.paypal.com/cgi-bin/webscr'); $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']); if (!preg_match('/paypal\.com$/', $hostname)) $ipn_status = 'Validation post isn\'t from PayPal'; if ($ipn_data == true) //You can send email as well return false; // parse the paypal URL $paypal_url = ($_REQUEST['test_ipn'] == 1) ? SSL_SAND_URL : SSL_P_URL; $url_parsed = parse_url($paypal_url); $post_string = ''; foreach ($_REQUEST as $field => $value) $post_string .= $field . '=' . urlencode(stripslashes($value)) . '&'; $post_string.="cmd=_notify-validate"; // append ipn command // get the correct paypal url to post request to $paypal_mode_status = $ipn_data; //get_option('im_sabdbox_mode'); if ($paypal_mode_status == true) $fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60); else $fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60); $ipn_response = ''; if (!$fp) // could not open the connection. If loggin is on, the error message // will be in the log. $ipn_status = "fsockopen error no. $err_num: $err_str"; if ($ipn_data == true) echo 'fsockopen fail'; return false; else // Post the data back to paypal fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n"); fputs($fp, "Host: $url_parsed[host]\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: " . strlen($post_string) . "\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $post_string . "\r\n\r\n"); // loop through the response from the server and append to variable while (!feof($fp)) $ipn_response .= fgets($fp, 1024); fclose($fp); // close connection // Invalid IPN transaction. Check the $ipn_status and log for details. if (!preg_match("/VERIFIED/s", $ipn_response)) $ipn_status = 'IPN Validation Failed'; if ($ipn_data == true) echo 'Validation fail'; print_r($_REQUEST); return false; else $ipn_status = "IPN VERIFIED"; if ($ipn_data == true) echo 'SUCCESS'; print_r($_REQUEST); return true; function ipn_response() //mail("sobhagya1411@gmail.com","My subject",print_r($request,true)); $ipn_data = true; if ($this->ipn($_REQUEST)) $this->insert_data($_REQUEST); function issetCheck($post, $key) if (isset($post[$key])) $return = $post[$key]; else $return = ''; return $return; public function insert_data() $post = $_REQUEST; $item_name= $this->issetCheck($post, 'item_name'); $amount = $this->issetCheck($post, 'mc_gross'); $currency = $this->issetCheck($post, 'mc_currency'); $payer_email = $this->issetCheck($post, 'payer_email'); $first_name = $this->issetCheck($post, 'first_name'); $last_name = $this->issetCheck($post, 'last_name'); $country = $this->issetCheck($post, 'residence_country'); $txn_id = $this->issetCheck($post, 'txn_id'); $txn_type = $this->issetCheck($post, 'txn_type'); $payment_status = $this->issetCheck($post, 'payment_status'); $payment_type = $this->issetCheck($post, 'payment_type'); $payer_id = $this->issetCheck($post, 'payer_id'); $create_date = date('Y-m-d H:i:s'); $payment_date = date('Y-m-d H:i:s'); $paypal_sql = "INSERT INTO ipn_data_tbl (item_name,payer_email,first_name,last_name,amount,currency,country,txn_id,txn_type,payer_id,payment_status,payment_type,create_date,payment_date) VALUES ($item_name,'$payer_email','$first_name','$last_name','$amount','$currency','$country','$txn_id','$txn_type','$payer_id','$payment_status','$payment_type','$create_date','$payment_date')"; mysql_query($paypal_sql); ?>

【问题讨论】:

我已经有一段时间没有使用 Paypal,但您是否在 Paypal 中定义了回调 URL? “下面的脚本不起作用”和“当下面的脚本运行时,这是它在运行时或与 PayPal 通信时遇到的错误”是两种不同类型的信息。您的问题似乎缺少后者。 @PHPology,这个解决方案是调用者,它不使用回调 URL 亲爱的 PHPology 我没有定义返回 URL。 PAYPAL的解释中没有提到。 Preston PHX 当我写它不起作用时,我的意思是它没有通过任何东西,即使在控制台中我也没有显示错误。 你好,我设置了回调 URL,当然也使用了 PAYPAL 脚本。我查看了 IPN 消息的历史记录,我遇到了 HTTP 500 错误。我认为 PAYPAL 脚本中可能存在语法错误,他们是此类错误的专家。 【参考方案1】:

我解决了这个问题。 Paypal 提供的脚本由于存在语法错误而无法运行。他们对这些方法的解释非常模糊。最后在做了一些语法和 url 修改后,我的 php IPN paypal IPN 监听器软件工作了。

<?php

$charset = "utf-8";

include('../config/dbconn.php');
	$deb='je commence';
	mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$deb')");

/* NE RIEN MODIFIER CI-DESSOUS */

// lecture du post de PayPal et ajout de 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) 
$value = trim(urlencode(stripslashes($value)));
$req .= "&$key=$value";


//mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$req')");

// reponse a PayPal pour validation
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
//$header .= "Content-Length: 1028\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Connection: close\r\n\r\n";
//$header .= "Host: ipnpb.paypal.com:443\r\n";

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
//$fp = fsockopen ('ipnpb.paypal.com', 443, $errno, $errstr, 30);
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('fp1')");
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$fp')");

// variables
$discount = $_POST['discount'];
$insurance_amount = $_POST['insurance_amount'];
$payer_id = $_POST['payer_id'];
$address_country_code = $_POST['address_country_code'];
$ipn_track_id = $_POST['ipn_track_id'];
$address_zip = $_POST['address_zip'];
$charset = $_POST['charset'];
$payment_gross = $_POST['payment_gross'];
$address_status = $_POST['address_status'];
$shipping_discount = $_POST['shipping_discount'];
$address_street = $_POST['address_street'];
$verify_sign = $_POST['verify_sign'];
$item_name = $_POST['item_name'];
$test_ipn = $_POST['test_ipn'];
$txn_type = $_POST['txn_type'];
$receiver_id = $_POST['receiver_id'];
$payment_fee = $_POST['payment_fee'];
$mc_currency = $_POST['mc_currency'];
$transaction_subject = $_POST['transaction_subject'];
$shipping_method = $_POST['shipping_method'];
$custom = $_POST['custom'];
$protection_eligibility = $_POST['protection_eligibility'];
$address_country = $_POST['address_country'];
$payer_status = $_POST['payer_status'];
$first_name = $_POST['first_name'];
$address_name = $_POST['address_name'];
$mc_gross = $_POST['mc_gross'];
$payment_date = $_POST['payment_date'];
$payment_status = $_POST['payment_status'];
$quantity = $_POST['quantity'];
$business = $_POST['business'];
$item_number = $_POST['item_number'];
$last_name = $_POST['last_name'];
$address_state = $_POST['address_state'];
$txn_id = $_POST['txn_id'];
$mc_fee = $_POST['mc_fee'];
$payment_type = $_POST['payment_type'];
$notify_version = $_POST['notify_version'];
$payer_email = $_POST['payer_email'];
$receiver_email = $_POST['receiver_email'];
$address_city = $_POST['address_city'];
$residence_country = $_POST['residence_country'];

$payment_currency = $_POST['mc_currency'];
$receiver_id = $_POST['receiver_id'];
$num_cart_items = $_POST['num_cart_items'];


mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$txn_id')");
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('Date')");
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$payment_date')");
$rest = substr($payment_date, 9, 13);
$mois = substr($rest, 0, 3);
$jour = substr($rest, 4, 2);
$an = substr($rest, 8, 4);
$date = $an.'-'.$mois.'-'.$jour;
$date = date_create($date);
$dte = date_format($date,'Y-m-d');

if (!$fp) 
// HTTP ERROR
 else 
fputs ($fp, $header . $req);
fseek($fp, 0);
while (!feof($fp)) 
$res = fgets ($fp, 10024);
//$test=strcmp (trim($res), "VERIFIED");
//if (strcmp ($res, "VERIFIED") == 0) 
if (strcmp (trim($res), "VERIFIED") == 0) 
$deba = 'verifie';
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$deba')");
// Envoi du mail
   
 	$paypal_sql = "INSERT INTO paiements (payment_id,payment_status,payment_amount,taxe_paypal,payment_currency,payment_date,payer_email)
    VALUES ('$txn_id','$payment_status','$mc_gross','$mc_fee','$mc_currency','$dte','$payer_email')";
    mysqli_query($dbconn,$paypal_sql); 



else if (strcmp (trim($res), "INVALID") == 0) 
$debb = 'invalide';
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$debb')");

	$payment_status = 'INVALID';
 	$paypal_sql = "INSERT INTO paiements (payment_id,payment_status,payment_amount,taxe_paypal,payment_currency,payment_date,payer_email)
    VALUES ('$txn_id','$payment_status','$mc_gross','$mc_fee','$mc_currency','$dte','$payer_email')";
    mysqli_query($dbconn,$paypal_sql); 




fclose ($fp);

$debc = 'fini';
mysqli_query($dbconn,"INSERT INTO paytest (mess) VALUES ('$debc')");
?>

 

【讨论】:

以上是关于支付成功后无法找回Paypal信息的主要内容,如果未能解决你的问题,请参考以下文章

无法完成连锁支付

Paypal 自适应支付无法在移动设备上运行

设置paypal成功后的超时返回

定期付款和 Paypal 后更新到期日期

使用java做paypal开发时购买东西支付不成功的原因

PayPal 支付成功后显示 HTML 按钮