JAVA – Playframework and Paypal IPN
Dans ce post nous allons réaliser une transaction avec paypal à l’aide du framework play.
Prérequis :
- Création d’un compte sandbox pour les dev : https://developer.paypal.com/
- création du compte acheteur
- création du compte vendeur
On ne détail pas la procédure, le billet sur la ferme du web est très clair. Vous retrouverez toute la doc IPN ici
Une fois les comptes configurés correctement, nous allons reprendre le code source disponible sur le site paypal : code source java ; que nous adapterons avec le framework play :
public class PaypalController extends Controller {
public static void validation() throws Exception {
Logger.info("validation");
// creation de l'url a envoyé à paypal pour vérification
//on recupere les parametres de la requetes POST
String str = "cmd=_notify-validate&" + params.get("body");
Logger.info(str);
//création d'une connection à la sandbox paypal
URL url = new URL("https://www.sandbox.paypal.com/cgi-bin/webscr");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//envoi de la requête
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.println(str);
out.close();
//lecture de la réponse
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = in.readLine();
in.close();
Après vérification de l’IPN recu par paypal, si la requête a été accepté, nous receveons 2 valeurs : VERIFIED / INVALID. Si le résultat est « VERIFIED », on procède à la vérification des paramètres : status, prix, mail… On sauvegarde la transaction paypal envoyé; pour éviter de la traiter à nouveau.
// assign posted variables to local variables
String itemName = params.get("item_name");
String itemNumber = params.get("item_number");
String paymentStatus = params.get("payment_status");
String paymentAmount = params.get("mc_gross");
String paymentCurrency = params.get("mc_currency");
String txnId = params.get("txn_id");
String receiverEmail = params.get("receiver_email");
String payerEmail = params.get("payer_email");
//check notification validation
if("VERIFIED".equals(result)) {
if ("Completed".equals(paymentStatus)) {
// on vérife que la txn_id n'a pas été traité précédemment
PaypalTransaction paypalTransaction = PaypalTransaction.findByTrxId(txnId);
// si aucune transaction en base ou si transaction mais en status invalide
// on traite la demande
if (paypalTransaction == null
|| (paypalTransaction != null && PaypalTransaction.TrxStatusEnum.INVALID.equals(paypalTransaction.status))) {
// on vérifie que receiver_email est votre adresse email
// a remplacer par l'adresse mail du vendeur
if ("seller@paypalsandbox.com".equals(receiverEmail)) {
// vérifier que paymentAmount (EUR) et paymentCurrency (prix du produit vendu) sont corrects
Logger.info("Transaction OK");
//sauvegarde la trace de la transaction paypal en base
new PaypalTransaction(itemName, itemNumber, paymentStatus, paymentAmount, paymentCurrency, txnId, receiverEmail, payerEmail,PaypalTransaction.TrxStatusEnum.VALID).save();
} else {
// Mauvaise adresse email paypal
Logger.info("Mauvaise adresse email paypal");
}
} else {
// ID de transaction déjà utilisé
Logger.info("La transaction a déjà été traité");
}
} else {
// Statut de paiement: Echec
Logger.info("Statut de paiement: Echec");
}
} else if("INVALID".equals(result)) {
Logger.info("Invalide transaction");
new PaypalTransaction(itemName, itemNumber, paymentStatus, paymentAmount, paymentCurrency, txnId, receiverEmail, payerEmail,PaypalTransaction.TrxStatusEnum.INVALID).save();
} else {
Logger.info("Erreur lors du traitement");
}
}
* Tester votre méthode
La sandbox paypal propose un outil de simulation d’IPN
A noter : Vous pouvez tester votre méthode en local, mais vous devez donner l’accès de l’extérieur. Configurer votre ip internet pour qu’elle puisse être accessible de l’extérieur. De même, l’outil de simulation à des difficultés d’accéder à d’autre port que 80. Vous trouverez plus d’information dans ce post : https://www.x.com/thread/46955. Pour mes tests, je lance l’application avec le port 80.
IPN handler URL : http://mon_ip:80/paypalcontroller/validation
Transaction type : Web accept
Les sources du projets sont disponible à l’adresse suivante : https://github.com/guillaumeleone/play-paypal
Leave a Reply
You must be logged in to post a comment.
