Example #1
0
def successful_payment(request):
    """
    payment_id=MOJO0b10N05A12374905
    payment_status=Credit
    payment_request_id=1fb41cbaae844a8b88c970c081f71ba1
    website.com/cart?product_id=1
    """
    if request.user.is_authenticated:
        user = request.user
        cart = Cart.objects.get_or_create(user=user)[0]

        # Verifying the payments.
        payment_request_id = request.GET['payment_request_id']
        api = Instamojo(api_key=settings.API_KEY,
                        auth_token=settings.AUTH_TOKEN,
                        endpoint='https://test.instamojo.com/api/1.1/')
        response = api.payment_request_status(payment_request_id)

        if response['success']:
            order = Order.objects.create(payer=user, status='Accepted')

            for product in cart.products.all():
                product.quantity -= 1
                order.cart.add(product)

            # Everything was successful now, clear the existing cart.
            cart.products.clear()
            context = {'cart_count': cart.products.count()}
            return render(request, "store/success.html", context=context)
        return HttpResponse("OH! Man This is not how it works.")
        return HttpResponse("You're not logged In.")
Example #2
0
def payment_record_handler(instance: Payment, sender, **kwargs):
    """
    Each time a payment record is saved, signal will check and update
    other payment records and payment request.
    :param instance: Instance that is being saved
    :param sender: Payment model
    :param kwargs: other parameters
    :return: None
    """
    from drf_instamojo.serializers import PaymentSerializer

    from instamojo_wrapper import Instamojo

    pr: PaymentRequest = instance.payment_request

    imojo = Instamojo(
        api_key=pr.configuration.api_key,
        auth_token=pr.configuration.auth_token,
        endpoint=pr.configuration.base_url,
    )

    pr_status = imojo.payment_request_status(id=pr.id)

    # Check if payment status request is successful
    if pr_status.get("success"):
        payment_request_imojo = pr_status.get("payment_request")

        # Hacky way to fix TypeError here.
        # As instamojo is sending modified_at as str here
        # We'll use strftime() to format PaymentRequest's modified_at to str
        if payment_request_imojo.get("modified_at") > (
            pr.modified_at.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
        ):
            # Update payment request
            pr.status = payment_request_imojo.get("status")
            pr.modified_at = payment_request_imojo.get("modified_at")
            pr.sms_status = payment_request_imojo.get("sms_status")
            pr.email_status = payment_request_imojo.get("email_status")
            pr.save()

        # Save other payment details, if not already saved.
        # This may trigger more signals.
        # TODO: Check if there is any better way to do this.
        for payment in payment_request_imojo.get("payments"):
            id = payment.get("payment_id")
            try:
                Payment.objects.get(id=payment.get("payment_id"))
            except Payment.DoesNotExist:
                ps = PaymentSerializer(data={"id": id, "payment_request": pr.id})
                ps.is_valid(raise_exception=True)
                ps.save()
Example #3
0
def payment_record_handler(instance: Payment, sender, **kwargs):
    """
    Each time a payment record is saved, signal will check and update
    other payment records and payment request.
    :param instance: Instance that is being saved
    :param sender: Payment model
    :param kwargs: other parameters
    :return: None
    """
    from drf_instamojo.serializers import PaymentSerializer

    from instamojo_wrapper import Instamojo

    pr: PaymentRequest = instance.payment_request

    imojo = Instamojo(api_key=pr.configuration.api_key,
                      auth_token=pr.configuration.auth_token,
                      endpoint=pr.configuration.base_url)

    pr_status = imojo.payment_request_status(id=pr.id)

    # Check if payment status request is successful
    if pr_status.get('success'):
        payment_request_imojo = pr_status.get('payment_request')

        if payment_request_imojo.get('modified_at') > pr.modified_at:
            # Update payment request
            pr.status = payment_request_imojo.get('status')
            pr.modified_at = payment_request_imojo.get('modified_at')
            pr.sms_status = payment_request_imojo.get('sms_status')
            pr.email_status = payment_request_imojo.get('email_status')
            pr.save()

        # Save other payment details, if not already saved.
        # This may trigger more signals.
        # TODO: Check if there is any better way to do this.
        for payment in payment_request_imojo.get('payments'):
            id = payment.get('payment_id')
            try:
                Payment.objects.get(id=payment.get('payment_id'))
            except Payment.DoesNotExist:
                ps = PaymentSerializer(data={
                    'id': id,
                    'payment_request': pr.id
                })
                ps.is_valid(raise_exception=True)
                ps.save()
Example #4
0
    def handle(self, *args, **options):
        api = Instamojo(api_key=settings.INSTAMOJO['API_KEY'],
                        auth_token=settings.INSTAMOJO['AUTH_TOKEN'])
        for payment in Payment.objects.filter(status=''):
            if payment.payment_request_id == '':
                continue
            response = api.payment_request_status(payment.payment_request_id)
            payment.status = response['payment_request']['status']
            payment.longurl = response['payment_request']['longurl']
            payment.shorturl = response['payment_request']['shorturl']
            if len(response['payment_request']['payments']) > 0:
                payresp = response['payment_request']['payments'][0]
                if payment.payment_id == '':
                    payment.payment_id = payresp['payment_id']
                payment.status = payresp['status']
                payment.fees = payresp['fees']

            payment.save()
Example #5
0
def getPaymentLink(id):
    try:
        # api = Instamojo(api_key=API_KEY, auth_token=AUTH_TOKEN, endpoint='https://test.instamojo.com/api/1.1/')
        api = Instamojo(api_key=API_KEY, auth_token=AUTH_TOKEN)
        response = api.payment_request_status(id)
        if (response['payment_request']['status'] == "Completed"):
            status = True
        else:
            status = False

        data = {
            "status": status,
            "link": response['payment_request']['longurl'],
            "error": False
        }
        return data
    except Exception:
        return {"error": True}
Example #6
0
 def process_data(self, payment, request):
     if 'payment_request_id' not in request.GET:
         return HttpResponseForbidden('FAILED')
     payment_request_id = request.GET.get('payment_request_id')
     api = Instamojo(api_key=self.api_key, auth_token=self.auth_token, endpoint=self.endpoint)
     status_request = api.payment_request_status(payment_request_id)
     try:
         payment_req = status_request['payment_request']['payments'][0]
         status = payment_req['status']
         if status == 'Credit':
             payment.change_status(PaymentStatus.CONFIRMED)
             payment.captured_amount = payment.total
             payment.extra_data = json.dumps(status_request)
             first_name, last_name = payment_req['buyer_name'].rsplit(' ', 1)
             payment.billing_first_name = first_name
             payment.billing_last_name = last_name
             payment.save()
         elif status == 'Failed':
             payment.change_status(PaymentStatus.REJECTED)
             return redirect(payment.get_failure_url())
     except KeyError:
         payment.change_status(PaymentStatus.REJECTED)
         return redirect(payment.get_failure_url())
     return redirect(payment.get_success_url())
Example #7
0
def success(request):
    from django.contrib.auth.models import User
    api = Instamojo(api_key='27fb8178a52dc8e02866df53267d016d',
                    auth_token='4c5d72dcdaa1e81b2ec37525609dd6b5',
                    endpoint='https://test.instamojo.com/api/1.1/')
    # Create a new Payment Request
    payment_request_id = request.GET["payment_request_id"]
    txnid = request.GET["payment_id"]
    response = api.payment_request_status(payment_request_id)

    print response['payment_request']['shorturl']  # Get the    short URL
    print response['payment_request']['status']  # Get the current status
    print response['payment_request']['payments']  # List of payments
    print response['payment_request']['amount']

    status = response['payment_request']['status']
    amount = response['payment_request']['amount']
    print("\n\n ", request.user)
    if request.user.is_authenticated():
        print "true"
        donation = Donation(
            name=response['payment_request']['buyer_name'],
            transaction_id=txnid,
            donor_id=request.user,
            project_id_id=response['payment_request']['purpose'],
            amount=amount)
    else:
        print "false"
        donation = Donation(
            name=response['payment_request']['buyer_name'],
            transaction_id=txnid,
            donor_id=User.objects.get(username="******"),
            project_id_id=response['payment_request']['purpose'],
            amount=amount)
    donation.save()

    def raised_amount(project_id):
        donations = Donation.objects.filter(
            project_id=response['payment_request']['purpose'])
        print donations
        r_amt = 0
        for donation in donations:
            print donation
            r_amt = r_amt + donation.amount
            print r_amt
        return r_amt

    project = Project.objects.get(
        project_id=response['payment_request']['purpose'])
    project.raised_amount = raised_amount(
        response['payment_request']['purpose'])
    project.save()

    return render(
        request, 'sucess.html', {
            "status": status,
            "amount": amount,
            "txnid": txnid,
            'name': response['payment_request']['buyer_name'],
            'project_id': response['payment_request']['purpose'],
            'amount': amount
        })
