From 0b87cbab319f333bf1948df4dba0ba35c1afca0c Mon Sep 17 00:00:00 2001 From: ankitdas13 Date: Sat, 16 Mar 2024 17:42:56 +0530 Subject: [PATCH 1/4] added endpoint --- documents/document.md | 66 +++++++++++++++++ src/main/java/com/razorpay/ApiUtils.java | 44 ++++++++++- src/main/java/com/razorpay/Constants.java | 3 + src/main/java/com/razorpay/Document.java | 10 +++ .../java/com/razorpay/DocumentClient.java | 16 ++++ .../java/com/razorpay/RazorpayClient.java | 2 + .../java/com/razorpay/DocumentClientTest.java | 73 +++++++++++++++++++ 7 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 documents/document.md create mode 100644 src/main/java/com/razorpay/Document.java create mode 100644 src/main/java/com/razorpay/DocumentClient.java create mode 100644 src/test/java/com/razorpay/DocumentClientTest.java diff --git a/documents/document.md b/documents/document.md new file mode 100644 index 00000000..cd7088cb --- /dev/null +++ b/documents/document.md @@ -0,0 +1,66 @@ +## Document + +### Create a Document + +```java + JSONObject request = new JSONObject(); + request.put("file","/Users/your_name/Downloads/sample_uploaded.pdf"); + request.put("purpose","dispute_evidence"); + + Document document = instance.document.create(request); +``` + +**Parameters:** + +| Name | Type | Description | +|-------|-----------|--------------------------------------------------| +| file* | string | The URL generated once the business proof document is uploaded. | +| purpose | string | Possible value is `dispute_evidence` | + +**Response:** +```json +{ + "id": "doc_EsyWjHrfzb59Re", + "entity": "document", + "purpose": "dispute_evidence", + "name": "doc_19_12_2020.jpg", + "mime_type": "image/png", + "size": 2863, + "created_at": 1590604200 +} +``` +------------------------------------------------------------------------------------------------------- + +### Fetch Document Information + +```java +String documentId = "doc_EsyWjHrfzb59Re"; + +Document document = instance.document.fetch(documentId); +``` + +**Parameters:** + +| Name | Type | Description | +|-------|--------|--------------------------------------------------| +| documentId | string | The unique identifier of the document. | + +**Response:** +```json +{ + "entity": "document", + "id": "doc_00000000000000", + "purpose": "dispute_evidence", + "created_at": 1701701378, + "mime_type": "application/pdf", + "display_name": "ppm_00000000000000", + "size": 404678, + "url": "" +} +``` +------------------------------------------------------------------------------------------------------- + +**PN: * indicates mandatory fields** +
+
+**For reference click [here](https://razorpay.com/docs/api/documents)** \ No newline at end of file diff --git a/src/main/java/com/razorpay/ApiUtils.java b/src/main/java/com/razorpay/ApiUtils.java index e4cd386a..c02b4070 100755 --- a/src/main/java/com/razorpay/ApiUtils.java +++ b/src/main/java/com/razorpay/ApiUtils.java @@ -1,5 +1,6 @@ package com.razorpay; +import java.io.File; import java.io.IOException; import java.security.KeyStore; import java.security.KeyStoreException; @@ -23,6 +24,8 @@ import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; +import okhttp3.MultipartBody; +import okhttp3.MediaType; class ApiUtils { @@ -75,8 +78,15 @@ static Response postRequest(String version, String path, JSONObject requestObjec HttpUrl.Builder builder = getBuilder(version, path, host); - String requestContent = requestObject == null ? "" : requestObject.toString(); - RequestBody requestBody = RequestBody.create(Constants.MEDIA_TYPE_JSON, requestContent); + RequestBody requestBody; + + if(requestObject.has("file")){ + requestBody = fileRequestBody(requestObject); + }else{ + String requestContent = requestObject == null ? "" : requestObject.toString(); + requestBody = RequestBody.create(Constants.MEDIA_TYPE_JSON, requestContent); + } + Request request = createRequest(Method.POST.name(), builder.build().toString(), requestBody, auth); return processRequest(request); @@ -225,4 +235,34 @@ private static X509TrustManager createDefaultTrustManager() throws NoSuchAlgorit X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; return trustManager; } + + private static String getMediaType(String fileName){ + int extensionIndex = fileName.lastIndexOf('.'); + String extenionName = fileName.substring(extensionIndex + 1); + if(extenionName == "jpg" | extenionName == "jpeg" | extenionName == "png" | extenionName == "jfif"){ + return "image/jpg"; + } + return "image/pdf"; + } + + private static RequestBody fileRequestBody(JSONObject requestObject){ + File fileToUpload = new File((String) requestObject.get("file")); + String fileName = fileToUpload.getName(); + + MediaType mediaType = MediaType.parse(getMediaType(fileName)); + RequestBody fileBody = RequestBody.create(mediaType, fileToUpload); + + MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); + multipartBodyBuilder.addFormDataPart("file",fileName, fileBody); + + Iterator iterator = requestObject.keys(); + while (iterator.hasNext()) { + Object key = iterator.next(); + Object value = requestObject.get(key.toString()); + multipartBodyBuilder.addFormDataPart((String) key, (String) value); + } + + MultipartBody requestBody = multipartBodyBuilder.build(); + return requestBody; + } } diff --git a/src/main/java/com/razorpay/Constants.java b/src/main/java/com/razorpay/Constants.java index 98452716..5bcde0cc 100755 --- a/src/main/java/com/razorpay/Constants.java +++ b/src/main/java/com/razorpay/Constants.java @@ -170,4 +170,7 @@ public class Constants { static final String TOKEN = "/token"; static final String REVOKE = "/revoke"; + static final String DOCUMENTS = "/documents"; + + static final String DOCUMENT_FETCH = "/documents/%s"; } diff --git a/src/main/java/com/razorpay/Document.java b/src/main/java/com/razorpay/Document.java new file mode 100644 index 00000000..2c8a9b95 --- /dev/null +++ b/src/main/java/com/razorpay/Document.java @@ -0,0 +1,10 @@ +package com.razorpay; + +import org.json.JSONObject; + +public class Document extends Entity { + + public Document(JSONObject jsonObject) { + super(jsonObject); + } +} diff --git a/src/main/java/com/razorpay/DocumentClient.java b/src/main/java/com/razorpay/DocumentClient.java new file mode 100644 index 00000000..d40cba69 --- /dev/null +++ b/src/main/java/com/razorpay/DocumentClient.java @@ -0,0 +1,16 @@ +package com.razorpay; + +import org.json.JSONObject; + +public class DocumentClient extends ApiClient { + + DocumentClient(String auth) {super(auth);} + + public Document create(JSONObject request) throws RazorpayException { + return post(Constants.VERSION, Constants.DOCUMENTS, request); + } + + public Document fetch(String id) throws RazorpayException { + return get(Constants.VERSION, String.format(Constants.DOCUMENT_FETCH, id), null); + } +} diff --git a/src/main/java/com/razorpay/RazorpayClient.java b/src/main/java/com/razorpay/RazorpayClient.java index f009117f..0fec4667 100755 --- a/src/main/java/com/razorpay/RazorpayClient.java +++ b/src/main/java/com/razorpay/RazorpayClient.java @@ -29,6 +29,7 @@ public class RazorpayClient { public ProductClient product; public WebhookClient webhook; public TncMap tncMap; + public DocumentClient document; public RazorpayClient(String key, String secret) throws RazorpayException { this(key, secret, false); } @@ -66,6 +67,7 @@ private void initializeResources(String auth, Boolean enableLogging) throws Razo stakeholder = new StakeholderClient(auth); product = new ProductClient(auth); webhook = new WebhookClient(auth); + document = new DocumentClient(auth); } public RazorpayClient addHeaders(Map headers) { diff --git a/src/test/java/com/razorpay/DocumentClientTest.java b/src/test/java/com/razorpay/DocumentClientTest.java new file mode 100644 index 00000000..3ba37433 --- /dev/null +++ b/src/test/java/com/razorpay/DocumentClientTest.java @@ -0,0 +1,73 @@ +package com.razorpay; + +import org.json.JSONObject; +import org.junit.Test; +import org.mockito.InjectMocks; +import java.io.IOException; +import static org.junit.Assert.*; + +public class DocumentClientTest extends BaseTest{ + + @InjectMocks + protected DocumentClient documentClient = new DocumentClient(TEST_SECRET_KEY); + + private static final String DOCUMENT_ID = "doc_EsyWjHrfzb59Re"; + + @Test + public void create() throws RazorpayException { + RazorpayClient razorpayclient = new RazorpayClient("rzp_test_tFM6xSYWnGUa8D","47ngXj8T4IP44KFPJHRv7ST4"); + JSONObject request = new JSONObject(); + request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); + request.put("purpose","dispute_evidence"); + + String mockedResponseJson = "{\n" + + " \"id\": \"doc_EsyWjHrfzb59Re\",\n" + + " \"entity\": \"document\",\n" + + " \"purpose\": \"dispute_evidence\",\n" + + " \"name\": \"file_19_18_2020.jpg\",\n" + + " \"mime_type\": \"image/png\",\n" + + " \"size\": 2863,\n" + + " \"created_at\": 1590604200\n" + + "}"; + try { + mockResponseFromExternalClient(mockedResponseJson); + mockResponseHTTPCodeFromExternalClient(200); + Document document = documentClient.create(request); + assertNotNull(document); + assertEquals("document",document.get("entity")); + assertTrue(document.has("name")); + assertTrue(document.has("size")); + String createRequest = getHost(Constants.DOCUMENTS); + verifySentRequest(true, request.toString(), createRequest); + } catch (IOException e) { + assertTrue(false); + } + } + + @Test + public void fetch() throws RazorpayException { + + String mockedResponseJson = "{\n" + + " \"id\": \"doc_EsyWjHrfzb59Re\",\n" + + " \"entity\": \"document\",\n" + + " \"purpose\": \"dispute_evidence\",\n" + + " \"name\": \"doc_19_12_2020.jpg\",\n" + + " \"mime_type\": \"image/png\",\n" + + " \"size\": 2863,\n" + + " \"created_at\": 1590604200\n" + + "}"; + try { + mockResponseFromExternalClient(mockedResponseJson); + mockResponseHTTPCodeFromExternalClient(200); + Document fetch = documentClient.fetch(DOCUMENT_ID); + assertNotNull(fetch); + assertEquals(DOCUMENT_ID,fetch.get("id")); + assertTrue(fetch.has("purpose")); + assertTrue(fetch.has("name")); + String fetchRequest = getHost(String.format(Constants.DOCUMENT_FETCH,DOCUMENT_ID)); + verifySentRequest(false, null, fetchRequest); + } catch (IOException e) { + assertTrue(false); + } + } +} \ No newline at end of file From 1928bb77d4c9877d7a5080d752d22af468935892 Mon Sep 17 00:00:00 2001 From: ankitdas13 Date: Mon, 25 Mar 2024 19:26:53 +0530 Subject: [PATCH 2/4] update account --- documents/account.md | 57 +++++++++++++++++++ src/main/java/com/razorpay/AccountClient.java | 7 +++ src/main/java/com/razorpay/Constants.java | 2 + .../java/com/razorpay/AccountClientTest.java | 49 ++++++++++++++++ .../java/com/razorpay/DocumentClientTest.java | 1 - 5 files changed, 115 insertions(+), 1 deletion(-) diff --git a/documents/account.md b/documents/account.md index 40070cfd..6ecb3b64 100644 --- a/documents/account.md +++ b/documents/account.md @@ -402,6 +402,63 @@ Account account = instance.account.fetch(accountId); ------------------------------------------------------------------------------------------------------- +### Upload account documents +```java +String accountId = "acc_M83Uw27KXuC7c8"; + +JSONObject request = new JSONObject(); +request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); +request.put("document_type","business_proof_url"); + +Account account = instance.account.uploadAccountDoc(accountId, request); +``` + +**Parameters:** + +| Name | Type | Description | +|-------------|-------------|---------------------------------------------| +| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | +| file* | string | The URL generated once the business proof document is uploaded. | +| document_type* | string | The documents valid for the proof type to be shared. Possible values :
business_proof_of_identification: `shop_establishment_certificate`, `gst_certificate`, `msme_certificate`, `business_proof_url`, `business_pan_url`,

additional_documents : `form_12_a_url`, `form_80g_url`, `cancelled_cheque` | + +**Response:** +```json +{ + "business_proof_of_identification": [ + { + "type": "business_proof_url", + "url": "" + } + ] +} +``` +------------------------------------------------------------------------------------------------------- + +### Fetch account documents +```java +String accountId = "acc_LryDIBIjBDbOWy"; + +Account account = instance.account.fetchAccountDoc(accountId); +``` + +**Parameters:** + +| Name | Type | Description | +|-------------|-------------|---------------------------------------------| +| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | + +**Response:** +```json +{ + "business_proof_of_identification": [ + { + "type": "business_proof_url", + "url": "" + } + ] +} +``` +------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields**

diff --git a/src/main/java/com/razorpay/AccountClient.java b/src/main/java/com/razorpay/AccountClient.java index 03e49c3c..b17c230b 100644 --- a/src/main/java/com/razorpay/AccountClient.java +++ b/src/main/java/com/razorpay/AccountClient.java @@ -22,4 +22,11 @@ public Account edit(String id, JSONObject request) throws RazorpayException { public Account delete(String id) throws RazorpayException { return delete(Constants.VERSION_V2, String.format(Constants.ACCOUNT_DELETE, id), null); } + + public Account uploadAccountDoc(String id, JSONObject request) throws RazorpayException { + return post(Constants.VERSION_V2, String.format(Constants.UPLOAD_ACCOUNT_DOCUMENT, id), request); + } + public Account fetchAccountDoc(String id) throws RazorpayException { + return get(Constants.VERSION_V2, String.format(Constants.UPLOAD_ACCOUNT_DOCUMENT, id), null); + } } diff --git a/src/main/java/com/razorpay/Constants.java b/src/main/java/com/razorpay/Constants.java index 5bcde0cc..33ee937a 100755 --- a/src/main/java/com/razorpay/Constants.java +++ b/src/main/java/com/razorpay/Constants.java @@ -173,4 +173,6 @@ public class Constants { static final String DOCUMENTS = "/documents"; static final String DOCUMENT_FETCH = "/documents/%s"; + + static final String UPLOAD_ACCOUNT_DOCUMENT = "accounts/%s/documents"; } diff --git a/src/test/java/com/razorpay/AccountClientTest.java b/src/test/java/com/razorpay/AccountClientTest.java index d67a3332..68ea3aaa 100644 --- a/src/test/java/com/razorpay/AccountClientTest.java +++ b/src/test/java/com/razorpay/AccountClientTest.java @@ -230,4 +230,53 @@ private String getResponse(String account_id) { " }\n" + "}"; } + + @Test + public void uploadAccountDoc() throws RazorpayException { + JSONObject request = new JSONObject(); + request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); + request.put("document_type","business_proof_url"); + + String mockedResponseJson = "{\n" + + " \"entity\": \"account\",\n" + + " \"business_proof_of_identification\": [\n" + + " {\n" + + " \"type\": \"business_proof_url\",\n" + + " \"url\": \"\"\n" + + " }\n" + + " ]\n" + + "}"; + try { + mockResponseFromExternalClient(mockedResponseJson); + mockResponseHTTPCodeFromExternalClient(200); + Account document = accountClient.uploadAccountDoc(ACCOUNT_ID, request); + assertNotNull(document); + assertEquals(true,document.has("business_proof_of_identification")); + } catch (IOException e) { + assertTrue(false); + } + } + + @Test + public void fetchAccountDoc() throws RazorpayException { + + String mockedResponseJson = "{\n" + + " \"entity\": \"account\",\n" + + " \"business_proof_of_identification\": [\n" + + " {\n" + + " \"type\": \"business_proof_url\",\n" + + " \"url\": \"\"\n" + + " }\n" + + " ]\n" + + "}"; + try { + mockResponseFromExternalClient(mockedResponseJson); + mockResponseHTTPCodeFromExternalClient(200); + Account document = accountClient.fetchAccountDoc(ACCOUNT_ID); + assertNotNull(document); + assertEquals(true,document.has("business_proof_of_identification")); + } catch (IOException e) { + assertTrue(false); + } + } } diff --git a/src/test/java/com/razorpay/DocumentClientTest.java b/src/test/java/com/razorpay/DocumentClientTest.java index 3ba37433..a123c7b2 100644 --- a/src/test/java/com/razorpay/DocumentClientTest.java +++ b/src/test/java/com/razorpay/DocumentClientTest.java @@ -15,7 +15,6 @@ public class DocumentClientTest extends BaseTest{ @Test public void create() throws RazorpayException { - RazorpayClient razorpayclient = new RazorpayClient("rzp_test_tFM6xSYWnGUa8D","47ngXj8T4IP44KFPJHRv7ST4"); JSONObject request = new JSONObject(); request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); request.put("purpose","dispute_evidence"); From 8c37bc5bdc4cfd4e626af4e6def837aadf4dab33 Mon Sep 17 00:00:00 2001 From: ankitdas13 Date: Tue, 26 Mar 2024 13:32:57 +0530 Subject: [PATCH 3/4] update jdoc & json object --- documents/account.md | 14 +++---- .../java/com/razorpay/AccountClientTest.java | 40 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/documents/account.md b/documents/account.md index 6ecb3b64..265def18 100644 --- a/documents/account.md +++ b/documents/account.md @@ -415,10 +415,10 @@ Account account = instance.account.uploadAccountDoc(accountId, request); **Parameters:** -| Name | Type | Description | -|-------------|-------------|---------------------------------------------| -| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | -| file* | string | The URL generated once the business proof document is uploaded. | +| Name | Type | Description | +|----------------|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | +| file* | string | The URL generated once the business proof document is uploaded. | | document_type* | string | The documents valid for the proof type to be shared. Possible values :
business_proof_of_identification: `shop_establishment_certificate`, `gst_certificate`, `msme_certificate`, `business_proof_url`, `business_pan_url`,

additional_documents : `form_12_a_url`, `form_80g_url`, `cancelled_cheque` | **Response:** @@ -443,9 +443,9 @@ Account account = instance.account.fetchAccountDoc(accountId); **Parameters:** -| Name | Type | Description | -|-------------|-------------|---------------------------------------------| -| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | +| Name | Type | Description | +|-------------|-------------|------------------------------------------------------------------------| +| accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json diff --git a/src/test/java/com/razorpay/AccountClientTest.java b/src/test/java/com/razorpay/AccountClientTest.java index 68ea3aaa..3f81fd65 100644 --- a/src/test/java/com/razorpay/AccountClientTest.java +++ b/src/test/java/com/razorpay/AccountClientTest.java @@ -1,5 +1,6 @@ package com.razorpay; +import org.json.JSONArray; import org.json.JSONObject; import org.junit.Test; import org.mockito.InjectMocks; @@ -237,17 +238,17 @@ public void uploadAccountDoc() throws RazorpayException { request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); request.put("document_type","business_proof_url"); - String mockedResponseJson = "{\n" + - " \"entity\": \"account\",\n" + - " \"business_proof_of_identification\": [\n" + - " {\n" + - " \"type\": \"business_proof_url\",\n" + - " \"url\": \"\"\n" + - " }\n" + - " ]\n" + - "}"; + JSONObject mockedResponseJson = new JSONObject(); + mockedResponseJson.put("entity","account"); + JSONArray businessArray = new JSONArray(); + JSONObject businessObj = new JSONObject(); + businessObj.put("type","business_proof_url"); + businessObj.put("url",""); + businessArray.put(businessObj); + mockedResponseJson.put("business_proof_of_identification",businessArray); + try { - mockResponseFromExternalClient(mockedResponseJson); + mockResponseFromExternalClient(mockedResponseJson.toString()); mockResponseHTTPCodeFromExternalClient(200); Account document = accountClient.uploadAccountDoc(ACCOUNT_ID, request); assertNotNull(document); @@ -260,17 +261,16 @@ public void uploadAccountDoc() throws RazorpayException { @Test public void fetchAccountDoc() throws RazorpayException { - String mockedResponseJson = "{\n" + - " \"entity\": \"account\",\n" + - " \"business_proof_of_identification\": [\n" + - " {\n" + - " \"type\": \"business_proof_url\",\n" + - " \"url\": \"\"\n" + - " }\n" + - " ]\n" + - "}"; + JSONObject mockedResponseJson = new JSONObject(); + mockedResponseJson.put("entity","account"); + JSONArray businessArray = new JSONArray(); + JSONObject businessObj = new JSONObject(); + businessObj.put("type","business_proof_url"); + businessObj.put("url",""); + businessArray.put(businessObj); + mockedResponseJson.put("business_proof_of_identification",businessArray); try { - mockResponseFromExternalClient(mockedResponseJson); + mockResponseFromExternalClient(mockedResponseJson.toString()); mockResponseHTTPCodeFromExternalClient(200); Account document = accountClient.fetchAccountDoc(ACCOUNT_ID); assertNotNull(document); From 4a46d687d24522058165127a19cd9ac96b85fdd1 Mon Sep 17 00:00:00 2001 From: ankitdas13 Date: Mon, 1 Apr 2024 12:50:34 +0530 Subject: [PATCH 4/4] change file url --- documents/account.md | 2 +- src/test/java/com/razorpay/AccountClientTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documents/account.md b/documents/account.md index 265def18..dfc2a68c 100644 --- a/documents/account.md +++ b/documents/account.md @@ -407,7 +407,7 @@ Account account = instance.account.fetch(accountId); String accountId = "acc_M83Uw27KXuC7c8"; JSONObject request = new JSONObject(); -request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); +request.put("files","/Users/your_name/Downloads/sample_uploaded.jpeg"); request.put("document_type","business_proof_url"); Account account = instance.account.uploadAccountDoc(accountId, request); diff --git a/src/test/java/com/razorpay/AccountClientTest.java b/src/test/java/com/razorpay/AccountClientTest.java index 3f81fd65..6ebba9dc 100644 --- a/src/test/java/com/razorpay/AccountClientTest.java +++ b/src/test/java/com/razorpay/AccountClientTest.java @@ -235,7 +235,7 @@ private String getResponse(String account_id) { @Test public void uploadAccountDoc() throws RazorpayException { JSONObject request = new JSONObject(); - request.put("files","/Users/your_name/Downloads/sample_uploaded.pdf"); + request.put("files","/Users/your_name/Downloads/sample_uploaded.jpeg"); request.put("document_type","business_proof_url"); JSONObject mockedResponseJson = new JSONObject();