Advertisement
Guest User

test

a guest
Apr 29th, 2019
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. import base64
  2. import os
  3. import datetime
  4. import plaid
  5. import json
  6. import time
  7. from flask import Flask
  8. from flask import render_template
  9. from flask import request
  10. from flask import jsonify
  11.  
  12. app = Flask(__name__)
  13.  
  14.  
  15. # Fill in your Plaid API keys - https://dashboard.plaid.com/account/keys
  16. PLAID_CLIENT_ID = os.getenv('5cc79c3c1b00ae00124ec668')
  17. PLAID_SECRET = os.getenv('4ca256f77b8e2cf008d5c2c2d61eaf')
  18. PLAID_PUBLIC_KEY = os.getenv('32003972868faaca2a483a0655ca40')
  19. # Use 'sandbox' to test with Plaid's Sandbox environment (username: user_good,
  20. # password: pass_good)
  21. # Use `development` to test with live users and credentials and `production`
  22. # to go live
  23. PLAID_ENV='sandbox'
  24. # PLAID_PRODUCTS is a comma-separated list of products to use when initializing
  25. # Link. Note that this list must contain 'assets' in order for the app to be
  26. # able to create and retrieve asset reports.
  27. PLAID_PRODUCTS = os.getenv('PLAID_PRODUCTS', 'transactions')
  28.  
  29. client = plaid.Client(client_id = PLAID_CLIENT_ID, secret=PLAID_SECRET,
  30. public_key=PLAID_PUBLIC_KEY, environment=PLAID_ENV, api_version='2018-05-22')
  31.  
  32. @app.route('/')
  33. def index():
  34. return render_template(
  35. 'index.ejs',
  36. plaid_public_key=PLAID_PUBLIC_KEY,
  37. plaid_environment=PLAID_ENV,
  38. plaid_products=PLAID_PRODUCTS,
  39. )
  40.  
  41. access_token = None
  42.  
  43. # Exchange token flow - exchange a Link public_token for
  44. # an API access_token
  45. # https://plaid.com/docs/#exchange-token-flow
  46. @app.route('/get_access_token', methods=['POST'])
  47. def get_access_token():
  48. global access_token
  49. public_token = request.form['public_token']
  50. try:
  51. exchange_response = client.Item.public_token.exchange(public_token)
  52. except plaid.errors.PlaidError as e:
  53. return jsonify(format_error(e))
  54.  
  55. pretty_print_response(exchange_response)
  56. access_token = exchange_response['access_token']
  57. return jsonify(exchange_response)
  58.  
  59. # Retrieve ACH or ETF account numbers for an Item
  60. # https://plaid.com/docs/#auth
  61. @app.route('/auth', methods=['GET'])
  62. def get_auth():
  63. try:
  64. auth_response = client.Auth.get(access_token)
  65. except plaid.errors.PlaidError as e:
  66. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  67. pretty_print_response(auth_response)
  68. return jsonify({'error': None, 'auth': auth_response})
  69.  
  70. # Retrieve Transactions for an Item
  71. # https://plaid.com/docs/#transactions
  72. @app.route('/transactions', methods=['GET'])
  73. def get_transactions():
  74. # Pull transactions for the last 30 days
  75. start_date = '{:%Y-%m-%d}'.format(datetime.datetime.now() + datetime.timedelta(-30))
  76. end_date = '{:%Y-%m-%d}'.format(datetime.datetime.now())
  77. try:
  78. transactions_response = client.Transactions.get(access_token, start_date, end_date)
  79. except plaid.errors.PlaidError as e:
  80. return jsonify(format_error(e))
  81. pretty_print_response(transactions_response)
  82. return jsonify({'error': None, 'transactions': transactions_response})
  83.  
  84. # Retrieve Identity data for an Item
  85. # https://plaid.com/docs/#identity
  86. @app.route('/identity', methods=['GET'])
  87. def get_identity():
  88. try:
  89. identity_response = client.Identity.get(access_token)
  90. except plaid.errors.PlaidError as e:
  91. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  92. pretty_print_response(identity_response)
  93. return jsonify({'error': None, 'identity': identity_response})
  94.  
  95. # Retrieve real-time balance data for each of an Item's accounts
  96. # https://plaid.com/docs/#balance
  97. @app.route('/balance', methods=['GET'])
  98. def get_balance():
  99. try:
  100. balance_response = client.Accounts.balance.get(access_token)
  101. except plaid.errors.PlaidError as e:
  102. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  103. pretty_print_response(balance_response)
  104. return jsonify({'error': None, 'balance': balance_response})
  105.  
  106. # Retrieve an Item's accounts
  107. # https://plaid.com/docs/#accounts
  108. @app.route('/accounts', methods=['GET'])
  109. def get_accounts():
  110. try:
  111. accounts_response = client.Accounts.get(access_token)
  112. except plaid.errors.PlaidError as e:
  113. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  114. pretty_print_response(accounts_response)
  115. return jsonify({'error': None, 'accounts': accounts_response})
  116.  
  117. # Create and then retrieve an Asset Report for one or more Items. Note that an
  118. # Asset Report can contain up to 100 items, but for simplicity we're only
  119. # including one Item here.
  120. # https://plaid.com/docs/#assets
  121. @app.route('/assets', methods=['GET'])
  122. def get_assets():
  123. try:
  124. asset_report_create_response = client.AssetReport.create([access_token], 10)
  125. except plaid.errors.PlaidError as e:
  126. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  127. pretty_print_response(asset_report_create_response)
  128.  
  129. asset_report_token = asset_report_create_response['asset_report_token']
  130.  
  131. # Poll for the completion of the Asset Report.
  132. num_retries_remaining = 20
  133. asset_report_json = None
  134. while num_retries_remaining > 0:
  135. try:
  136. asset_report_get_response = client.AssetReport.get(asset_report_token)
  137. asset_report_json = asset_report_get_response['report']
  138. break
  139. except plaid.errors.PlaidError as e:
  140. if e.code == 'PRODUCT_NOT_READY':
  141. num_retries_remaining -= 1
  142. time.sleep(1)
  143. continue
  144. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  145.  
  146. if asset_report_json == None:
  147. return jsonify({'error': {'display_message': 'Timed out when polling for Asset Report', 'error_code': e.code, 'error_type': e.type } })
  148.  
  149. asset_report_pdf = None
  150. try:
  151. asset_report_pdf = client.AssetReport.get_pdf(asset_report_token)
  152. except plaid.errors.PlaidError as e:
  153. return jsonify({'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type } })
  154.  
  155. return jsonify({
  156. 'error': None,
  157. 'json': asset_report_json,
  158. 'pdf': base64.b64encode(asset_report_pdf),
  159. })
  160.  
  161. # Retrieve high-level information about an Item
  162. # https://plaid.com/docs/#retrieve-item
  163. @app.route('/item', methods=['GET'])
  164. def item():
  165. global access_token
  166. item_response = client.Item.get(access_token)
  167. institution_response = client.Institutions.get_by_id(item_response['item']['institution_id'])
  168. pretty_print_response(item_response)
  169. pretty_print_response(institution_response)
  170. return jsonify({'error': None, 'item': item_response['item'], 'institution': institution_response['institution']})
  171.  
  172. @app.route('/set_access_token', methods=['POST'])
  173. def set_access_token():
  174. global access_token
  175. access_token = request.form['access_token']
  176. item = client.Item.get(access_token)
  177. return jsonify({'error': None, 'item_id': item['item']['item_id']})
  178.  
  179. def pretty_print_response(response):
  180. print(json.dumps(response, indent=2, sort_keys=True))
  181.  
  182. def format_error(e):
  183. return {'error': {'display_message': e.display_message, 'error_code': e.code, 'error_type': e.type, 'error_message': e.message } }
  184.  
  185. if __name__ == '__main__':
  186. app.run(port=os.getenv('PORT', 5000))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement