'How Can I Integrate Flutterwave Paymwnt Gate Way with Django

I am working on a Django Project where I want to collect payment in Dollars from Applicants on the portal, and I don't know how to go about it. Though I have been following an online tutorial that shows how to do it but the result I am having is different with the recent error which says 'module' object is not callable.

Remember that I have tested my configured environment and also imported it into my views on top of the page.

Profile model code:

class Profile(models.Model):
    applicant = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
    surname = models.CharField(max_length=10, null=True)
    othernames = models.CharField(max_length=30, null=True)
    gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
    nation = models.CharField(max_length=255, choices=NATION, blank=True, null=True)
    state = models.CharField(max_length=20, null=True)
    address = models.CharField(max_length=200, null=True)
    phone = models.CharField(max_length=16, null=True)
    image = models.ImageField(default='avatar.jpg', upload_to ='profile_images')



    def __str__(self):
        return f'{self.applicant.username}-Profile'

Education/Referee Model code:

class Education(models.Model):
    applicant = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
    qualification = models.CharField(max_length=60, choices=INSTITUTE, default=None, null=True)
    instition = models.CharField(max_length=40, null=True)
    reasons = models.CharField(max_length=100, null=True) 
    matnumber = models.CharField(max_length=255, null=True)
    reference = models.CharField(max_length=100, null=True)
    refphone = models.CharField(max_length=100, null=True)
    last_updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return f'{self.applicant}-Education'

Submitted Model code:

class Submitted(models.Model):
    applicant = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    application = models.UUIDField(primary_key = True, editable = False, default=uuid.uuid4)
    confirm = models.BooleanField()
    approved = models.CharField(max_length=20, null=True)
    date = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs):
         self.application == str(uuid.uuid4())
         super().save(*args, **kwargs)

    def __unicode__(self):
        return self.applicant

    def __str__(self):
        return f'Application Number: {self.application}-{self.applicant}'

Scholarship Model code:

class Scholarship(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null = True)
    name = models.CharField(max_length=100, null = True)
    description = models.CharField(max_length=200, null = True)
    category = models.CharField(max_length=60, choices=INSTITUTE, default=None, null=True)
    amount = models.FloatField()
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'WASU Scholarship: {self.name}-{self.name}'

My View for printing slip:

def AppSlip(request):
    check_submited = Submitted.objects.get(applicant=request.user)
    check_education = Education.objects.get(applicant = request.user)

    candidate_edu = check_education.qualification

    scholarship = Scholarship.objects.get(category=candidate_edu)

    context = {
        'candidate_edu':candidate_edu,
        'scholarship':scholarship,

    }
    return render(request, 'user/slip.html', context)

My view for applicant to fill form for payment which I want their Profile captured automatically in the form:

def scholarship_detail(request, pk):
data = Scholarship.objects.get(id=pk)

if request.method=='POST':
    form = PaymentForm(request.POST)
    if form.is_valid():
        user = Profile.objects.get(applicant=request.user)
        name=  user.surname
        email = form.cleaned_data['email']
        amount = form.cleaned_data['amount']
        phone = form.cleaned_data['phone']
        context = {'applicant':name, 'email':email, 'amount':amount, 'phone':phone} 
        return process_payment(request, context)    
else:
    form = PaymentForm()

ctx={
    'form':form,
    'product':data,
    
    
}
return render(request, 'user/scholarship.html', ctx)

My form code for Payment: How can query logged in user profile and fill into name, email, phone, amount from Scholarship Model into amount form filled.

class PaymentForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)
    email = forms.EmailField()
    phone=forms.CharField(max_length=15)
    amount = forms.FloatField()

View code for processing Payment (Where I am suspecting the error). Though I have configured my env using django-dotenv with the Flutterwave Secret Key in it.

@login_required(login_url='user-login')

def process_payment(request, newContext={}):

auth_token= dotenv('SECRET_KEY')
hed = {'Authorization': 'Bearer ' + auth_token}
data = {
            "tx_ref":''+str(math.floor(1000000 + random.random()*9000000)),
            "amount":amount,
            "currency":"KES",
            "redirect_url":"http://localhost:8000/callback",
            "payment_options":"card",
            "meta":{
                "consumer_id":23,
                "consumer_mac":"92a3-912ba-1192a"
            },
            "customer":{
                "email":email,
                "phonenumber":phone,
                "name":name
            },
            "customizations":{
                "title":"WASU Scholarship 2022",
                "description":"Best store in town",
                "logo":"https://getbootstrap.com/docs/4.0/assets/brand/bootstrap-solid.svg"
            }
            }
url = ' https://api.flutterwave.com/v3/payments'
response = requests.post(url, json=data, headers=hed)
response=response.json()
link=response['data']['link']
return link

My payment Response View:

@require_http_methods(['GET', 'POST'])
def payment_response(request):
    status=request.GET.get('status', None)
    tx_ref=request.GET.get('tx_ref', None)
    print(status)
    print(tx_ref)
    return HttpResponse('Finished')

Anticipating your prompt answers. Thanks



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source