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)
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
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
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
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
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")
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
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)' ] }])
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)" ] }, ], )
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
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")
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")
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")
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
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")