diff --git a/documents/payment.md b/documents/payment.md
index e1c0df8..4b1987e 100644
--- a/documents/payment.md
+++ b/documents/payment.md
@@ -863,6 +863,259 @@ Razorpay::Iin.fetch(tokenIin);
}
```
-------------------------------------------------------------------------------------------------------
+-------------------------------------------------------------------------------------------------------
+
+### Fetch a Payment (With Expanded EMI Details)
+
+```rb
+Razorpay::Payment.expand_details("pay_XXXXXXXXXXXXXX",{"expand[]": "emi"})
+```
+
+**Parameters:**
+
+| Name | Type | Description |
+|-------------|---------|------------------------------------------------------------------|
+| paymentId* | integer | Unique identifier of the payment |
+| expand[] | string | Use to expand the `emi` details when the payment method is emi. |
+
+**Response:**
+
+```json
+{
+ "id": "pay_DG4ZdRK8ZnXC3k",
+ "entity": "payment",
+ "amount": 200000,
+ "currency": "INR",
+ "status": "authorized",
+ "order_id": null,
+ "invoice_id": null,
+ "international": false,
+ "method": "emi",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": false,
+ "description": null,
+ "card_id": "card_DG4ZdUO3xABb20",
+ "bank": "ICIC",
+ "wallet": null,
+ "vpa": null,
+ "email": "gaurav@example.com",
+ "contact": "+919972000005",
+ "notes": [],
+ "fee": null,
+ "tax": null,
+ "error_code": null,
+ "error_description": null,
+ "error_source": null,
+ "error_step": null,
+ "error_reason": null,
+ "emi": {
+ "issuer": "ICIC",
+ "rate": 1300,
+ "duration": 6
+ },
+ "acquirer_data": {
+ "auth_code": "828553"
+ },
+ "created_at": 1568026077
+}
+```
+-------------------------------------------------------------------------------------------------------
+
+### Fetch a Payment (With Expanded Card Details)
+
+```rb
+Razorpay::Payment.expand_details("pay_XXXXXXXXXXXXXX", {"expand[]": "card"})
+```
+
+**Parameters:**
+
+| Name | Type | Description |
+|-------------|---------|---------------------------------------------------------------------|
+| paymentId* | integer | Unique identifier of the payment |
+| expand[] | string | Use to expand the card details when the payment method is `card`. |
+
+**Response:**
+
+```json
+{
+ "id": "pay_H9oR0gLCaVlV6m",
+ "entity": "payment",
+ "amount": 100,
+ "currency": "INR",
+ "status": "failed",
+ "order_id": "order_H9o58N6qmLYQKC",
+ "invoice_id": null,
+ "terminal_id": "term_G5kJnYM9GhhLYT",
+ "international": false,
+ "method": "card",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": false,
+ "description": null,
+ "card_id": "card_H9oR0ocen1cmZq",
+ "card": {
+ "id": "card_H9oR0ocen1cmZq",
+ "entity": "card",
+ "name": "Gaurav",
+ "last4": "1213",
+ "network": "RuPay",
+ "type": "credit",
+ "issuer": "UTIB",
+ "international": false,
+ "emi": false,
+ "sub_type": "business"
+ },
+ "bank": null,
+ "wallet": null,
+ "vpa": null,
+ "email": "gaurav.kumar@example.com",
+ "contact": "+919000090000",
+ "notes": {
+ "email": "gaurav.kumar@example.com",
+ "phone": "09000090000"
+ },
+ "fee": null,
+ "tax": null,
+ "error_code": "BAD_REQUEST_ERROR",
+ "error_description": "Card issuer is invalid",
+ "error_source": "customer",
+ "error_step": "payment_authentication",
+ "error_reason": "incorrect_card_details",
+ "acquirer_data": {
+ "auth_code": null,
+ "authentication_reference_number": "100222021120200000000742753928"
+ },
+ "created_at": 1620807547
+}
+```
+
+-------------------------------------------------------------------------------------------------------
+
+### Fetch a Payment (With Expanded Offers Details)
+
+```rb
+Razorpay::Payment.expand_details("pay_XXXXXXXXXXXXXX", {"expand[]": "offers"})
+```
+
+**Parameters:**
+
+| Name | Type | Description |
+|-------------|---------|----------------------------------------------------------------|
+| paymentId* | integer | Unique identifier of the payment |
+| expand[] | string | Use to expand the offers applied to a payment. |
+
+**Response:**
+
+```json
+{
+ "id": "pay_G8VaL2Z68LRtDs",
+ "entity": "payment",
+ "amount": 900,
+ "currency": "INR",
+ "status": "captured",
+ "order_id": "order_G8VXfKDWDEOHHd",
+ "invoice_id": null,
+ "international": false,
+ "method": "netbanking",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": true,
+ "offers": {
+ "entity": "collection",
+ "count": 1,
+ "items": [
+ {
+ "id": "offer_G8VXOp0qNuEXzh"
+ }
+ ]
+ },
+ "description": "Purchase Shoes",
+ "card_id": null,
+ "bank": "KKBK",
+ "wallet": null,
+ "vpa": null,
+ "email": "gaurav.kumar@example.com",
+ "contact": "+919000090000",
+ "customer_id": "cust_DitrYCFtCIokBO",
+ "notes": [],
+ "fee": 22,
+ "tax": 4,
+ "error_code": null,
+ "error_description": null,
+ "error_source": null,
+ "error_step": null,
+ "error_reason": null,
+ "acquirer_data": {
+ "bank_transaction_id": "0125836177",
+ "authentication_reference_number": "100222021120200000000742753928"
+ },
+ "created_at": 1606985740
+}
+```
+
+-------------------------------------------------------------------------------------------------------
+
+### Fetch a Payment (With Expanded UPI Details)
+
+```rb
+Razorpay::Payment.expand_details("pay_XXXXXXXXXXXXXX", {"expand[]": "upi"})
+```
+
+**Parameters:**
+
+| Name | Type | Description |
+|-------------|---------|---------------------------------------------------------------|
+| paymentId* | integer | Unique identifier of the payment |
+| expand[] | string | Use to expand the UPI details when the payment method is upi. |
+
+**Response:**
+
+```json
+{
+ "id": "pay_DG4ZdRK8ZnXC3k",
+ "entity": "payment",
+ "amount": 100,
+ "currency": "INR",
+ "status": "captured",
+ "order_id": "order_GjCr5oKh4AVC51",
+ "invoice_id": null,
+ "international": false,
+ "method": "upi",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": true,
+ "description": "Payment for Adidas shoes",
+ "card_id": null,
+ "bank": null,
+ "wallet": null,
+ "vpa": "gaurav.kumar@upi",
+ "email": "gaurav.kumar@example.com",
+ "contact": "9000090000",
+ "customer_id": "cust_K6fNE0WJZWGqtN",
+ "token_id": "token_KOdY$DBYQOv08n",
+ "notes": [],
+ "fee": 1,
+ "tax": 0,
+ "error_code": null,
+ "error_description": null,
+ "error_source": null,
+ "error_step": null,
+ "error_reason": null,
+ "acquirer_data": {
+ "rrn": "303107535132"
+ },
+ "created_at": 1605871409,
+ "upi": {
+ "payer_account_type": "credit_card",
+ "vpa": "gaurav.kumar@upi",
+ "flow": "in_app" // appears only for Turbo UPI Payments.
+ }
+}
+```
+
+-------------------------------------------------------------------------------------------------------
+
**PN: * indicates mandatory fields**
diff --git a/lib/razorpay/payment.rb b/lib/razorpay/payment.rb
index d39f5a9..6185e1c 100644
--- a/lib/razorpay/payment.rb
+++ b/lib/razorpay/payment.rb
@@ -112,5 +112,9 @@ def self.create_upi(data={})
def self.validate_vpa(data={})
request.post "validate/vpa" , data
end
+
+ def self.expand_details(id, options={})
+ request.get "#{id}", options
+ end
end
end
diff --git a/test/fixtures/fake_payment_expanded_details.json b/test/fixtures/fake_payment_expanded_details.json
new file mode 100644
index 0000000..63229f3
--- /dev/null
+++ b/test/fixtures/fake_payment_expanded_details.json
@@ -0,0 +1,38 @@
+{
+ "id": "fake_payment_id",
+ "entity": "payment",
+ "amount": 200000,
+ "currency": "INR",
+ "status": "authorized",
+ "order_id": null,
+ "invoice_id": null,
+ "international": false,
+ "method": "emi",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": false,
+ "description": null,
+ "card_id": "card_DG4ZdUO3xABb20",
+ "bank": "ICIC",
+ "wallet": null,
+ "vpa": null,
+ "email": "gaurav@example.com",
+ "contact": "+919972000005",
+ "notes": [],
+ "fee": null,
+ "tax": null,
+ "error_code": null,
+ "error_description": null,
+ "error_source": null,
+ "error_step": null,
+ "error_reason": null,
+ "emi": {
+ "issuer": "ICIC",
+ "rate": 1300,
+ "duration": 6
+ },
+ "acquirer_data": {
+ "auth_code": "828553"
+ },
+ "created_at": 1568026077
+ }
diff --git a/test/fixtures/fake_payment_expanded_details_card.json b/test/fixtures/fake_payment_expanded_details_card.json
new file mode 100644
index 0000000..9f46783
--- /dev/null
+++ b/test/fixtures/fake_payment_expanded_details_card.json
@@ -0,0 +1,50 @@
+{
+ "id": "fake_payment_id",
+ "entity": "payment",
+ "amount": 100,
+ "currency": "INR",
+ "status": "failed",
+ "order_id": "order_H9o58N6qmLYQKC",
+ "invoice_id": null,
+ "terminal_id": "term_G5kJnYM9GhhLYT",
+ "international": false,
+ "method": "card",
+ "amount_refunded": 0,
+ "refund_status": null,
+ "captured": false,
+ "description": null,
+ "card_id": "card_H9oR0ocen1cmZq",
+ "card": {
+ "id": "card_H9oR0ocen1cmZq",
+ "entity": "card",
+ "name": "Gaurav",
+ "last4": "1213",
+ "network": "RuPay",
+ "type": "credit",
+ "issuer": "UTIB",
+ "international": false,
+ "emi": false,
+ "sub_type": "business"
+ },
+ "bank": null,
+ "wallet": null,
+ "vpa": null,
+ "email": "gaurav.kumar@example.com",
+ "contact": "+919000090000",
+ "notes": {
+ "email": "gaurav.kumar@example.com",
+ "phone": "09000090000"
+ },
+ "fee": null,
+ "tax": null,
+ "error_code": "BAD_REQUEST_ERROR",
+ "error_description": "Card issuer is invalid",
+ "error_source": "customer",
+ "error_step": "payment_authentication",
+ "error_reason": "incorrect_card_details",
+ "acquirer_data": {
+ "auth_code": null,
+ "authentication_reference_number": "100222021120200000000742753928"
+ },
+ "created_at": 1620807547
+ }
\ No newline at end of file
diff --git a/test/fixtures/payment_error.json b/test/fixtures/payment_error.json
new file mode 100644
index 0000000..ab33e9d
--- /dev/null
+++ b/test/fixtures/payment_error.json
@@ -0,0 +1,10 @@
+{
+ "error": {
+ "code": "BAD_REQUEST_ERROR",
+ "description": "The id provided does not exist",
+ "source": "business",
+ "step": "payment_initiation",
+ "reason": "input_validation_failed",
+ "metadata": {}
+ }
+}
\ No newline at end of file
diff --git a/test/razorpay/test_payment.rb b/test/razorpay/test_payment.rb
index a071f85..380c61d 100644
--- a/test/razorpay/test_payment.rb
+++ b/test/razorpay/test_payment.rb
@@ -298,6 +298,28 @@ def test_validate_vpa
stub_post(%r{payments/validate/vpa$}, 'fake_validate_vpa',param_attr.to_json)
payment = Razorpay::Payment.validate_vpa param_attr.to_json
assert_equal param_attr[:vpa], payment.vpa
- end
+ end
+
+ def test_expand_details_emi
+ stub_get("#{BASE_URI}/v1/payments/#{@payment_id}/?expand[]=emi", 'fake_payment_expanded_details')
+ payment = Razorpay::Payment.expand_details @payment_id
+ assert_equal @payment_id, payment.id
+ end
+
+ def test_expand_details_card
+ stub_get("#{BASE_URI}/v1/payments/#{@payment_id}/?expand[]=card", 'fake_payment_expanded_details')
+ payment = Razorpay::Payment.expand_details @payment_id
+ assert_equal @payment_id, payment.id
+ end
+
+ def test_expand_details_failure
+ stub_get(%r{payments\/#{@payment_id}$}, 'payment_error')
+ assert_raises(Razorpay::Error) do
+ payment = Razorpay::Payment.expand_details(@payment_id)
+ if payment.error
+ raise Razorpay::Error.new, payment.error['code']
+ end
+ end
+ end
end
end