8797 sujets

Développement web côté serveur, CMS

J’effectue des test sur paypal sandbox pour mettre en place IPN (notification de paiement).

le bouton paypal :
<input type="hidden" name="notify_url" 
value="http://localhost/Copie de test/moi/notify-validate.php" >
<input type="hidden" name="return" 
value="http://localhost/Copie de test/moi/notify-validate.php"> 



lorsque je passe une commande, une fois mon paiement effectué je ne reçois pas de notification de paiement et ma base de donnee est vide.
Par contre, j’ai configuré le bouton retour sur le site (à la fin du paiement) de maniere à voir ma page de notification. Tous les elements s’affichent correctement et sont bien enregitrés dans ma base de donnee.

Je ne vois pas ou ca cloche, est ce que quelqu’un à une idee ? Smiley rolleyes

Merci

Fanny

Page de notification :
<?php require_once('../Connections/Connexion.php'); ?>

 // lire la publication du système PayPal et ajouter 'cmd'
$req = 'cmd=_notify-validate';

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

// renvoyer au système PayPal pour validation
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);

// affecter les variables publiées aux variables locales
$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'];

if (!$fp) {
// ERREUR HTTP
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIE") == 0) {
// vérifier que payment_status est Terminé
// vérifier que txn_id n'a pas été précédemment traité
// vérifier que receiver_email est votre adresse email PayPal principale
// vérifier que payment_amount et payment_currency sont corrects
// traiter le paiement
}
else if (strcmp ($res, "NON VALIDE") == 0) {
// consigner pour étude manuelle
}
}
fclose ($fp);
}

mysql_select_db($database_Connexion, $Connexion);
$query_rsPaypal = "SELECT txn_id, item_name, item_number, payment_status, 
mc_gross, mc_currency, receiver_email, payer_email FROM paypal";
$rsPaypal = mysql_query($query_rsPaypal, $Connexion) or die(mysql_error());
$row_rsPaypal = mysql_fetch_assoc($rsPaypal);
$totalRows_rsPaypal = mysql_num_rows($rsPaypal);


mysql_select_db($database_Connexion, $Connexion);
$query_rsPaypal = "INSERT INTO paypal (txn_id, item_name, item_number, 
payment_status, mc_gross, mc_currency, receiver_email, payer_email) VALUES ('$txn_id', '$item_name', '$item_number', '$payment_status', '$payment_amount', 
'$payment_currency', '$receiver_email', '$payer_email')";
$Result1 = mysql_query($query_rsPaypal, $Connexion) or die(mysql_error());
?>
Bonjour,

je suis pas spécialiste de paypal... mais je penses que la raison est toute simple: tu utilise localhost dans ton url. Or localhost désigne la machine courante, ce n'est pas une adresse absolue. Donc si on reconstitue ce qui se passe:


A. Sur ta version de test locale, tu cliques sur le bouton.
Ici localhost = ton ordinateur.

B. La requête est envoyée à la sandbox paypal.
La sandbox tente de faire une notification sur "http://localhost/Copie de test/moi/notify-validate.php"
[b]Problème[/b]: Ici localhost = le serveur paypal qui traite la requête, peu probable donc qu'il possède ta page.

C. La sandbox renvoie une redirection vers "http://localhost/Copie de test/moi/notify-validate.php".
La redirection étant interprétée par ton navigateur, sur ton ordi, localhost désigne à nouveau ce dernier et cela marche.
Bonjour les amis du Web,

JE suis un peu dans le mem cas que toi.
De mon coté le Transfert des données de paiement (PDT) fonctionne sans souci.

Mais le Instant Payment Notification (IPN)seulement à 1/2 càd :

Je reçois bien le mail "VERIFIED IPN" mais ma BDD reste désespérément VIDE ! Smiley confus

Si quelqu'un a le temps de m'aider....
D'avance MERCI
Le bouton paypal (je travaille en ASP mais le principe est le même)

<form action="<%=form_paypal%>" method="post" name="paypal" ID="paypal">
	<input type="hidden" name="cmd" value="_xclick">
	<input type="hidden" name="business" value="<%=form_business%>">
	<input type="hidden" name="item_name" value="<%=form_boutique%> Client : <%=nclient%> N° <%=session("numclient")%>">
	<input type="hidden" name="currency_code" value="EUR">
	<input type="hidden" name="amount" value="<%=session("montant")%>">
	<input type="hidden" name="invoice" value="<%=session("num_fact")%>">
	<input type="hidden" name="rm" value="2">

        <input type="hidden" name="notify_url" value="<%=form_url%>/testconditions.asp">
	<input type="hidden" name="return" value="<%=form_url%>/merci6.asp?num_fact=<%=session("num_fact")%>">
	<center><h1>Transaction avec Paypal en cours . . . </h1></center>
	<script language="Javascript">document.paypal.submit();</script>
</form>


Le fichier Testconditions.asp (NIP)