Example #8
0
class TestPaymentRequests(BaseTestClass):
    def setUp(self):
        self.api_endpoint = 'https://www.instamojo.com/api/1.1/'
        self.api = Instamojo('API-KEY', 'AUTH-TOKEN', self.api_endpoint)

    @responses.activate
    def test_payment_request_create(self):
        data = payment_requests_payload['payment_request_create']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(responses.POST,
                      endpoint,
                      body='{}',
                      content_type='application/json')
        resp = self.api.payment_request_create(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_request_status(self):
        data = payment_requests_payload['payment_request_status']
        endpoint = self.api_endpoint + 'payment-requests/{id}/'.format(
            **data['request'])
        responses.add(responses.GET,
                      endpoint,
                      body='{}',
                      content_type='application/json')
        resp = self.api.payment_request_status(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_requests_list(self):
        data = payment_requests_payload['payment_requests_list']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(responses.GET,
                      endpoint,
                      body='{}',
                      content_type='application/json')
        resp = self.api.payment_requests_list(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_requests_list_optional_params(self):
        data = payment_requests_payload[
            'payment_requests_list_optional_params']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(responses.GET,
                      endpoint,
                      body='{}',
                      content_type='application/json')
        resp = self.api.payment_requests_list(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        parsed_url = urlparse(responses.calls[0].request.url)
        self.assertTrue(endpoint.endswith(parsed_url.path))
        self.assertDictEqual(dict(parse_qsl(parsed_url.query.strip('/'))),
                             data['request'])

    @responses.activate
    def test_payment_request_payment_status(self):
        data = payment_requests_payload['payment_request_payment_status']
        endpoint = self.api_endpoint + 'payment-requests/{id}/{payment_id}/'.format(
            **data['request'])
        responses.add(responses.GET,
                      endpoint,
                      body='{}',
                      content_type='application/json')
        resp = self.api.payment_request_payment_status(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(responses.calls[0].request.url, endpoint)
class TestPaymentRequests(BaseTestClass):
    def setUp(self):
        self.api_endpoint = 'https://www.instamojo.com/api/1.1/'
        self.api = Instamojo('API-KEY', 'AUTH-TOKEN', self.api_endpoint)

    @responses.activate
    def test_payment_request_create(self):
        data = payment_requests_payload['payment_request_create']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(
            responses.POST,
            endpoint,
            body='{}',
            content_type='application/json'
        )
        resp = self.api.payment_request_create(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(
            responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_request_status(self):
        data = payment_requests_payload['payment_request_status']
        endpoint = self.api_endpoint + 'payment-requests/{id}/'.format(**data['request'])
        responses.add(
            responses.GET,
            endpoint,
            body='{}',
            content_type='application/json'
        )
        resp = self.api.payment_request_status(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(
            responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_requests_list(self):
        data = payment_requests_payload['payment_requests_list']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(
            responses.GET,
            endpoint,
            body='{}',
            content_type='application/json'
        )
        resp = self.api.payment_requests_list(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(
            responses.calls[0].request.url, endpoint)

    @responses.activate
    def test_payment_requests_list_optional_params(self):
        data = payment_requests_payload['payment_requests_list_optional_params']
        endpoint = self.api_endpoint + 'payment-requests/'
        responses.add(
            responses.GET,
            endpoint,
            body='{}',
            content_type='application/json'
        )
        resp = self.api.payment_requests_list(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        parsed_url = urlparse(responses.calls[0].request.url)
        self.assertTrue(endpoint.endswith(parsed_url.path))
        self.assertDictEqual(dict(parse_qsl(parsed_url.query.strip('/'))), data['request'])

    @responses.activate
    def test_payment_request_payment_status(self):
        data = payment_requests_payload['payment_request_payment_status']
        endpoint = self.api_endpoint + 'payment-requests/{id}/{payment_id}/'.format(**data['request'])
        responses.add(
            responses.GET,
            endpoint,
            body='{}',
            content_type='application/json'
        )
        resp = self.api.payment_request_payment_status(**data['request'])
        self.assertEqual(resp, {})
        self.assertEqual(len(responses.calls), 1)
        self.assertEqual(
            responses.calls[0].request.url, endpoint)