medusa-payu-payment-plugin 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -16,9 +16,36 @@ const crypto_1 = __importDefault(require("crypto"));
|
|
|
16
16
|
*/
|
|
17
17
|
class PayuClient {
|
|
18
18
|
constructor(config, logger) {
|
|
19
|
+
/**
|
|
20
|
+
* Default API timeout in milliseconds (30 seconds)
|
|
21
|
+
*/
|
|
22
|
+
this.API_TIMEOUT_MS = 30000;
|
|
19
23
|
this.config = config;
|
|
20
24
|
this.logger = logger;
|
|
21
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Fetch with timeout to prevent hanging requests
|
|
28
|
+
*/
|
|
29
|
+
async fetchWithTimeout(url, options, timeoutMs = this.API_TIMEOUT_MS) {
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(url, {
|
|
34
|
+
...options,
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
});
|
|
37
|
+
return response;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
41
|
+
throw new Error(`PayU API request timed out after ${timeoutMs}ms`);
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
clearTimeout(timeoutId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
22
49
|
/**
|
|
23
50
|
* Get PayU payment URL
|
|
24
51
|
*/
|
|
@@ -85,7 +112,7 @@ class PayuClient {
|
|
|
85
112
|
const apiUrl = this.config.environment === "production"
|
|
86
113
|
? "https://info.payu.in/merchant/postservice.php?form=2"
|
|
87
114
|
: "https://test.payu.in/merchant/postservice.php?form=2";
|
|
88
|
-
const response = await
|
|
115
|
+
const response = await this.fetchWithTimeout(apiUrl, {
|
|
89
116
|
method: "POST",
|
|
90
117
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
91
118
|
body: new URLSearchParams({
|
|
@@ -107,7 +134,7 @@ class PayuClient {
|
|
|
107
134
|
const apiUrl = this.config.environment === "production"
|
|
108
135
|
? "https://info.payu.in/merchant/postservice.php?form=2"
|
|
109
136
|
: "https://test.payu.in/merchant/postservice.php?form=2";
|
|
110
|
-
const response = await
|
|
137
|
+
const response = await this.fetchWithTimeout(apiUrl, {
|
|
111
138
|
method: "POST",
|
|
112
139
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
113
140
|
body: new URLSearchParams({
|
|
@@ -131,4 +158,4 @@ function generateTxnId() {
|
|
|
131
158
|
const random = crypto_1.default.randomBytes(4).toString("hex");
|
|
132
159
|
return `TXN_${timestamp}_${random}`;
|
|
133
160
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9wYXl1L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7O0FBeU1ILHNDQUlDO0FBM01ELG9EQUEyQjtBQUkzQjs7R0FFRztBQUNILE1BQWEsVUFBVTtJQUluQixZQUFZLE1BQTBCLEVBQUUsTUFBZTtRQUt2RDs7V0FFRztRQUNjLG1CQUFjLEdBQUcsS0FBSyxDQUFBO1FBUG5DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQ3hCLENBQUM7SUFPRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDMUIsR0FBVyxFQUNYLE9BQW9CLEVBQ3BCLFlBQW9CLElBQUksQ0FBQyxjQUFjO1FBRXZDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7UUFDeEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUVqRSxJQUFJLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLEdBQUcsT0FBTztnQkFDVixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDNUIsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxRQUFRLENBQUE7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsU0FBUyxJQUFJLENBQUMsQ0FBQTtZQUN0RSxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDUCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFlBQVk7WUFDM0MsQ0FBQyxDQUFDLGlDQUFpQztZQUNuQyxDQUFDLENBQUMsK0JBQStCLENBQUE7SUFDekMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxtQkFBbUIsQ0FBQyxNQVduQjtRQUNHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFBO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFBO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRTlCLGdDQUFnQztRQUNoQywwRkFBMEY7UUFDMUYsd0ZBQXdGO1FBQ3hGLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksRUFBRSxDQUFBO1FBRTNLLE1BQU0sYUFBYSxHQUFHLGdCQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFaEcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxrQ0FBa0MsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFFdEUsT0FBTyxhQUFhLENBQUE7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsTUFjbEI7UUFDRyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQTtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQTtRQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixJQUFJLFVBQWtCLENBQUE7UUFDdEIsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixVQUFVLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUE7UUFDdE4sQ0FBQzthQUFNLENBQUM7WUFDSixVQUFVLEdBQUcsR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUMxTCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsZ0JBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNqRyxPQUFPLGNBQWMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUM3QixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQTtRQUNoQyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMvRixNQUFNLElBQUksR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXpFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFlBQVk7WUFDbkQsQ0FBQyxDQUFDLHNEQUFzRDtZQUN4RCxDQUFDLENBQUMsc0RBQXNELENBQUE7UUFFNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQ2pELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLG1DQUFtQyxFQUFFO1lBQ2hFLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQztnQkFDdEIsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDNUIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLElBQUksRUFBRSxLQUFLO2dCQUNYLElBQUksRUFBRSxJQUFJO2FBQ2IsQ0FBQztTQUNMLENBQUMsQ0FBQTtRQUVGLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBaUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUNSLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixNQUFjO1FBRWQsTUFBTSxPQUFPLEdBQUcsMkJBQTJCLENBQUE7UUFDM0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxPQUFPLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDbEcsTUFBTSxJQUFJLEdBQUcsZ0JBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV6RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZO1lBQ25ELENBQUMsQ0FBQyxzREFBc0Q7WUFDeEQsQ0FBQyxDQUFDLHNEQUFzRCxDQUFBO1FBRTVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtZQUNqRCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRTtZQUNoRSxJQUFJLEVBQUUsSUFBSSxlQUFlLENBQUM7Z0JBQ3RCLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQzVCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsSUFBSTthQUNiLENBQUM7U0FDTCxDQUFDLENBQUE7UUFFRixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQWlDLENBQUE7SUFDekQsQ0FBQztDQUNKO0FBM0xELGdDQTJMQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYTtJQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDNUIsTUFBTSxNQUFNLEdBQUcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BELE9BQU8sT0FBTyxTQUFTLElBQUksTUFBTSxFQUFFLENBQUE7QUFDdkMsQ0FBQyJ9
|
|
@@ -21,6 +21,18 @@ exports.PAYU_PROVIDER_ID = "payu";
|
|
|
21
21
|
* 5. authorizePayment - Verifies and marks payment as authorized
|
|
22
22
|
*/
|
|
23
23
|
class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
24
|
+
/**
|
|
25
|
+
* Validate provider options at startup
|
|
26
|
+
* Called by MedusaJS when registering the provider
|
|
27
|
+
*/
|
|
28
|
+
static validateOptions(options) {
|
|
29
|
+
if (!options.merchantKey) {
|
|
30
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "PayU: merchantKey is required. Set PAYU_MERCHANT_KEY environment variable.");
|
|
31
|
+
}
|
|
32
|
+
if (!options.merchantSalt) {
|
|
33
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "PayU: merchantSalt is required. Set PAYU_MERCHANT_SALT environment variable.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
24
36
|
constructor(container, config) {
|
|
25
37
|
super(container, config);
|
|
26
38
|
if (!config.merchantKey || !config.merchantSalt) {
|
|
@@ -53,14 +65,34 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
53
65
|
const txnid = (0, client_1.generateTxnId)();
|
|
54
66
|
const formattedAmount = this.formatAmount(amount);
|
|
55
67
|
const customer = context?.customer;
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
68
|
+
const inputData = input.data;
|
|
69
|
+
// Strict validation for required fields (legal compliance)
|
|
70
|
+
const email = customer?.email;
|
|
71
|
+
if (!email) {
|
|
72
|
+
throw new Error("Customer email is required for payment processing");
|
|
73
|
+
}
|
|
74
|
+
const firstname = customer?.first_name;
|
|
75
|
+
if (!firstname) {
|
|
76
|
+
throw new Error("Customer name is required for payment processing");
|
|
77
|
+
}
|
|
78
|
+
// Fallback chain: customer phone -> billing address phone -> shipping address phone
|
|
79
|
+
const phone = customer?.phone
|
|
80
|
+
|| customer?.billing_address?.phone
|
|
81
|
+
|| inputData?.shipping_address_phone;
|
|
82
|
+
if (!phone) {
|
|
83
|
+
throw new Error("Phone number is required for payment processing");
|
|
84
|
+
}
|
|
85
|
+
const productinfo = inputData?.productinfo || "Order Payment";
|
|
86
|
+
// Build redirect URLs from environment variables
|
|
87
|
+
const storefrontUrl = process.env.STOREFRONT_URL;
|
|
88
|
+
const redirectPath = process.env.PAYU_REDIRECT_URL;
|
|
89
|
+
const redirectFailurePath = process.env.PAYU_REDIRECT_FAILURE_URL;
|
|
90
|
+
if (!storefrontUrl || !redirectPath || !redirectFailurePath) {
|
|
91
|
+
throw new Error("STOREFRONT_URL, PAYU_REDIRECT_URL, and PAYU_REDIRECT_FAILURE_URL environment variables are required");
|
|
92
|
+
}
|
|
93
|
+
const countryCode = inputData?.country_code || "in";
|
|
94
|
+
const surl = `${storefrontUrl}/${countryCode}${redirectPath}`;
|
|
95
|
+
const furl = `${storefrontUrl}/${countryCode}${redirectFailurePath}`;
|
|
64
96
|
// Generate hash using SDK
|
|
65
97
|
const hash = this.client_.generatePaymentHash({
|
|
66
98
|
txnid,
|
|
@@ -228,7 +260,9 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
228
260
|
const sessionData = data;
|
|
229
261
|
if (amount) {
|
|
230
262
|
const formattedAmount = this.formatAmount(amount);
|
|
231
|
-
const storefrontUrl = process.env.STOREFRONT_URL || "
|
|
263
|
+
const storefrontUrl = process.env.STOREFRONT_URL || "";
|
|
264
|
+
const redirectPath = process.env.PAYU_REDIRECT_URL || "";
|
|
265
|
+
const redirectFailurePath = process.env.PAYU_REDIRECT_FAILURE_URL || "";
|
|
232
266
|
const hash = this.client_.generatePaymentHash({
|
|
233
267
|
txnid: sessionData.txnid,
|
|
234
268
|
amount: formattedAmount,
|
|
@@ -236,6 +270,8 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
236
270
|
firstname: sessionData.firstname,
|
|
237
271
|
email: sessionData.email,
|
|
238
272
|
});
|
|
273
|
+
const surl = `${storefrontUrl}/${sessionData.countryCode || 'in'}${redirectPath}`;
|
|
274
|
+
const furl = `${storefrontUrl}/${sessionData.countryCode || 'in'}${redirectFailurePath}`;
|
|
239
275
|
return {
|
|
240
276
|
data: {
|
|
241
277
|
...sessionData,
|
|
@@ -249,8 +285,8 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
249
285
|
firstname: sessionData.firstname,
|
|
250
286
|
email: sessionData.email,
|
|
251
287
|
phone: sessionData.phone,
|
|
252
|
-
surl
|
|
253
|
-
furl
|
|
288
|
+
surl,
|
|
289
|
+
furl,
|
|
254
290
|
hash,
|
|
255
291
|
service_provider: "payu_paisa",
|
|
256
292
|
},
|
|
@@ -266,12 +302,35 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
266
302
|
}
|
|
267
303
|
/**
|
|
268
304
|
* Handle webhook from PayU
|
|
305
|
+
*
|
|
306
|
+
* PayU sends webhooks for payment status updates.
|
|
307
|
+
* Webhook URL format: https://your-backend.com/hooks/payment/payu_payu
|
|
308
|
+
*
|
|
309
|
+
* The webhook payload is URL-encoded form data with fields matching PayuWebhookPayload.
|
|
310
|
+
* Hash verification ensures the webhook is authentic and hasn't been tampered with.
|
|
269
311
|
*/
|
|
270
312
|
async getWebhookActionAndData(data) {
|
|
271
313
|
try {
|
|
314
|
+
// Log raw data for debugging malformed webhooks
|
|
315
|
+
if (!data || !data.data) {
|
|
316
|
+
this.logger_?.error?.(`PayU webhook: INVALID PAYLOAD - No data received. ` +
|
|
317
|
+
`Raw payload: ${JSON.stringify(data)?.substring(0, 500) || 'undefined'}`);
|
|
318
|
+
return { action: "not_supported" };
|
|
319
|
+
}
|
|
272
320
|
const webhook = data.data;
|
|
273
|
-
|
|
274
|
-
|
|
321
|
+
// Validate required fields exist
|
|
322
|
+
if (!webhook.txnid || !webhook.status || !webhook.hash) {
|
|
323
|
+
this.logger_?.error?.(`PayU webhook: INVALID PAYLOAD - Missing required fields. ` +
|
|
324
|
+
`txnid=${webhook.txnid ?? 'MISSING'}, status=${webhook.status ?? 'MISSING'}, ` +
|
|
325
|
+
`hash=${webhook.hash ? 'present' : 'MISSING'}. ` +
|
|
326
|
+
`This may indicate PayU sent malformed data or the webhook URL received non-PayU traffic.`);
|
|
327
|
+
return { action: "not_supported" };
|
|
328
|
+
}
|
|
329
|
+
// Enhanced logging for production debugging and audit trail
|
|
330
|
+
this.logger_?.info?.(`PayU webhook received: txnid=${webhook.txnid}, mihpayid=${webhook.mihpayid || 'N/A'}, ` +
|
|
331
|
+
`status=${webhook.status}, amount=${webhook.amount || 'N/A'}, mode=${webhook.mode || 'N/A'}`);
|
|
332
|
+
// Verify hash to ensure webhook authenticity
|
|
333
|
+
// Formula: sha512(SALT|status||||||udf5|udf4|udf3|udf2|udf1|email|firstname|productinfo|amount|txnid|key)
|
|
275
334
|
const isValid = this.client_.verifyResponseHash({
|
|
276
335
|
status: webhook.status,
|
|
277
336
|
email: webhook.email,
|
|
@@ -287,12 +346,16 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
287
346
|
udf5: webhook.udf5,
|
|
288
347
|
});
|
|
289
348
|
if (!isValid) {
|
|
290
|
-
this.logger_?.warn?.(`PayU webhook:
|
|
349
|
+
this.logger_?.warn?.(`PayU webhook: Hash verification FAILED for txnid=${webhook.txnid}. ` +
|
|
350
|
+
`This could indicate a tampered webhook or configuration mismatch.`);
|
|
291
351
|
return { action: "not_supported" };
|
|
292
352
|
}
|
|
353
|
+
this.logger_?.debug?.(`PayU webhook: Hash verified successfully for txnid=${webhook.txnid}`);
|
|
354
|
+
// Session ID matches the transaction ID returned from initiatePayment
|
|
293
355
|
const sessionId = webhook.udf1 || webhook.txnid;
|
|
294
356
|
const status = webhook.status.toLowerCase();
|
|
295
357
|
if (status === "success") {
|
|
358
|
+
this.logger_?.info?.(`PayU webhook: Payment SUCCESS for txnid=${webhook.txnid}, authorizing session ${sessionId}`);
|
|
296
359
|
return {
|
|
297
360
|
action: "authorized",
|
|
298
361
|
data: {
|
|
@@ -302,6 +365,8 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
302
365
|
};
|
|
303
366
|
}
|
|
304
367
|
if (status === "failure" || status === "failed") {
|
|
368
|
+
this.logger_?.info?.(`PayU webhook: Payment FAILED for txnid=${webhook.txnid}, ` +
|
|
369
|
+
`error=${webhook.error || 'N/A'}, error_Message=${webhook.error_Message || 'N/A'}`);
|
|
305
370
|
return {
|
|
306
371
|
action: "failed",
|
|
307
372
|
data: {
|
|
@@ -310,14 +375,34 @@ class PayuPaymentProviderService extends utils_1.AbstractPaymentProvider {
|
|
|
310
375
|
},
|
|
311
376
|
};
|
|
312
377
|
}
|
|
378
|
+
// Handle refund webhooks from PayU
|
|
379
|
+
// Note: MedusaJS manages refund state internally, this is for logging/reconciliation
|
|
380
|
+
if (status === "refund" || status === "refunded") {
|
|
381
|
+
this.logger_?.info?.(`PayU webhook: REFUND processed for txnid=${webhook.txnid}, ` +
|
|
382
|
+
`mihpayid=${webhook.mihpayid || 'N/A'}, amount=${webhook.amount}`);
|
|
383
|
+
// Refunds are managed by MedusaJS through refundPayment method
|
|
384
|
+
// This webhook confirms PayU processed the refund
|
|
385
|
+
return { action: "not_supported" };
|
|
386
|
+
}
|
|
387
|
+
// Handle dispute/chargeback webhooks from PayU
|
|
388
|
+
// TODO: Implement dispute handling workflow
|
|
389
|
+
if (status === "dispute" || status === "chargeback") {
|
|
390
|
+
this.logger_?.warn?.(`PayU webhook: ⚠️ DISPUTE/CHARGEBACK received for txnid=${webhook.txnid}, ` +
|
|
391
|
+
`mihpayid=${webhook.mihpayid || 'N/A'}, amount=${webhook.amount}. ` +
|
|
392
|
+
`Manual review required!`);
|
|
393
|
+
// Disputes need manual handling - log for now
|
|
394
|
+
return { action: "not_supported" };
|
|
395
|
+
}
|
|
396
|
+
// Handle pending or other statuses
|
|
397
|
+
this.logger_?.info?.(`PayU webhook: Unhandled status '${webhook.status}' for txnid=${webhook.txnid}`);
|
|
313
398
|
return { action: "not_supported" };
|
|
314
399
|
}
|
|
315
400
|
catch (error) {
|
|
316
|
-
this.logger_?.error?.(`PayU webhook error: ${error}`);
|
|
401
|
+
this.logger_?.error?.(`PayU webhook processing error: ${error instanceof Error ? error.message : String(error)}`);
|
|
317
402
|
return { action: "not_supported" };
|
|
318
403
|
}
|
|
319
404
|
}
|
|
320
405
|
}
|
|
321
406
|
PayuPaymentProviderService.identifier = exports.PAYU_PROVIDER_ID;
|
|
322
407
|
exports.default = PayuPaymentProviderService;
|
|
323
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcGF5dS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgscURBSWtDO0FBMEJsQyxxQ0FBb0Q7QUFFdkMsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwwQkFBMkIsU0FBUSwrQkFBMkM7SUFPaEYsWUFBWSxTQUFrQyxFQUFFLE1BQTBCO1FBQ3RFLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFBbUQ7Z0JBQ25ELHFFQUFxRSxDQUN4RSxDQUFBO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDWCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU07WUFDekMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSTtTQUMxQyxDQUFBO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBZ0IsQ0FBQTtRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksbUJBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUV6RCxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLHVCQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsT0FBTyxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLE1BQWU7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
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcGF5dS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgscURBS2tDO0FBMEJsQyxxQ0FBb0Q7QUFFdkMsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwwQkFBMkIsU0FBUSwrQkFBMkM7SUFHaEY7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFnQztRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDRFQUE0RSxDQUMvRSxDQUFBO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsOEVBQThFLENBQ2pGLENBQUE7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQU1ELFlBQVksU0FBa0MsRUFBRSxNQUEwQjtRQUN0RSxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRXhCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ1gsbURBQW1EO2dCQUNuRCxxRUFBcUUsQ0FDeEUsQ0FBQTtRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ1gsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNO1lBQ3pD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
|
package/README.md
CHANGED
|
@@ -37,8 +37,10 @@ PAYU_MERCHANT_KEY=your_merchant_key
|
|
|
37
37
|
PAYU_MERCHANT_SALT=your_merchant_salt
|
|
38
38
|
PAYU_ENVIRONMENT=test # or "production"
|
|
39
39
|
|
|
40
|
-
#
|
|
40
|
+
# Redirect URLs
|
|
41
41
|
STOREFRONT_URL=http://localhost:8000
|
|
42
|
+
PAYU_REDIRECT_URL=/order/confirmed
|
|
43
|
+
PAYU_REDIRECT_FAILURE_URL=/checkout?payment_status=failed
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
### 2. MedusaJS Config
|
|
@@ -89,6 +91,24 @@ In Medusa Admin:
|
|
|
89
91
|
5. PayU redirects back to your storefront
|
|
90
92
|
6. Webhook updates order status automatically
|
|
91
93
|
|
|
94
|
+
### Required Customer Data
|
|
95
|
+
|
|
96
|
+
When creating a payment session, the following customer data is **required**:
|
|
97
|
+
|
|
98
|
+
- **Email** - Customer email address
|
|
99
|
+
- **Name** - Customer first name
|
|
100
|
+
- **Phone** - Uses fallback chain: customer phone → billing address phone (from context) → shipping address phone
|
|
101
|
+
|
|
102
|
+
The phone number fallback uses MedusaJS's `PaymentProviderContext` which provides the customer and billing address data. If the billing address phone is not available, pass the shipping address phone when initiating payment:
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// When creating payment session, include in data:
|
|
106
|
+
{
|
|
107
|
+
shipping_address_phone: cart.shipping_address?.phone,
|
|
108
|
+
country_code: "in" // For URL construction
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
92
112
|
### React/Next.js Example
|
|
93
113
|
|
|
94
114
|
```tsx
|
|
@@ -169,16 +189,49 @@ The payment session data contains:
|
|
|
169
189
|
|
|
170
190
|
## Webhook Setup
|
|
171
191
|
|
|
172
|
-
|
|
192
|
+
PayU webhooks (S2S callbacks) ensure reliable payment status updates even when browser redirects fail.
|
|
193
|
+
|
|
194
|
+
### 1. Configure Webhook URL in PayU Dashboard
|
|
195
|
+
|
|
196
|
+
1. Log in to [PayU Dashboard](https://dashboard.payu.in)
|
|
197
|
+
2. Go to **Settings → Webhooks** (or **Developer Settings → Webhooks**)
|
|
198
|
+
3. Click **Create Webhook** or **Add Webhook URL**
|
|
199
|
+
4. Enter your webhook URL:
|
|
173
200
|
|
|
174
201
|
```
|
|
175
|
-
https://your-backend.com/hooks/payment/
|
|
202
|
+
https://your-backend.com/hooks/payment/payu_payu
|
|
176
203
|
```
|
|
177
204
|
|
|
178
|
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
181
|
-
-
|
|
205
|
+
5. Select events to subscribe:
|
|
206
|
+
- `payment.success` - Payment completed successfully
|
|
207
|
+
- `payment.failed` - Payment failed
|
|
208
|
+
- `payment.pending` - Payment is pending (optional)
|
|
209
|
+
|
|
210
|
+
6. Save the configuration
|
|
211
|
+
|
|
212
|
+
### 2. Webhook Security
|
|
213
|
+
|
|
214
|
+
The plugin automatically handles security:
|
|
215
|
+
|
|
216
|
+
- **Hash Verification**: Every webhook is verified using SHA-512 reverse hash
|
|
217
|
+
- **Formula**: `sha512(SALT|status||||||udf5|udf4|udf3|udf2|udf1|email|firstname|productinfo|amount|txnid|key)`
|
|
218
|
+
- **Tampered webhooks are rejected** and logged for investigation
|
|
219
|
+
|
|
220
|
+
### 3. Content Type Support
|
|
221
|
+
|
|
222
|
+
PayU sends webhooks as URL-encoded form data:
|
|
223
|
+
- `application/x-www-form-urlencoded`
|
|
224
|
+
- `multipart/form-data`
|
|
225
|
+
|
|
226
|
+
MedusaJS handles both content types automatically.
|
|
227
|
+
|
|
228
|
+
### 4. What Happens on Webhook
|
|
229
|
+
|
|
230
|
+
| Status | Action | Result |
|
|
231
|
+
|--------|--------|--------|
|
|
232
|
+
| `success` | `authorized` | Payment session authorized, cart completed, order created |
|
|
233
|
+
| `failure`/`failed` | `failed` | Payment session marked as failed |
|
|
234
|
+
| Other | `not_supported` | Logged for debugging, no action taken |
|
|
182
235
|
|
|
183
236
|
## API Reference
|
|
184
237
|
|
|
@@ -226,7 +279,9 @@ if (result.success) {
|
|
|
226
279
|
| `PAYU_MERCHANT_KEY` | PayU Merchant Key | Yes |
|
|
227
280
|
| `PAYU_MERCHANT_SALT` | PayU Merchant Salt (Salt V1) | Yes |
|
|
228
281
|
| `PAYU_ENVIRONMENT` | `test` or `production` | No (default: `test`) |
|
|
229
|
-
| `STOREFRONT_URL` | Your storefront URL
|
|
282
|
+
| `STOREFRONT_URL` | Your storefront base URL (e.g., `http://localhost:8000`) | Yes |
|
|
283
|
+
| `PAYU_REDIRECT_URL` | Success redirect path (e.g., `/order/confirmed`) | Yes |
|
|
284
|
+
| `PAYU_REDIRECT_FAILURE_URL` | Failure redirect path (e.g., `/checkout?payment_status=failed`) | Yes |
|
|
230
285
|
|
|
231
286
|
## Testing
|
|
232
287
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "medusa-payu-payment-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "PayU India payment gateway plugin for MedusaJS 2.x with redirect-based checkout, webhook support, hash verification, and refunds.",
|
|
5
5
|
"author": "SAM-AEL (https://github.com/SAM-AEL)",
|
|
6
6
|
"license": "MIT",
|