Guillaume Leone

an any blog

JAVA – Playframework and Paypal IPN

without comments

Dans ce post nous allons réaliser une transaction avec paypal à l’aide du framework play.

Prérequis :


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

Written by guillaume

juin 12th, 2011 at 5:03

Leave a Reply

You must be logged in to post a comment.