<%@LANGUAGE="VBScript"%>
<%
Dim objHttp, str
Dim Payment_status, invoice, Txn_id, business, Payment_amount, Payment_currency
Dim montant,  order_id, num_paypal, testouille, business_dec, chaine, mailsubject
Dim mail_boutique, mail_name, path_db, path_image, testurl, paypal_url

mail_boutique = session("business")
mail_name = session("boutique")
path_db = session("path_db")
path_image = session("path_image")
testurl = session("path_url")
paypal_url = session("paypal_ipn")
 
' read post from PayPal system and add 'cmd'
str = Request.Form & "&cmd=_notify-validate"

' post back to PayPal system to validate
set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")

objHttp.open "POST", paypal_url & "", false
objHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.Send str

'-----------------------------------------------------------------
' assign posted variables to database
    Payment_status = Request.Form("payment_status")
    invoice = Request.Form("invoice")
    Txn_id = Request.Form("txn_id")
    business = Request.Form("business")
    Payment_amount = Request.Form("mc_gross")
    Payment_currency = Request.Form("mc_currency")
    montant = Replace(Payment_amount, ".", ",")
    order_id = invoice
    Num_paypal = Txn_id
    testouille = urldecode(business)
    business_dec = testouille
'-----------------------------------------------------------------
if (objHttp.status <> 200 ) then
ElseIf (objHttp.responseText = "VERIFIED") Then

select case Payment_status
case "Completed"

' sauve les données Paypal dans le dossier log

log_name = "\log\logsucces.txt"
%>
<!-- #include file="log1.inc"-->
<%
' recherche dans le BD de la facture
        Set conn = Server.CreateObject("ADODB.Connection")
        strDbPathAndName ="DBQ=" & path_db & "\database\produits1.mdb"
	connstring="DRIVER={Microsoft Access Driver (*.mdb)}; " & strDbPathAndName
        conn.Open connstring 

SQL = "select	c.Id_com, c.Id_client, c.date_com, c.devise_com, c.paietype_com, c.porttotal_com, c.total_com, c.paye_com, cd.quant_produit, cd.prix_produit, p.ref_prod, p.titre_prod, p.detail_prod, dp.Titre_Paiement " &_ 
"from produits p, detail_commande cd, commandes c, paiement dp " &_
"where c.id_com = "& order_id &" and cd.id_com = c.id_com and p.id_prod = cd.id_prod and dp.Id_paiement = c.PaieType_com"
Set details = Server.CreateObject("ADODB.Recordset")
details.Open SQL, conn, 0, 2

client = details("Id_client")
mon = "€"
dev = details("devise_com")

paye = details("Titre_Paiement")
porto = formatnumber(details("porttotal_com")/details("devise_com").value,2)
totottc = round(formatnumber(details("total_com").value,2)*1-porto,2)
total = formatnumber(details("total_com").value,2)
paye = details("Titre_Paiement")

        if montant = total and business_dec= mail_boutique then
'           mise à jour de la BD et envoi d'un mail de remerciement
'*********************
sql = "update commandes set Paye_com = 1 where Id_com =" & order_id
conn.execute sql

SQL = "select Nom_client, Prenom_client, Postal_client, Ville_client, Pays_client, email_client, Province_client, Tel_client, fax_client, adresse_client " &_
"from Clients where Id_client = "& client
Set cli = Server.CreateObject("ADODB.Recordset")
cli.Open SQL, conn, 0, 2

nom = cli("Nom_client")
prenom = cli("Prenom_client")
codepost = cli("Postal_client")
Ville = cli("Ville_client")
pays = cli("Pays_client")
adresse = cli("adresse_client")
imail = cli("email_client")
Prov = cli("Province_client")
tel = cli("Tel_client")
fax = cli("fax_client")
nomcomplet = nom + " " + prenom

ct=ct&"<html>"
ct = ct&"<body><img src=" & path_image & "/logo.gif' alt='logo' title='logo' />"
ct = ct&"<p><center>La réponse de Paypal à cet Notification de Payement est:  VERIFIED</center></p>"
ct = ct&"<p><center>Réf Paypal : " & Num_paypal & "</center></p>"
ct = ct&"<p><center><b>Accusé réception de votre commande du " & details("Date_com") & "<br /> à la BOUTIQUE " & mail_boutique & "</b></center></p>"
ct = ct&"<p><b>Adresse de livraison : </b><br />"

