Vibhu-Agarwal: @captn3m0 
diff --git a/.travis.yml b/.travis.yml
index e27cf0d..37b69e0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,6 @@
 language: python
 python:
-  - "2.7.6"
   - "2.7"
-  - "3.3"
   - "3.4"
   - "3.5"
   - "3.6"
diff --git a/razorpay/resources/payment.py b/razorpay/resources/payment.py
index a7546b8..fc9d6b6 100644
--- a/razorpay/resources/payment.py
+++ b/razorpay/resources/payment.py
@@ -40,7 +40,7 @@ class Payment(Resource):
 
         Args:
             payment_id : Id for which payment object has to be retrieved
-            Amount : Amount for which the payment has to be retrieved
+            amount : Amount for which the payment has to be retrieved
 
         Returns:
             Payment dict after getting captured
@@ -55,7 +55,7 @@ class Payment(Resource):
 
         Args:
             payment_id : Id for which payment object has to be refunded
-            Amount : Amount for which the payment has to be refunded
+            amount : Amount for which the payment has to be refunded
 
         Returns:
             Payment dict after getting refunded
@@ -69,10 +69,10 @@ class Payment(Resource):
         Create Transfer for given Payment Id
 
         Args:
-            payment_id : Id for which payment object has to be transfered
+            payment_id : Id for which payment object has to be transferred
 
         Returns:
-            Payment dict after getting transfered
+            Payment dict after getting transferred
         """
         url = "{}/{}/transfers".format(self.base_url, payment_id)
         return self.post_url(url, data, **kwargs)
@@ -82,11 +82,11 @@ class Payment(Resource):
         Fetches all transfer for given Payment Id
 
         Args:
-            payment_id : Id for which payment object has to be refunded
-            Amount : Amount for which the payment has to be refunded
+            payment_id : Id for which all the transfers has to be fetched
 
         Returns:
-            Payment dict after getting refunded
+            A collection (dict) of transfers
+            items : The key containing a list of 'transfer' entities
         """
         url = "{}/{}/transfers".format(self.base_url, payment_id)
         return self.get_url(url, data, **kwargs)
@@ -103,3 +103,16 @@ class Payment(Resource):
         """
         url = "{}/{}/bank_transfer".format(self.base_url, payment_id)
         return self.get_url(url, data, **kwargs)
+
+    def upi_transfer(self, payment_id, data={}, **kwargs):
+        """"
+        UPI Transfer Entity for given Payment
+
+        Args:
+            payment_id : Id for which upi transfer entity has to be fetched
+
+        Returns:
+            UPI Transfer dict
+        """
+        url = "{}/{}/upi_transfer".format(self.base_url, payment_id)
+        return self.get_url(url, data, **kwargs)
diff --git a/setup.py b/setup.py
index b36593c..e1c06bc 100644
--- a/setup.py
+++ b/setup.py
@@ -1,9 +1,14 @@
 from setuptools import setup
 
+with open('README.md') as readme:
+    readme_content = readme.read()
+
 setup(
     name="razorpay",
     version="1.2.0",
     description="Razorpay Python Client",
+    long_description=readme_content,
+    long_description_content_type='text/markdown',
     url="https://github.com/razorpay/razorpay-python",
     author="Team Razorpay",
     license="MIT",
@@ -23,7 +28,6 @@ setup(
         'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',

Missing function to fetch payment details made to a Virtual Account if payment is UPI Transfer
The docs says for UPI transaction there is a separate api call ([here](https://razorpay.com/docs/smart-collect/api/fetch/#upi)) to fetch payment details given an id. 

I see something similar is already done for `bank_account` payments. ([here](https://github.com/razorpay/razorpay-python/blob/5bc63fd8452165a4b54556888492e555222c8afe/razorpay/resources/payment.py#L94)) so please provide another function to fetch particular `upi_transfer` payment details.

Happy to give a PR sometime over the weekend if need be.

diff --git a/tests/helpers.py b/tests/helpers.py
index 96c706e..ed051a9 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -8,7 +8,9 @@ def mock_file(filename):
         return ''
     file_dir = os.path.dirname(__file__)
     file_path = "{}/mocks/{}.json".format(file_dir, filename)
-    return open(file_path).read()
+    with open(file_path) as f:
+        mock_file_data = f.read()
+    return mock_file_data
 
 
 class ClientTestCase(unittest.TestCase):
diff --git a/tests/mocks/fake_upi_transfer.json b/tests/mocks/fake_upi_transfer.json
new file mode 100644
index 0000000..bf1d891
--- /dev/null
+++ b/tests/mocks/fake_upi_transfer.json
@@ -0,0 +1,8 @@
+{
+    "amount": 10000,
+    "payer_vpa": null,
+    "payer_account": null,
+    "payer_bank": "Razorpay",
+    "payment_id": "fake_payment_id",
+    "virtual_account_id": "va_8J2ny4Naokqbpf"
+}
diff --git a/tests/test_client_payment.py b/tests/test_client_payment.py
index 1a01b28..926d949 100644
--- a/tests/test_client_payment.py
+++ b/tests/test_client_payment.py
@@ -92,3 +92,17 @@ class TestClientPayment(ClientTestCase):
         response = self.client.payment.bank_transfer(self.payment_id)
         self.assertEqual(response['virtual_account_id'], 'va_8J2ny4Naokqbpe')
         self.assertEqual(response['payment_id'], self.payment_id)
+
+    @responses.activate
+    def test_upi_transfer_fetch(self):
+        result = mock_file('fake_upi_transfer')
+        url = '{}/{}/upi_transfer'.format(self.base_url, self.payment_id)
+        responses.add(responses.GET,
+                      url,
+                      status=200,
+                      body=result,
+                      match_querystring=True)
+
+        response = self.client.payment.upi_transfer(self.payment_id)
+        self.assertEqual(response['virtual_account_id'], 'va_8J2ny4Naokqbpf')
+        self.assertEqual(response['payment_id'], self.payment_id)

pip install -e .
parse_log_pytest
pytest
nose coverage responses coveralls pytest
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
coveralls==3.3.1
docopt==0.6.2
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
nose==1.3.7
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
-e git+https://github.com/razorpay/razorpay-python.git@50cfc8269ea498751671770a7eb506f7eb91cbb9#egg=razorpay
requests==2.27.1
responses==0.17.0
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: razorpay-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - charset-normalizer==2.0.12
      - coverage==6.2
      - coveralls==3.3.1
      - docopt==0.6.2
      - idna==3.10
      - nose==1.3.7
      - requests==2.27.1
      - responses==0.17.0
      - six==1.17.0
      - urllib3==1.26.20
prefix: /opt/conda/envs/razorpay-python

tests/test_client_payment.py::TestClientPayment::test_upi_transfer_fetch
tests/test_client_payment.py::TestClientPayment::test_bank_transfer_fetch tests/test_client_payment.py::TestClientPayment::test_payment_all tests/test_client_payment.py::TestClientPayment::test_payment_all_with_options tests/test_client_payment.py::TestClientPayment::test_payment_capture tests/test_client_payment.py::TestClientPayment::test_payment_fetch tests/test_client_payment.py::TestClientPayment::test_refund_create tests/test_client_payment.py::TestClientPayment::test_transfer tests/test_client_payment.py::TestClientPayment::test_transfer_fetch
setup.py .travis.yml razorpay/resources/payment.py
setup.py .travis.yml razorpay/resources/payment.py