Implement all charge events

issue6960
review36831002
This commit is contained in:
Cédric Krier
2018-01-12 13:09:11 +01:00
parent a3d0f1a019
commit 8a811d9da4
3 changed files with 71 additions and 4 deletions
+1
View File
@@ -1,3 +1,4 @@
* Support all charge events
* Support dispute
Version 4.6.0 - 2017-10-30
+26 -4
View File
@@ -496,8 +496,14 @@ class Account(ModelSQL, ModelView):
type_ = payload['type']
if type_ == 'charge.succeeded':
return self.webhook_charge_succeeded(data)
if type_ == 'charge.captured':
return self.webhook_charge_captured(data)
elif type_ == 'charge.failed':
return self.webhook_charge_failed(data)
elif type_ == 'charge.pending':
return self.webhook_charge_pending(data)
elif type_ == 'charge.refunded':
return self.webhook_charge_refunded(data)
elif type_ == 'charge.dispute.created':
return self.webhook_charge_dispute_created(data)
elif type_ == 'charge.dispute.closed':
@@ -510,7 +516,7 @@ class Account(ModelSQL, ModelView):
return self.webhook_source_canceled(data)
return None
def webhook_charge_succeeded(self, payload):
def webhook_charge_succeeded(self, payload, _event='charge.succeeded'):
pool = Pool()
Payment = pool.get('account.payment')
@@ -519,16 +525,32 @@ class Account(ModelSQL, ModelView):
('stripe_charge_id', '=', charge['id']),
])
if not payments:
logger.error("charge.succeeded: No payment '%s'", charge['id'])
logger.error(": No payment '%s'", _event, charge['id'])
for payment in payments:
# TODO: remove when https://bugs.tryton.org/issue4080
with Transaction().set_context(company=payment.company.id):
if payment.state == 'succeeded':
Payment.fail([payment])
payment.stripe_captured = charge['captured']
payment.stripe_amount = (
charge['amount'] - charge['amount_refunded'])
payment.save()
if charge['status'] == 'succeeded' and charge['captured']:
Payment.succeed([payment])
if payment.amount:
if charge['status'] == 'succeeded' and charge['captured']:
Payment.succeed([payment])
else:
Payment.fail([payment])
return bool(payments)
def webhook_charge_captured(self, payload):
return self.webhook_charge_succeeded(payload, _event='charge.captured')
def webhook_charge_pending(self, payload):
return self.webhook_charge_succeeded(payload, _event='charge.pending')
def webhook_charge_refunded(self, payload):
return self.webhook_charge_succeeded(payload, _event='charge.pending')
def webhook_charge_failed(self, payload):
pool = Pool()
Payment = pool.get('account.payment')
+44
View File
@@ -277,3 +277,47 @@ Capture lower amount::
u'succeeded'
>>> bool(payment.stripe_captured)
True
Simulate charge.refunded event with partial amount::
>>> StripeAccount.webhook([stripe_account], {
... 'type': 'charge.refunded',
... 'data': {
... 'object': {
... 'id': payment.stripe_charge_id,
... 'object': 'charge',
... 'amount': 4200,
... 'amount_refunded': 4000,
... 'captured': True,
... 'status': 'succeeded',
... },
... },
... }, {})
[True]
>>> payment.reload()
>>> payment.amount
Decimal('2.00')
>>> payment.state
u'succeeded'
Simulate charge.refunded event with full amount::
>>> StripeAccount.webhook([stripe_account], {
... 'type': 'charge.refunded',
... 'data': {
... 'object': {
... 'id': payment.stripe_charge_id,
... 'object': 'charge',
... 'amount': 4200,
... 'amount_refunded': 4200,
... 'captured': True,
... 'status': 'succeeded',
... },
... },
... }, {})
[True]
>>> payment.reload()
>>> payment.amount
Decimal('0.00')
>>> payment.state
u'failed'