From 5b7e07c19fd4b3d3bfa713aa4f3df43df3bf9204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 22 Nov 2013 12:48:31 +0100 Subject: [PATCH] [CLEAN] paymant_acquirer_paypal: cleaned controllers code bzr revid: tde@openerp.com-20131122114831-6id2u613e92yzwcy --- .../controllers/main.py | 98 ++++++------------- 1 file changed, 31 insertions(+), 67 deletions(-) diff --git a/addons/payment_acquirer_paypal/controllers/main.py b/addons/payment_acquirer_paypal/controllers/main.py index 09321631db0..5f1a3259494 100644 --- a/addons/payment_acquirer_paypal/controllers/main.py +++ b/addons/payment_acquirer_paypal/controllers/main.py @@ -1,30 +1,11 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2013-Today OpenERP SA (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## from openerp.addons.web import http from openerp.addons.web.http import request -# from openerp.addons.payment_acquirer.models.payment_acquirer import ValidationError from openerp.addons.website.models import website import logging +import pprint import requests from urllib import urlencode @@ -36,64 +17,47 @@ class PaypalController(http.Controller): _return_url = '/payment/paypal/dpn/' _cancel_url = '/payment/paypal/cancel/' + def paypal_validate_data(self, **post): + """ Paypal IPN: three steps validation to ensure data correctness + + - step 1: return an empty HTTP 200 response -> will be done at the end + by returning '' + - step 2: POST the complete, unaltered message back to Paypal (preceded + by cmd=_notify-validate), with same encoding + - step 3: paypal send either VERIFIED or INVALID (single word) + + Once data is validated, process it. """ + res = False + paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr" + post_url = '%s?cmd=_notify-validate&%s' % (paypal_url, urlencode(post)) + resp = requests.post(post_url) + if resp.text == 'VERIFIED': + _logger.info('Paypal: validated data') + cr, uid, context = request.cr, request.uid, request.context + res = request.registry['payment.transaction'].form_feedback(cr, uid, post, 'paypal', context=context) + elif resp.text == 'INVALID': + _logger.warning('Paypal: answered INVALID on data verification') + else: + _logger.warning('Paypal: unrecognized paypal answer, received %s instead of VERIFIED or INVALID' % resp.text) + return res + @website.route([ '/payment/paypal/ipn/', ], type='http', auth='public') def paypal_ipn(self, **post): - print 'Entering paypal_ipn with post', post - # step 1: return an empty HTTP 200 response -> will be done at the end by returning '' - - # step 2: POST the complete, unaltered message back to Paypal (preceded by cmd=_notify-validate), with same encoding - paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr" - post_url = '%s?cmd=_notify-validate&%s' % (paypal_url, urlencode(post)) - resp = requests.post(post_url) - print '\tReceived response', resp, resp.text - - # step 3: paypal send either VERIFIED or INVALID (single word) - if resp.text == 'VERIFIED': - _logger.info('Paypal: received verified IPN') - cr, uid, context = request.cr, request.uid, request.context - payment_transaction = request.registry['payment.transaction'] - res = payment_transaction.paypal_form_feedback(cr, uid, post, context=context) - print '\tValidation result', res - elif resp.text == 'INVALID': - _logger.warning('Paypal: received invalid IPN with post %s' % post) - else: - _logger.warning('Paypal: received unrecognized IPN with post %s' % post) - + """ Paypal IPN. """ + _logger.info('Beginning Paypal IPN form_feedback with post data %s', pprint.pformat(post)) # debug + self.paypal_validate_data(**post) return '' @website.route([ '/payment/paypal/dpn', ], type='http', auth="public") def paypal_dpn(self, **post): - """ TODO - """ - cr, uid, context = request.cr, request.uid, request.context - print 'Entering paypal_dpn with post', post - - # step 1: return an empty HTTP 200 response -> will be done at the end by returning '' - - # step 2: POST the complete, unaltered message back to Paypal (preceded by cmd=_notify-validate), with same encoding - paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr" - post_url = '%s?cmd=_notify-validate&%s' % (paypal_url, urlencode(post)) - resp = requests.post(post_url) - print '\tReceived response', resp, resp.text - - # step 3: paypal send either VERIFIED or INVALID (single word) - if resp.text == 'VERIFIED': - _logger.info('Paypal: received verified IPN') - cr, uid, context = request.cr, request.uid, request.context - payment_transaction = request.registry['payment.transaction'] - res = payment_transaction.paypal_form_feedback(cr, uid, post, context=context) - print '\tValidation result', res - elif resp.text == 'INVALID': - _logger.warning('Paypal: received invalid IPN with post %s' % post) - else: - _logger.warning('Paypal: received unrecognized IPN with post %s' % post) - + """ Paypal DPN """ + _logger.info('Beginning Paypal DPN form_feedback with post data %s', pprint.pformat(post)) # debug + self.paypal_validate_data(**post) return_url = post.pop('return_url', '/') - print 'return_url', return_url return request.redirect(return_url) @website.route([