def post(cls):
        """
        Generates PAN details if not yet created while confirming your wallets
        kyc authorization.

        payload = {
        "mobile_number":"***********"
        }
        """
        payload = request.get_json()
        mobile_number = payload['mobile_number']
        wallet_response = wallet.authorize(mobile_number)

        if wallet_response is None:
            return {"msg": INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 404:
            return Decryption.decrypt(wallet_response.json()), 401

        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(
                mobile_number)
        except:
            return {"msg": INTERNAL_SERVER_ERROR}, 500

        if virtual_card:
            return {"msg": CARD_GENERATED}, 400

        pan_pref = '40'
        pan = pan_pref + str(uuid.uuid4().int >> 32)[0:14]
        pan = cipher.encrypt(pan)

        while pan in PAN:
            pan = pan_pref + str(uuid.uuid4().int >> 32)[0:14]
            pan = cipher.encrypt(pan)

        card_generated_time = datetime.fromtimestamp(time.time()).isoformat()
        virtual_card = VirtualCardModel(pan, card_generated_time,
                                        mobile_number)

        wallet_response = Decryption.decrypt(wallet_response.json())
        try:
            virtual_card.save_to_db()
            PAN.add(pan)
        except:
            traceback.print_exc()
            return {"msg": FAILED_TO_CREATE}, 500

        return {
            "msg": PAN_CREATED,
            "wallet_amount": wallet_response['amount']
        }, 201
Example #2
0
    def put(cls, mobile_number: str):
        """
        Adds amount to your virtual card temporarily.
        :param mobile_number:
        :return:
        """

        payload = request.get_json()
        virtual_card = VirtualCardModel.find_by_mobile_number(mobile_number)
        if not virtual_card:
            return {"message": CARD_NOT_GENERATED}, 400

        wallet_response = wallet.get_amount(mobile_number, payload['amount'])

        if wallet_response is None:
            return {'message': INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 400:
            return {'message': wallet_response.json()}, 400

        virtual_card.amount += payload['amount']

        try:
            virtual_card.save_to_db()
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        return {"message": AMOUNT_ADDED}, 200
    def get(cls):
        """
        Accessing already generated card and providing real time authentication
        from wallet confirming its kyc status and wallet amount.
        """
        _id = get_jwt_identity()
        user = UserModel.find_user_by_id(_id)
        mobile_number = user.mobile_number
        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(
                mobile_number)
        except:
            return {"msg": INTERNAL_SERVER_ERROR}, 500

        if not virtual_card:
            return {"msg": ACCOUNT_NOT_YET_SYNCED}, 404

        wallet_response = wallet.authorize(mobile_number)

        if wallet_response is None:
            return {"msg": INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 404:
            return Decryption.decrypt(wallet_response.json()), 401

        wallet_response = Decryption.decrypt(wallet_response.json())
        return {
            "msg": CARD_GENERATED,
            "wallet_amount": wallet_response['amount']
        }, 200
Example #4
0
    def put(cls):
        """
        payload = {
        "mobile_number":"*******",
        "amount":"**",
        "wallet_name":"***",
        "merchant_name":"****",
        "systemsTraceAuditNumber":"*****"
        }

        """

        payload = request.get_json()
        history = None
        try:
            history = HistoryModel.find_by_mobile_status(payload['mobile_number'], "Pending")
        except Exception as e:
            print(e)

        if history:
            for hist in history:
                print(hist.amount, hist.wallet_name)
                hist.status = "Refunded"
                wallet_response = wallet.send_amount(payload['mobile_number'], hist.amount)

                if wallet_response.status_code == 200:
                    try:
                        hist.save_to_db()
                    except Exception as e:
                        print(e)

        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(payload["mobile_number"])
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        if not virtual_card:
            return {'message': CARD_NOT_GENERATED}, 400

        wallet_response = wallet.get_amount(payload["mobile_number"], float(payload['amount']))

        if wallet_response is None:
            return {'message': INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 404:
            return Decryption.decrypt(wallet_response.json()), 400

        last_transaction_time = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")

        history = HistoryModel(payload['amount'], last_transaction_time, payload["mobile_number"],
                               payload["systemsTraceAuditNumber"], payload["merchant_name"], payload['wallet_name'],
                               "Pending")

        try:
            history.save_to_db()
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        return {"message": AMOUNT_TRANSFERRING}, 200
Example #5
0
    def post(cls, mobile_number: str):
        """
        It creates PAN details if not yet created while checking your wallet was authorized.
        :param mobile_number:
        :return:
        """

        virtual_card = VirtualCardModel.find_by_mobile_number(mobile_number)

        if virtual_card:
            return {"message": CARD_GENERATED}, 400

        wallet_response = wallet.authorize(mobile_number)

        if wallet_response is None:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 400:
            return {"message": wallet_response.json()}, 401

        pan_pref = '40'
        pan = pan_pref + str(uuid.uuid4().int >> 32)[0:14]

        while pan in PAN:
            pan = pan_pref + str(uuid.uuid4().int >> 32)[0:14]

        card_generated_time = datetime.fromtimestamp(time.time()).isoformat()
        virtual_card = VirtualCardModel(pan, card_generated_time,
                                        mobile_number)
        print(pan)
        try:
            virtual_card.save_to_db()
            PAN.add(pan)
        except:
            traceback.print_exc()
            return {"message": FAILED_TO_CREATE}, 500

        return {"message": PAN_CREATED}, 201
Example #6
0
    def get(cls):
        _id =get_jwt_identity()
        user =UserModel.find_user_by_id(_id)
        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(user.mobile_number)
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        if not virtual_card:
            return {"message": CARD_NOT_GENERATED}, 400

        pan = cipher.decrypt(virtual_card.pan)

        return {"pan": pan}, 200
Example #7
0
    def delete(cls):
        email = request.get_json()["email"]
        user = UserModel.find_user_by_email(email=email)
        if not user:
            return {"msg": USER_NOT_FOUND.format(email)}, 404

        virtual_card = VirtualCardModel.find_by_mobile_number(
            user.mobile_number)

        if virtual_card:
            virtual_card.delete_from_db()

        user.delete_from_db()
        return {"msg": USER_DELETED.format(user.email)}, 200
Example #8
0
    def get(cls, mobile_number: str):
        """
        Accessing already generated card.
        :param mobile_number:
        :return:
        """

        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(
                mobile_number)
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        if not virtual_card:
            return {"message": CARD_NOT_GENERATED}, 404

        return {"message": CARD_GENERATED, "pan": virtual_card.pan}, 200
Example #9
0
    def put(cls, mobile_number: str):
        """
        Completes the payment via VISA NET using mVisa API.
        :param mobile_number:
        :return:
        """

        payload = request.get_json()

        virtual_card = VirtualCardModel.find_by_mobile_number(mobile_number)

        if not virtual_card:
            return {'message': CARD_NOT_GENERATED}, 400

        if virtual_card.amount < float(payload['amount']):
            return {'message': INSUFFICIENT_FUNDS}, 400

        payload['senderAccountNumber'] = virtual_card.pan
        payload['localTransactionDateTime'] = datetime.utcnow().strftime(
            "%Y-%m-%dT%H:%M:%S")

        visa_response = visa.merchant_push_payments_post_payload(payload)

        if visa_response is None:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        if visa_response.status_code != 200:
            return {"message": visa_response.json()}, 500

        virtual_card.amount -= float(payload['amount'])
        virtual_card.last_transaction_time = datetime.fromtimestamp(
            time.time()).isoformat()
        virtual_card.count += 1

        try:
            virtual_card.save_to_db()
        except:
            return {"message": INTERNAL_SERVER_ERROR}, 500

        return {'message': visa_response.json()}, 200
    def put(cls):
        """
        Completes the payment via VISA NET using mVisa API.
        Also supports functionality of rolling back the payment.
        """

        payload = request.get_json()
        mobile_number = payload["mobile_number"]
        wallet_name = payload["wallet_name"]
        del (payload["mobile_number"])
        del (payload["wallet_name"])

        try:
            virtual_card = VirtualCardModel.find_by_mobile_number(
                mobile_number)
        except:
            return {"msg": INTERNAL_SERVER_ERROR}, 500

        if not virtual_card:
            return {'msg': CARD_NOT_GENERATED}, 400

        wallet_response = wallet.get_amount(mobile_number,
                                            float(payload['amount']))

        pan = cipher.decrypt(virtual_card.pan)

        if wallet_response is None:
            return {'msg': INTERNAL_SERVER_ERROR}, 500

        if wallet_response.status_code == 404:
            return Decryption.decrypt(wallet_response.json()), 401

        systems_trace_audit_number = str(uuid.uuid4().int >> 32)[0:6]
        last_transaction_time = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
        payload['senderAccountNumber'] = pan
        payload['systemsTraceAuditNumber'] = systems_trace_audit_number
        payload['retrievalReferenceNumber'] = str(datetime.utcnow().strftime("%y%d%H")) + \
                                              systems_trace_audit_number
        payload['localTransactionDateTime'] = last_transaction_time

        visa_response = MVisa.merchant_push_payments_post_payload(payload)
        print(pan, visa_response.status_code, visa_response.json())
        if visa_response is None:
            wallet_response = wallet.send_amount(mobile_number,
                                                 float(payload['amount']))
            return {"msg": ROLL_BACK}, 500

        visa_response_status = visa_response.status_code
        visa_response = visa_response.json()
        if visa_response_status != 200:
            wallet_response = wallet.send_amount(mobile_number,
                                                 float(payload['amount']))
            return {"msg": ROLL_BACK}, 500

        virtual_card.last_transaction_time = last_transaction_time
        history = HistoryModel(payload['amount'], last_transaction_time,
                               mobile_number, systems_trace_audit_number,
                               payload["cardAcceptor"]["name"], wallet_name,
                               "Success")
        virtual_card.count += 1

        try:
            virtual_card.save_to_db()
            history.save_to_db()
        except:
            return {"msg": DATABASE_ERROR}, 500

        return {'msg': visa_response}, 200