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)
예제 #2
0
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
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
 def test_signature(self):
     data = _test_data()
     self.assertEqual(signature(data), 'c71d41dd5041bf28d819fe102ab0106b')