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.")
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()
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()
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()
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}
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())
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 })
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)