Example #1
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    
    """

    logging.info(request)

    form = PayPalIPNForm(request.POST)

    logging.info(form)
    logging.info(form.is_valid())

    if form.is_valid():
        try:
            ipn_obj = form.save(commit=False)
            logging.info(ipn_obj)
        except Exception, e:
            logging.error(e)
            ipn_obj = PayPalIPN()
            ipn_obj.set_flag("Exception while processing. (%s)" % form.errors)
            logging.info(ipn_obj)
Example #2
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    data = request.POST.copy()
    date_fields = ('time_created', 'payment_date', 'next_payment_date',
                   'subscr_date', 'subscr_effective')
    for date_field in date_fields:
        if data.get(date_field) == 'N/A':
            del data[date_field]

    form = PayPalIPNForm(data)
    if form.is_valid():
        try:
            ipn_obj = form.save(commit=False)
        except Exception, e:
            flag = "Exception while processing. (%s)" % e
def create_ipn(request):
    flag = None
    ipnObj = None
    form = PayPalIPNForm(request.POST)
    if form.is_valid():
        try:
            ipnObj = form.save(commit=False)
        except Exception as e:
            flag = 'Exception while processing. (%s)' % e
    else:
        flag = 'Invalid form. (%s)' % form.errors
    if ipnObj is None:
        ipnObj = PayPalIPN()
    ipnObj.initialize(request)
    if flag is not None:
        ipnObj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            ipnObj.verify_secret(form, request.GET['secret'])
        else:
            donation = get_ipn_donation(ipnObj)
            if not donation:
                raise Exception('No donation associated with this IPN')
            verify_ipn_recipient_email(ipnObj, donation.event.paypalemail)
            ipnObj.verify()
    ipnObj.save()
    return ipnObj
Example #4
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    data = request.POST.copy()
    date_fields = ('time_created', 'payment_date', 'next_payment_date',
                   'subscr_date', 'subscr_effective')
    for date_field in date_fields:
        if data.get(date_field) == 'N/A':
            del data[date_field]

    form = PayPalIPNForm(data)
    if form.is_valid():
        try:
            #When commit = False, object is returned without saving to DB.
            ipn_obj = form.save(commit=False)
        except Exception, e:
            flag = "Exception while processing. (%s)" % e
Example #5
0
def create_ipn(request):
  flag = None
  ipnObj = None
  form = PayPalIPNForm(request.POST)
  if form.is_valid():
    try:
      ipnObj = form.save(commit=False)
    except Exception as e:
      flag = "Exception while processing. (%s)" % e
  else:
    flag = "Invalid form. (%s)" % form.errors
  if ipnObj is None:
    ipnObj = PayPalIPN()
  ipnObj.initialize(request)
  if flag is not None:
    ipnObj.set_flag(flag)
  else:
    # Secrets should only be used over SSL.
    if request.is_secure() and 'secret' in request.GET:
      ipnObj.verify_secret(form, request.GET['secret'])
    else:
      donation = get_ipn_donation(ipnObj)
      if not donation:
        raise Exception('No donation associated with this IPN: Custom field value {!r}'.format(ipnObj.custom))
      ipnObj.verify()

      # Check if receiver email matches event here.  This removes the need for a custom fork of django-paypal.
      business = donation.event.paypalemail
      if (ipnObj.business and ipnObj.business.lower() != business.lower()) or (
              not ipnObj.business and ipnObj.receiver_email.lower() != business.lower()):
        ipnObj.set_flag("Business email mismatch. (%s)" % ipnObj.business)

  ipnObj.save()
  return ipnObj
Example #6
0
def create_ipn(request):
  flag = None
  ipnObj = None
  form = PayPalIPNForm(request.POST)
  if form.is_valid():
    try:
      ipnObj = form.save(commit=False)
    except Exception, e:
      flag = "Exception while processing. (%s)" % e
Example #7
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d

    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    data = request.POST.copy()
    date_fields = ('time_created', 'payment_date', 'next_payment_date',
                   'subscr_date', 'subscr_effective')
    for date_field in date_fields:
        if data.get(date_field) == 'N/A':
            del data[date_field]

    form = PayPalIPNForm(data)
    if form.is_valid():
        try:
            #When commit = False, object is returned without saving to DB.
            ipn_obj = form.save(commit=False)
        except Exception as e:
            flag = "Exception while processing. (%s)" % e
    else:
        flag = "Invalid form. (%s)" % form.errors

    if ipn_obj is None:
        ipn_obj = PayPalIPN()

    #Set query params and sender's IP address
    ipn_obj.initialize(request)

    if flag is not None:
        #We save errors in the flag field
        ipn_obj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            ipn_obj.verify_secret(form, request.GET['secret'])
        else:
            ipn_obj.verify(item_check_callable)

    ipn_obj.save()
    return HttpResponse("OKAY")
Example #8
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    # Also, need to cope with custom encoding, which is stored in the body (!).
    # Assuming the tolerate parsing of QueryDict and an ASCII-like encoding,
    # such as windows-1252, latin1 or UTF8, the following will work:

    encoding = request.POST.get('charset', None)

    if encoding is None:
        flag = "Invalid form - no charset passed, can't decode"
        data = None
    else:
        try:
            data = QueryDict(request.raw_post_data, encoding=encoding).dict()
        except LookupError:
            data = None
            flag = "Invalid form - invalid charset"

    if data is not None:
        date_fields = ('time_created', 'payment_date', 'next_payment_date',
                       'subscr_date', 'subscr_effective')
        for date_field in date_fields:
            if data.get(date_field) == 'N/A':
                del data[date_field]

        form = PayPalIPNForm(data)
        if form.is_valid():
            try:
                #When commit = False, object is returned without saving to DB.
                ipn_obj = form.save(commit=False)
            except Exception, e:
                flag = "Exception while processing. (%s)" % e
        else:
            flag = "Invalid form. (%s)" % form.errors
Example #9
0
 def test_invalid_date_format(self):
     data = {'payment_date': "2015-10-25 01:21:32"}
     form = PayPalIPNForm(data)
     self.assertFalse(form.is_valid())
     self.assertIn(form.errors, [{
         'payment_date': [
             'Invalid date format '
             '2015-10-25 01:21:32: '
             'need more than 2 values to unpack'
         ]
     }, {
         'payment_date': [
             'Invalid date format '
             '2015-10-25 01:21:32: '
             'not enough values to unpack '
             '(expected 5, got 2)'
         ]
     }])
Example #10
0
 def test_invalid_date_format(self):
     data = {"payment_date": "2015-10-25 01:21:32"}
     form = PayPalIPNForm(data)
     self.assertFalse(form.is_valid())
     self.assertIn(
         form.errors,
         [
             {"payment_date": ["Invalid date format " "2015-10-25 01:21:32: " "need more than 2 values to unpack"]},
             {
                 "payment_date": [
                     "Invalid date format "
                     "2015-10-25 01:21:32: "
                     "not enough values to unpack "
                     "(expected 5, got 2)"
                 ]
             },
         ],
     )
Example #11
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    #set the encoding of the request, so that request.POST can be correctly decoded.
    #see https://github.com/johnboxall/django-paypal/issues/32
    #https://code.djangoproject.com/ticket/14035, worth noting, but this doesn't
    # affect this ipn view as there won't be uploaded files.
    encoding = request.POST.get('charset', '')
    try:
        codecs.getdecoder(encoding)  # check if the codec exists
        request.encoding = encoding
    except:
        pass

    # Clean up the data as PayPal sends some weird values such as "N/A"
    data = request.POST.copy()
    date_fields = ('time_created', 'payment_date', 'next_payment_date',
                   'subscr_date', 'subscr_effective')
    for date_field in date_fields:
        if data.get(date_field) == 'N/A':
            del data[date_field]

    form = PayPalIPNForm(data)
    if form.is_valid():
        try:
            #When commit = False, object is returned without saving to DB.
            ipn_obj = form.save(commit=False)
        except Exception, e:
            flag = "Exception while processing. (%s)" % e
Example #12
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d

    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    # TODO: Clean up code so that we don't need to set None here and have a lot
    #       of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    # Also, need to cope with custom encoding, which is stored in the body (!).
    # Assuming the tolerant parsing of QueryDict and an ASCII-like encoding,
    # such as windows-1252, latin1 or UTF8, the following will work:
    encoding = request.POST.get('charset', None)

    encoding_missing = encoding is None
    if encoding_missing:
        encoding = DEFAULT_ENCODING

    try:
        data = QueryDict(request.body, encoding=encoding).copy()
    except LookupError:
        data = None
        flag = "Invalid form - invalid charset"

    if data is not None:
        if hasattr(PayPalIPN._meta, 'get_fields'):
            date_fields = [
                f.attname for f in PayPalIPN._meta.get_fields()
                if f.__class__.__name__ == 'DateTimeField'
            ]
        else:
            date_fields = [
                f.attname for f, m in PayPalIPN._meta.get_fields_with_model()
                if f.__class__.__name__ == 'DateTimeField'
            ]

        for date_field in date_fields:
            if data.get(date_field) == 'N/A':
                del data[date_field]

        form = PayPalIPNForm(data)
        if form.is_valid():
            try:
                # When commit = False, object is returned without saving to DB.
                ipn_obj = form.save(commit=False)
            except Exception as e:
                flag = "Exception while processing. (%s)" % e
        else:
            flag = "Invalid form. ({0})".format(", ".join([
                "{0}: {1}".format(k, ", ".join(v))
                for k, v in form.errors.items()
            ]))

    if ipn_obj is None:
        ipn_obj = PayPalIPN()

    # Set query params and sender's IP address
    ipn_obj.initialize(request)

    if flag is not None:
        # We save errors in the flag field
        ipn_obj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            ipn_obj.verify_secret(form, request.GET['secret'])
        else:
            ipn_obj.verify(item_check_callable)

    ipn_obj.save()
    ipn_obj.send_signals()

    if encoding_missing:
        # Wait until we have an ID to log warning
        log.warning("No charset passed with PayPalIPN: %s. Guessing %s",
                    ipn_obj.id, encoding)

    return HttpResponse("OKAY")
Example #13
0
def ipn(request, item_check_callable=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    # Also, need to cope with custom encoding, which is stored in the body (!).
    # Assuming the tolerant parsing of QueryDict and an ASCII-like encoding,
    # such as windows-1252, latin1 or UTF8, the following will work:

    encoding = request.POST.get('charset', None)

    if encoding is None:
        flag = "Invalid form - no charset passed, can't decode"
        data = None
    else:
        try:
            data = QueryDict(request.body, encoding=encoding,
                             mutable=True).copy()
        except LookupError:
            data = None
            flag = "Invalid form - invalid charset"

    if data is not None:
        date_fields = ('time_created', 'payment_date', 'next_payment_date',
                       'subscr_date', 'subscr_effective')
        for date_field in date_fields:
            if data.get(date_field) == 'N/A':
                del data[date_field]

        form = PayPalIPNForm(data)
        if form.is_valid():
            try:
                #When commit = False, object is returned without saving to DB.
                ipn_obj = form.save(commit=False)
            except Exception as e:
                flag = "Exception while processing. (%s)" % e
        else:
            flag = "Invalid form. (%s)" % form.errors

    if ipn_obj is None:
        ipn_obj = PayPalIPN()

    #Set query params and sender's IP address
    ipn_obj.initialize(request)

    if flag is not None:
        #We save errors in the flag field
        ipn_obj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            ipn_obj.verify_secret(form, request.GET['secret'])
        else:
            ipn_obj.verify(item_check_callable)

    ipn_obj.save()
    ipn_obj.send_signals()
    return HttpResponse("OKAY")
Example #14
0
def ipn(request, item_check_callable=None, host_id=None, trans_id=None):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d
    
    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    
    #what triggers this view?
    """
    #TODO: Clean up code so that we don't need to set None here and have a lot
    #      of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Clean up the data as PayPal sends some weird values such as "N/A"
    # Also, need to cope with custom encoding, which is stored in the body (!).
    # Assuming the tolerant parsing of QueryDict and an ASCII-like encoding,
    # such as windows-1252, latin1 or UTF8, the following will work:

    encoding = request.POST.get('charset', None)

    if encoding is None:
        flag = "Invalid form - no charset passed, can't decode"
        data = None
    else:
        try:
            data = QueryDict(request.body, encoding=encoding).copy()
        except LookupError:
            data = None
            flag = "Invalid form - invalid charset"

    if data is not None:
        date_fields = ('time_created', 'payment_date', 'next_payment_date',
                       'subscr_date', 'subscr_effective')
        for date_field in date_fields:
            if data.get(date_field) == 'N/A':
                del data[date_field]

        form = PayPalIPNForm(
            data)  #from paypal.standard.ipn.forms import PayPalIPNForm
        if form.is_valid():
            try:
                #When commit = False, object is returned without saving to DB.
                ipn_obj = form.save(commit=False)
            except Exception as e:
                flag = "Exception while processing. (%s)" % e
        else:
            flag = "Invalid form. (%s)" % form.errors

    if ipn_obj is None:
        ipn_obj = PayPalIPN(
        )  #from paypal.standard.ipn.models import PayPalIPN

    #Set query params and sender's IP address
    ipn_obj.initialize(request)

    #Store the invoice value so i can use it to update the transactions model
    invoice_sent = ipn_obj.invoice

    #Add other host characteristicsto the model
    #Eventually add transaction_id to the ipn_obj model
    if host_id:
        host = get_object_or_404(UserInfo, pk=host_id)
        ipn_obj.host_email = host.email
        ipn_obj.host_fname = host.first_name
        ipn_obj.host_lname = host.last_name
        ipn_obj.host_st_address1 = host.st_address1
        ipn_obj.host_st_address2 = host.st_address2
    if trans_id:
        trans = Transaction.objects.get(pk=trans_id)
        ipn_obj.trans_table_id = trans.id
    #the following set_flag is defined in paypal.standard.modle.spy, flat var is passed as the "info" parameter
    if flag is not None:
        #We save errors in the flag field
        ipn_obj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            ipn_obj.verify_secret(form, request.GET['secret'])
        else:
            ipn_obj.verify(item_check_callable)

    ipn_obj.save()
    ipn_obj.send_signals()

    #JMY ADDED: Update the Transaction Table to confirm we need to transation ID but only have invoice on the paypal IPN
    if trans_id:
        trans.payment_processed = True
        trans_table_id = trans.id
        trans.payment_method = "Paypal"
        trans.save()
        #update the userinfo table to add an account balance
        new_balance = trans.balance_created_packages
        userinfo = UserInfo.objects.get(pk=trans.enduser.id)
        if new_balance:
            userinfo.account_balance_packages = new_balance
            userinfo.save()
        #send emails
        notify_host_shipment_paid(request, trans_table_id)
        notify_enduser_shipment_paid(request, trans_table_id)
    return HttpResponse("OKAY")
