| Line 16... |
Line 16... |
| 16 |
import java.util.Map;
|
16 |
import java.util.Map;
|
| 17 |
|
17 |
|
| 18 |
@Component
|
18 |
@Component
|
| 19 |
public class RazorpayXClient {
|
19 |
public class RazorpayXClient {
|
| 20 |
|
20 |
|
| 21 |
private static final Logger LOGGER = LogManager.getLogger(RecordingService.class);
|
21 |
private static final Logger LOGGER = LogManager.getLogger(RazorpayXClient.class);
|
| 22 |
|
22 |
|
| 23 |
@Value("${razorpay.x.account.keyId}")
|
23 |
@Value("${razorpay.x.account.keyId}")
|
| 24 |
private String API_KEY;
|
24 |
private String API_KEY;
|
| 25 |
|
25 |
|
| 26 |
@Value("${razorpay.x.account.keySecret}")
|
26 |
@Value("${razorpay.x.account.keySecret}")
|
| Line 33... |
Line 33... |
| 33 |
private String RAZORPAYX_ACCOUNT;
|
33 |
private String RAZORPAYX_ACCOUNT;
|
| 34 |
|
34 |
|
| 35 |
@Autowired
|
35 |
@Autowired
|
| 36 |
private RestClient restClient; // same utility you used for Knowlarity
|
36 |
private RestClient restClient; // same utility you used for Knowlarity
|
| 37 |
|
37 |
|
| 38 |
public String createPayout(String fundAccountId, Double amount,String idempotencyKey, String currency) throws Exception {
|
38 |
public String createPayoutRaw(String fundAccountId, Double amount, String idempotencyKey, String currency) throws Exception {
|
| 39 |
JSONObject payload = new JSONObject();
|
39 |
JSONObject payload = new JSONObject();
|
| 40 |
payload.put("account_number", RAZORPAYX_ACCOUNT); // RazorpayX virtual account
|
40 |
payload.put("account_number", RAZORPAYX_ACCOUNT);
|
| 41 |
payload.put("fund_account_id", fundAccountId); // partner fund account id
|
41 |
payload.put("fund_account_id", fundAccountId);
|
| 42 |
payload.put("amount", (int) (amount * 100)); // amount in paise
|
42 |
payload.put("amount", (int) (amount * 100));
|
| 43 |
payload.put("currency", currency);
|
43 |
payload.put("currency", currency);
|
| 44 |
payload.put("mode", "IMPS"); // or NEFT, UPI
|
44 |
payload.put("mode", "IMPS");
|
| 45 |
payload.put("purpose", "payout");
|
45 |
payload.put("purpose", "payout");
|
| 46 |
payload.put("queue_if_low_balance", true);
|
46 |
payload.put("queue_if_low_balance", true);
|
| 47 |
|
47 |
|
| 48 |
try {
|
48 |
try {
|
| 49 |
Map<String, String> headers = getAuthHeaders();
|
49 |
Map<String, String> headers = getAuthHeaders();
|
| 50 |
headers.put("X-Payout-Idempotency", idempotencyKey);
|
50 |
headers.put("X-Payout-Idempotency", idempotencyKey);
|
| 51 |
LOGGER.info("Sending RazorpayX payout request: {}", payload);
|
51 |
LOGGER.info("Sending RazorpayX payout request: {}", payload);
|
| 52 |
String url = BASE_URL + "/payouts";
|
52 |
String url = BASE_URL + "/payouts";
|
| 53 |
String response = restClient.post(url, payload.toString(), headers);
|
53 |
return restClient.post(url, payload.toString(), headers);
|
| 54 |
LOGGER.info("RazorpayX payout response: {}", response);
|
- |
|
| 55 |
|
- |
|
| 56 |
JSONObject json = new JSONObject(response);
|
- |
|
| 57 |
return json.getString("id"); // payoutId
|
- |
|
| 58 |
} catch (Exception e) {
|
54 |
} catch (Exception e) {
|
| 59 |
LOGGER.error("Failed to create payout", e);
|
55 |
LOGGER.error("Failed to create payout", e);
|
| 60 |
throw e;
|
56 |
throw e;
|
| 61 |
}
|
57 |
}
|
| 62 |
}
|
58 |
}
|
| 63 |
|
59 |
|
| - |
|
60 |
|
| 64 |
public JSONObject fetchPayoutStatus(String payoutId) throws Exception {
|
61 |
public JSONObject fetchPayoutStatus(String payoutId) throws Exception {
|
| 65 |
String url = BASE_URL + "/payouts/" + payoutId;
|
62 |
String url = BASE_URL + "/payouts/" + payoutId;
|
| 66 |
String response = restClient.get(url,null, getAuthHeaders());
|
63 |
String response = restClient.get(url,null, getAuthHeaders());
|
| 67 |
|
64 |
|
| 68 |
return new JSONObject(response);
|
65 |
return new JSONObject(response);
|