成功付款后无法检索贝宝信息

时间:2020-01-12 19:21:17

标签: javascript php 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); } ?>

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。 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')");
?>