Example #15
0
def paypal_ipn_location(request,item_check_callable=None):
    
    flag = None

    ipn_obj = None

    form = PayPalIPNForm(request.POST)
        
    if form.is_valid():

        try:
            
            ipn_obj = form.save(commit=False)

            if(ipn_obj.txn_type=='subscr_cancel'):
                
                user = User.objects.get(id=int(ipn_obj.custom))
                #print "\n %s just cancelled subscription \n"%(user.username)
                profile = user.profile
                profile.paid=False

                if(ipn_obj.item_name=='Standard 1 Month'):
                    profile.s_monthly=False
                elif(ipn_obj.item_name=='Standard 6 Month'):
                    profile.s_6month=False
                elif(ipn_obj.item_name=='Standard 12 Month'):
                    profile.s_12month=False
                elif(ipn_obj.item_name=='Gold 1 Month'):
                    profile.g_monthly=False
                elif(ipn_obj.item_name=='Gold 6 Month'):
                    profile.g_6month=False
                elif(ipn_obj.item_name=='Gold 12 Month'):
                    profile.g_12month=False
                    
                profile.save()
                
                
            elif(ipn_obj.txn_type=='subscr_signup'):
                
                user = User.objects.get(id=int(ipn_obj.custom))
                #print "\n %s just Subscribed. %s\n"%(user.username,ipn_obj.item_name)
                profile = user.profile
                profile.paid=True

                if(ipn_obj.item_name=='Standard 1 Month'):
                    profile.s_monthly=True
                elif(ipn_obj.item_name=='Standard 6 Month'):
                    profile.s_6month=True
                elif(ipn_obj.item_name=='Standard 12 Month'):
                    profile.s_12month=True
                elif(ipn_obj.item_name=='Gold 1 Month'):
                    profile.g_monthly=True
                elif(ipn_obj.item_name=='Gold 6 Month'):
                    profile.g_6month=True
                elif(ipn_obj.item_name=='Gold 12 Month'):
                    profile.g_12month=True
                
                profile.save()
                
            elif(ipn_obj.txn_type=='web_accept' and ipn_obj.item_name=='SocialPerks Campaign Payment'):
                campaign = Campaign.objects.get(id=int(ipn_obj.custom))
                campaign.paid=True
                campaign.save()
                
                

        except Exception, e:

            flag = "Exception while processing. (%s)" % e
