def chargeback(request): """ Verify signature from BlueVia and create a refund contribution tied to the original transaction. """ signed_jwt = request.read() # Check the JWT we've got is valid. try: data = parse_from_bluevia(signed_jwt, request.META.get('REMOTE_ADDR')) except InvalidSender: return http.HttpResponseBadRequest() uuid = data['response']['transactionID'] # Check that we've got a valid uuid. # Looks up the contribution based upon the BlueVia transaction id. try: original = Contribution.objects.get(bluevia_transaction_id=uuid) except Contribution.DoesNotExist: log.info('Not found: %s' % uuid) return http.HttpResponseBadRequest() # Create a refund in our end. Contribution.objects.create(addon_id=original.addon_id, amount=-original.amount, currency=original.currency, paykey=None, price_tier_id=original.price_tier_id, related=original, source=request.REQUEST.get('src', ''), source_locale=request.LANG, type=amo.CONTRIB_REFUND, user_id=original.user_id, uuid=get_uuid()) tasks.chargeback_notify.delay(signed_jwt, original.pk) return http.HttpResponse(uuid)
def postback(request): """Verify signature from BlueVia and set contribution to paid.""" signed_jwt = request.raw_post_data try: data = parse_from_bluevia(signed_jwt, request.META.get('REMOTE_ADDR')) except InvalidSender: return http.HttpResponseBadRequest() pd = urlparse.parse_qs(data['request']['productData']) contrib_uuid = pd['contrib_uuid'][0] try: contrib = Contribution.objects.get(uuid=contrib_uuid) except Contribution.DoesNotExist: etype, val, tb = sys.exc_info() raise LookupError('BlueVia JWT (iss:%s, aud:%s) for trans_id %s ' 'links to contrib %s which doesn\'t exist' % (data['iss'], data['aud'], data['response']['transactionID'], contrib_uuid)), None, tb contrib.update(type=amo.CONTRIB_PURCHASE, bluevia_transaction_id=data['response']['transactionID']) tasks.purchase_notify.delay(signed_jwt, contrib.pk) return http.HttpResponse(data['response']['transactionID'])