Example #1
0
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)
Example #2
0
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'])