ct = ct&"<p>" & nom & " " & prenom & "<br />"
ct = ct& adresse & "<br />"
ct = ct& codepost & " " & Ville & " (" & prov & ") " & pays &"<br />"
ct = ct&"Tél.: " & tel & " Fax.: " & fax &"<br />"
ct = ct& Imail & "</p>"
ct = ct&"<b>N° de client: " & client & "</b></p>"
ct = ct&"<b>Récapitulatif de votre commande N° "& details("Id_Com") & "</b><br /><br />" 
ct=ct&"<table width='90%' border='1' cellpadding='0' cellspacing='0' bordercolor='green'><tr bgcolor='#ccff99'><td><center>Ref</center></td><td><center>Titre</center></td><td><center>Quantité</center></td><td><center>PU</center></td><td><center>Total</center></td></tr>"
do while  not details.eof 
ct=ct&"<tr><td>" & details("ref_prod") & "</td><td> " & (details("Titre_prod")) & "</td><td><center>"  & details("quant_produit")  & "</center></td>"
ct=ct&"<td><div align='right'>" & formatnumber(details("Prix_produit")/details("Devise_com").value,2)  & " " & mon & "</div></td>"
ct=ct&"<td><div align='right'>" & formatnumber((details("Prix_produit")*details("quant_produit"))/details("Devise_com").value,2)  & " " & mon & "</div></td></tr>"
details.MoveNext
loop
ct=ct&"</table>"
Ct = ct&"<p> </p><p>Total ht : "  & toto  & " " & mon & "<br />"
Ct = ct&"TVA : " & formatnumber(toto*tva) & " " & mon & "<br>"

if porto <> 0 then
Ct = ct&"Frais de port : " & porto  & " " & mon & "<br />"
else
Ct = ct&"Franco de port<br />"
end if

response.write ("")
Ct = ct& "Total TTC : "& formatnumber(totottc*1+porto) & " " & mon & "<br>"
response.write ("")
Ct = ct&"Payé par : " & paye & "</p>"
Ct = ct&"</body>"
ct = ct&"</html>"

Mailsubject = "Accusé reception de votre commande"
%>
<!-- #include file="mail.inc"-->
<%
        else
'           Constat d'anomalie et envoi d'un mail d'erreur
log_name = "\log\loganomalie.txt"
' sauve les données Paypal dans le dossier log
%>
<!-- #include file="log.inc"-->
<%
ct=ct&"<html><body><img src=" & path_image & "/logo.gif' alt='logo' title='logo' />"
ct = ct&"<p><center>Le contrôle de la facture fait apparaitre une anomalie</p>"
ct = ct&"<p>la commande est annulée</p>"
ct = ct&"<p>Vous pouvez consulter votre compte Paypal à <a href='http://www.paypal.fr'>http://www.paypal.fr</a></p>"
ct=ct&"</body></html>"

Mailsubject = "ANNOMALIES"
%>
<!-- #include file="mail.inc"-->
<%
	
     end if  
               
case "pending"

log_name = "\log\logpendding.txt"
' sauve les données Paypal dans le dossier log
%>
<!-- #include file="log.inc"-->
<%
    
ct=ct&"<html><body><img src=" & path_image & "/logo.gif' alt='logo' title='logo' />"
ct = ct&"<p><center>Paypal à mis le paiement en suspend</p>"
ct = ct&"<p>la commande est en attente de la confirmation de paiement par Paypal</p>"
ct = ct&"<p>Vous pouvez consulter votre compte Paypal à <a href='http://www.paypal.fr'>http://www.paypal.fr</a></p>"
ct=ct&"</body></html>"

Mailsubject = "Attente de paiement"
%>
<!-- #include file="mail.inc"-->
<%

case else

log_name = "\log\logpendding.txt"
' sauve les données Paypal dans le dossier log
%>
<!-- #include file="log.inc"-->
<%

ct=ct&"<html><body><img src=" path_image & "/logo.gif' alt='logo' title='logo' />"
ct = ct&"<p><center>Paypal à mis le paiement en suspend</p>"
ct = ct&"<p>la commande est en attente de la confirmation de paiement par Paypal</p>"
ct = ct&"<p>Vous pouvez consulter votre compte Paypal à <a href='http://www.paypal.fr'>http://www.paypal.fr</a></p>"
ct=ct&"</body></html>"

Mailsubject = "Attente de paiement"
%>
<!-- #include file="mail.inc"-->
<%	
end select
'-----------------------------------------------------------------------------------    
ElseIf (objHttp.responseText = "INVALID") Then

log_name = "\log\loginvalid.txt"
' sauve les données Paypal dans le dossier log
%>
<!-- #include file="log.inc"-->
<%
	       
ct = ct&"<html><body><p>La réponse de Paypal à cet Notification de Payement est: " & "<b>" & objHttp.responseText & "</b></p>"
ct = ct&"<p>Nom : " & last_name & " " & first_name  & "<br>Paypal à rejeté votre carte bancaire !</p>"
ct = ct&"<p>Vous pouvez payer par chèque si vous le désirez à bientôt sur " & mail_boutique & "</p>"
ct = ct&"<a href='contact.asp'>Contacter Xavier</a></body></html>"

Mailsubject = "Paiement Paypal refusé"
%>
<!-- #include file="mail.inc"-->
<%

else
	response.redirect "http://" & testurl & "/erreur2.asp"
end if
set objHttp = nothing
%>