def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) if user: kwargs['initial'].setdefault('name_first', user.first_name) kwargs['initial'].setdefault('name_last', user.last_name) kwargs['initial'].setdefault('email_address', user.email) kwargs['initial'].setdefault('notify_url', notify_url()) kwargs['initial'].setdefault('merchant_id', conf.MERCHANT_ID) kwargs['initial'].setdefault('merchant_key', conf.MERCHANT_KEY) super(PayFastForm, self).__init__(*args, **kwargs) # new order reference number is issued each time form is instantiated self.order = PayFastOrder.objects.create( user=user, amount_gross=self.initial['amount'], ) self.initial['m_payment_id'] = self.order.pk # we need self.initial but it is unordered data = OrderedDict() for key in self.fields.keys(): data[key] = self.initial.get(key, None) self._signature = self.fields['signature'].initial = signature(data)
def _notify_data(data, payment_form): notify_data = data.copy() # prepare server data notify_data['m_payment_id'] = payment_form.order.pk notify_data['amount_gross'] = data['amount'] del notify_data['amount'] del notify_data['merchant_key'] notify_data['signature'] = signature(notify_data) return notify_data
def _calculate_itn_signature(cls, data): """ Calculate the PayFast ITN signature of the given data. This orders the keys as per the ITN documentation. """ data = OrderedDict((key, data[key]) for key in cls.base_fields.keys() if key in data and key != 'signature') return signature(data)
def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) if user: kwargs['initial'].setdefault('name_first', user.first_name) kwargs['initial'].setdefault('name_last', user.last_name) kwargs['initial'].setdefault('email_address', user.email) kwargs['initial'].setdefault('notify_url', notify_url()) kwargs['initial'].setdefault('merchant_id', conf.MERCHANT_ID) kwargs['initial'].setdefault('merchant_key', conf.MERCHANT_KEY) super(PayFastForm, self).__init__(*args, **kwargs) if 'm_payment_id' in self.initial: # If the caller supplies m_payment_id, find the existing order, or create it. (self.order, created) = PayFastOrder.objects.get_or_create( m_payment_id=self.initial['m_payment_id'], defaults=dict( user=user, amount_gross=self.initial['amount'], ), ) if not created: # If the order is existing, check the user and amount fields, # and update if necessary. # # XXX: Also consistency-check that the order is not paid yet? # if not (self.order.user == user and self.order.amount_gross == self.initial['amount']): self.order.user = user self.order.amount_gross = self.initial['amount'] self.order.save() else: # Old path: Create a new PayFastOrder each time form is instantiated. self.order = PayFastOrder.objects.create( user=user, amount_gross=self.initial['amount'], ) # Initialise m_payment_id from the pk. self.order.m_payment_id = str(self.order.pk) self.order.save() self.initial['m_payment_id'] = self.order.m_payment_id # we need self.initial but it is unordered data = OrderedDict((key, self.initial[key]) for key in self.fields.keys() if key in self.initial) self._signature = self.fields['signature'].initial = signature(data)
def test_signature(self): data = _test_data() self.assertEqual(signature(data), 'c71d41dd5041bf28d819fe102ab0106b')