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
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
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
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
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
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
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
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