Téléchargement de panier personnalisé sur PayPal à partir de la page PHP en utilisant la publication

StackOverflow https://stackoverflow.com/questions/5991534

Question

J'utilise la norme de paiement du site Web sur PayPal. J'ai donc une page d'achat personnalisée qui est essentiellement une liste de mes licences (tirée de la base de données):

licence type A: $100
licence type B: $200
licence type C: $300

Ils choisissent l'un de ceux-ci (bouton radio) puis cliquez sur le bouton d'achat. Cette page publie la page de ma page PHP de traitement qui obtient la LICECTY_ID sélectionnée à partir de la page précédente, puis utilise cela pour sélectionner les informations correctes de licence dans la base de données (prix, durée de licence), etc. Ensuite, il stocke une nouvelle licence pour l'utilisateur (mais Des notes aussi impayées que le paiement PayPal ne se sont pas encore produites).

Ensuite, mon code PHP redirige vers le site PayPal pour le paiement en utilisant le code suivant:

// Set the transaction details to be sent to PayPal
$urlParams = array(
    'cmd' => '_cart',
    'upload' => 1,
    'charset' => 'utf-8',
    'business' => my_business_email@domain.com,
    'return' => 'http://mysite.com/paymentprocessed.php',
    'currency_code' => 'NZD',
    'amount_1' => $licencePrice,
    'item_name_1' => $licenceName,
    'quantity_1' => 1
);

// Build the URL
$urlParams = http_build_query($urlParams, '', '&');
$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

header('location:' .$url. '?' . $urlParams);
exit();

Cela redirige essentiellement l'utilisateur et envoie les paramètres via Get to PayPal. Étonnamment ça marche! Cependant, le problème de sécurité évident est que l'utilisateur peut simplement modifier les variables dans la barre d'adresse et modifier le prix pour obtenir une licence bon marché / gratuite.

Est-il donc possible d'amener ma page PHP à publier les informations à la place et à rediriger le navigateur vers cette page afin que l'utilisateur puisse terminer la transaction PayPal? Par conséquent, les données critiques sont publiées directement à partir de mon serveur Web vers PayPal, l'utilisateur n'aurait aucun moyen de modifier les informations de paiement.

Je suppose que vous pouvez utiliser l'IPN pour vous assurer qu'ils ont payé le bon montant, ce que je ferai toujours de toute façon. Mais j'aimerais toujours tout envoyer via Get.

Merci!

Était-ce utile?

La solution

La meilleure solution serait d'utiliser Express Checkout. Cela vous permet beaucoup plus de flexibilité que les boutons standard ne peuvent jamais vous offrir.

Si vous pensez que si vous faites IPN, vous êtes suffisamment capable d'intégrer le paiement Express. Tout cela est vraiment, c'est 1 appel API, suivi d'une redirection vers PayPal, et un minimum de 1 appel API supplémentaire pour finaliser le paiement.

Un flux typique aurait l'air comme suit:
1. Appelez l'API SetExpressCheckout. Si vous êtes nouveau dans ce domaine, il est rendu mortel avec l'interface API NVP de PayPal. Vous pouvez simplement envoyer les données en tant que chaîne NVP pour https://api-3t.paypal.com/nvp et récupérez une réponse dans le même format.
2. Prenez le jeton de la réponse et redirigez vers https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=xxxxxx (https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=xxxxxx pour les tests de bac à sable)
3. Dès que l'acheteur sera retourné, PayPal ajoutera un payerid à votre retoururl. Si vous ne le trouvez pas, appelez l'API GetExpressCheckoutDetails et fournissez votre jeton pour le récupérer.
4. Avec le payerid et le jeton, appelez DoExpressCheckoutPayment pour finaliser le paiement.

Pour commencer avec cela, je vous suggère de regarder le SDK PHP NVP qu'ils offrent à https://www.x.com/community/ppx/sdks#nvp

Autres conseils

Comment puis-je envoyer des données de poste avec une redirection? Réponse courte: vous ne pouvez pas.

Réponse longue: une demande de poste se produit entre le client et le serveur cible. Les données ne sont pas incluses dans les en-têtes ou même l'URL (comme ce serait le cas avec une demande GET), mais en tant que charge utile séparée. Cela signifie que votre seul choix basé sur le client est vraiment un formulaire de soumission automatique envoyé au navigateur.

L'autre question serait de savoir pourquoi il est si important pour vous de serrer vos données dans une redirection. Avant d'essayer de forcer les protocoles existants dans des choses pour lesquelles ils n'étaient pas conçus, vous voudrez peut-être réévaluer votre conception. Prenez quelques pas en arrière et essayez de trouver un moyen d'atteindre votre objectif général par des moyens plus simples. Le résultat vous permetra probablement de vous éviter, ainsi qu'à vos visiteurs, de nombreux maux de tête sur la route.

L'une des alternatives possibles serait de stocker votre côté serveur de données, comme Ergophobe semble le suggérer. Vous pouvez le retreive à nouveau sur la base d'un cookie ou d'une variable CGI ordinaire dans une demande GET.

Cmiiw :)

Vous pouvez utiliser PayPal IPN pour publier un rappel pour voir si le prix de la licence correspond à la licence que le client vient d'acheter.

PAYPAL IPN Exemple de php

Et vous pouvez également stocker la commande dans une base de données, puis vérifier les détails de la commande lorsque le paiement est effectué. Si la commande ne correspond pas, elle affichera un message AA de votre choix.

Je ne sais pas comment gérer les demandes PayPal, mais le simple fait de changer GET à publier n'est pas une protection. Les utilisateurs avancés peuvent toujours accéder au POST VARS et les modifier. Il devrait y avoir un mécanisme fourni par PayPal qui sécurise votre intégrité de données!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top