Example #16
0
def payment_ipn_view(request, id, organisation_name):
    """
    PayPal IPN endpoint (notify_url).
    Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
    http://tinyurl.com/d9vu9d

    PayPal IPN Simulator:
    https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
    """
    # TODO: Clean up code so that we don't need to set None here and have a lot
    #       of if checks just to determine if flag is set.
    flag = None
    ipn_obj = None

    # Avoid the RawPostDataException. See original issue for details:
    # https://github.com/spookylukey/django-paypal/issues/79
    if not request.META.get('CONTENT_TYPE', '').startswith(
            'application/x-www-form-urlencoded'):
        raise AssertionError(CONTENT_TYPE_ERROR)

    # Clean up the data as PayPal sends some weird values such as "N/A"
    # Also, need to cope with custom encoding, which is stored in the body (!).
    # Assuming the tolerant parsing of QueryDict and an ASCII-like encoding,
    # such as windows-1252, latin1 or UTF8, the following will work:
    encoding = request.POST.get('charset', None)

    encoding_missing = encoding is None
    if encoding_missing:
        encoding = DEFAULT_ENCODING

    try:
        data = QueryDict(request.body, encoding=encoding).copy()
    except LookupError:
        warn_untested()
        data = None
        flag = "Invalid form - invalid charset"

    if data is not None:
        if hasattr(PayPalIPN._meta, 'get_fields'):
            date_fields = [f.attname for f in PayPalIPN._meta.get_fields() if f.__class__.__name__ == 'DateTimeField']
        else:
            date_fields = [f.attname for f, m in PayPalIPN._meta.get_fields_with_model()
                           if f.__class__.__name__ == 'DateTimeField']

        for date_field in date_fields:
            if data.get(date_field) == 'N/A':
                del data[date_field]

        form = PayPalIPNForm(data)
        if form.is_valid():
            try:
                # When commit = False, object is returned without saving to DB.
                ipn_obj = form.save(commit=False)
            except Exception as e:
                flag = "Exception while processing. (%s)" % e
        else:
            formatted_form_errors = ["{0}: {1}".format(k, ", ".join(v)) for k, v in form.errors.items()]
            flag = "Invalid form. ({0})".format(", ".join(formatted_form_errors))

    if ipn_obj is None:
        ipn_obj = PayPalIPN()

    # Set query params and sender's IP address
    ipn_obj.initialize(request)

    if flag is not None:
        # We save errors in the flag field
        ipn_obj.set_flag(flag)
    else:
        # Secrets should only be used over SSL.
        if request.is_secure() and 'secret' in request.GET:
            warn_untested()
            ipn_obj.verify_secret(form, request.GET['secret'])
        else:
            ipn_obj.verify()

    if(ipn_obj.payment_status == 'Completed'):
	    o_Orders = Order.objects.filter(invoiceUID = ipn_obj.invoice)

	    for o_Order in o_Orders:
		    o_Order.isPayed = True
		    o_Order.save()

	    sendDankesEmail(ipn_obj)

    ipn_obj.save()
    ipn_obj.send_signals()

    if encoding_missing:
        # Wait until we have an ID to log warning
        logger.warning("No charset passed with PayPalIPN: %s. Guessing %s", ipn_obj.id, encoding)

    return HttpResponse("OKAY")