[FIX] [IMP] payment_acquirer_paypal: fixed get_status (GET request -> give no data to urllib); cleaned a bit the code, extracted paypal contact to a dedicated method that tries 3 times if internal server error is given back by paypal + cleaned tests

bzr revid: tde@openerp.com-20131127152042-8va86q3zxsenjy6i
This commit is contained in:
Thibault Delavallée 2013-11-27 16:20:42 +01:00
parent cea8f80476
commit 256269242a
3 changed files with 31 additions and 84 deletions

View File

@ -352,6 +352,7 @@ class PaymentTransaction(osv.Model):
return True
def s2s_get_tx_status(self, cr, uid, tx_id, context=None):
""" Get the tx status. """
tx = self.browse(cr, uid, tx_id, context=context)
invalid_param_method_name = '_%s_s2s_get_tx_status' % tx.acquirer_id.name

View File

@ -97,8 +97,10 @@ class AcquirerPaypal(osv.Model):
).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
result = urllib2.urlopen(request).read()
request = urllib2.urlopen(request)
result = request.read()
res[acquirer.id] = json.loads(result).get('access_token')
request.close()
return res
@ -226,6 +228,23 @@ class TxPaypal(osv.Model):
# SERVER2SERVER RELATED METHODS
# --------------------------------------------------
def _paypal_try_url(self, request, tries=3, context=None):
try:
res = urllib2.urlopen(request)
except urllib2.HTTPError as e:
res = e.read()
e.close()
if tries and res and json.loads(res)['name'] == 'INTERNAL_SERVICE_ERROR':
_logger.warning('Failed contacting Paypal, retrying (%s remaining)' % tries)
return self._paypal_try_url(request, tries=tries - 1, context=context)
raise
except:
raise
result = res.read()
res.close()
return result
def _paypal_s2s_send(self, cr, uid, values, cc_values, context=None):
tx_id = self.create(cr, uid, values, context=context)
tx = self.browse(cr, uid, tx_id, context=context)
@ -276,13 +295,8 @@ class TxPaypal(osv.Model):
data = json.dumps(data)
request = urllib2.Request('https://api.sandbox.paypal.com/v1/payments/payment', data, headers)
result = urllib2.urlopen(request)
print 'result', result
res2 = result.read()
print res2
return (tx_id, res2)
result = self._paypal_try_url(request, tries=3, context=context)
return (tx_id, result)
def _paypal_s2s_get_invalid_parameters(self, cr, uid, tx, data, context=None):
invalid_parameters = []
@ -318,14 +332,12 @@ class TxPaypal(osv.Model):
return False
def _paypal_s2s_get_tx_status(self, cr, uid, tx, context=None):
# TDETODO: check tx.paypal_txn_id is set
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer %s' % tx.acquirer_id._paypal_s2s_get_access_token()[tx.acquirer_id.id],
}
data = json.dumps({})
url = 'https://api.sandbox.paypal.com/v1/payments/payment/%s' % (tx.paypal_txn_id)
print url
request = urllib2.Request(url, data, headers)
result = urllib2.urlopen(request)
print result
return True
request = urllib2.Request(url, headers=headers)
data = self._paypal_try_url(request, tries=3, context=context)
return self.s2s_feedback(cr, uid, tx.id, data, context=context)

View File

@ -48,7 +48,7 @@ class PaypalCommon(PaymentAcquirerCommon):
class PaypalServer2Server(PaypalCommon):
def test_00(self):
def test_00_tx_management(self):
cr, uid, context = self.cr, self.uid, {}
res = self.payment_acquirer._paypal_s2s_get_access_token(cr, uid, [self.paypal_id], context=context)
@ -71,75 +71,9 @@ class PaypalServer2Server(PaypalCommon):
)
tx = self.payment_transaction.browse(cr, uid, tx_id, context=context)
print tx.paypal_txn_id
self.payment_transaction.s2s_get_tx_status(cr, uid, tx_id, context=context)
# {
# "id":"PAY-2LL14628DB722091TKKHXZHQ",
# "create_time":"2013-11-22T15:47:42Z",
# "update_time":"2013-11-22T15:48:05Z",
# "state":"pending",
# "intent":"sale",
# "payer": {
# "payment_method":"credit_card",
# "funding_instruments": [{
# "credit_card": {
# "type":"visa",
# "number":"xxxxxxxxxxxx1111",
# "expire_month":"9",
# "expire_year":"2015",
# "first_name":"Norbert Buyer",
# "last_name":"Norbert Buyer",
# "billing_address": {
# "line1":"Huge Street 2/543",
# "city":"Sin City",
# "postal_code":"1000",
# "country_code":"BE"
# }
# }
# }]
# },
# "transactions": [{
# "amount": {
# "total":"0.01",
# "currency":"EUR",
# "details": {
# "subtotal":"0.01"
# }
# },
# "related_resources": [{
# "sale": {
# "id":"4KU52719R3958614J",
# "create_time":"2013-11-22T15:47:42Z",
# "update_time":"2013-11-22T15:48:05Z",
# "state":"pending",
# "amount": {
# "total":"0.01",
# "currency":"EUR"
# },
# "pending_reason":"multicurrency",
# "parent_payment":"PAY-2LL14628DB722091TKKHXZHQ",
# "links": [{
# "href":"https://api.sandbox.paypal.com/v1/payments/sale/4KU52719R3958614J",
# "rel":"self",
# "method":"GET"
# },{
# "href":"https://api.sandbox.paypal.com/v1/payments/sale/4KU52719R3958614J/refund",
# "rel":"refund",
# "method":"POST"
# },{
# "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-2LL14628DB722091TKKHXZHQ",
# "rel":"parent_payment",
# "method":"GET"
# }]
# }
# }]
# }],
# "links": [{
# "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-2LL14628DB722091TKKHXZHQ",
# "rel":"self",
# "method":"GET"
# }]
# }
self.assertTrue(tx.paypal_txn_id is not False, 'paypal: txn_id should have been set after s2s request')
self.payment_transaction.write(cr, uid, tx_id, {'paypal_txn_id': False}, context=context)
class PaypalForm(PaypalCommon):