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 fetch(apiUrl, {
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 fetch(apiUrl, {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9wYXl1L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7O0FBeUtILHNDQUlDO0FBM0tELG9EQUEyQjtBQUkzQjs7R0FFRztBQUNILE1BQWEsVUFBVTtJQUluQixZQUFZLE1BQTBCLEVBQUUsTUFBZTtRQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZO1lBQzNDLENBQUMsQ0FBQyxpQ0FBaUM7WUFDbkMsQ0FBQyxDQUFDLCtCQUErQixDQUFBO0lBQ3pDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLENBQUMsTUFXbkI7UUFDRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQTtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQTtRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUU5QixnQ0FBZ0M7UUFDaEMsMEZBQTBGO1FBQzFGLHdGQUF3RjtRQUN4RixNQUFNLFVBQVUsR0FBRyxHQUFHLEdB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
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9wYXl1L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7O0FBeU1ILHNDQUlDO0FBM01ELG9EQUEyQjtBQUkzQjs7R0FFRztBQUNILE1BQWEsVUFBVTtJQUluQixZQUFZLE1BQTBCLEVBQUUsTUFBZTtRQUt2RDs7V0FFRztRQUNjLG1CQUFjLEdBQUcsS0FBSyxDQUFBO1FBUG5DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQ3hCLENBQUM7SUFPRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDMUIsR0FBVyxFQUNYLE9BQW9CLEVBQ3BCLFlBQW9CLElBQUksQ0FBQyxjQUFjO1FBRXZDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7UUFDeEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUVqRSxJQUFJLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLEdBQUcsT0FBTztnQkFDVixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDNUIsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxRQUFRLENBQUE7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsU0FBUyxJQUFJLENBQUMsQ0FBQTtZQUN0RSxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUE7UUFDZixDQUFDO2dC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
@@ -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 email = customer?.email || "customer@example.com";
57
- const firstname = customer?.first_name || "Customer";
58
- const phone = customer?.phone || "";
59
- const productinfo = input.data?.productinfo || "Order Payment";
60
- const storefrontUrl = process.env.STOREFRONT_URL || "http://localhost:8000";
61
- const countryCode = input.data?.country_code || "in";
62
- const surl = `${storefrontUrl}/${countryCode}/order/confirmed`;
63
- const furl = `${storefrontUrl}/${countryCode}/checkout?payment_status=failed`;
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 || "http://localhost:8000";
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: `${storefrontUrl}/${sessionData.countryCode || 'in'}/order/confirmed`,
253
- furl: `${storefrontUrl}/${sessionData.countryCode || 'in'}/checkout?payment_status=failed`,
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
- this.logger_?.info?.(`PayU webhook: txnid=${webhook.txnid}, status=${webhook.status}`);
274
- // Verify hash
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: Invalid hash for ${webhook.txnid}`);
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
- # Your storefront URL (for redirect callbacks)
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
- Configure the webhook URL in your PayU dashboard:
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/pp_payu_payu
202
+ https://your-backend.com/hooks/payment/payu_payu
176
203
  ```
177
204
 
178
- The webhook handler automatically:
179
- - Verifies the response hash for security
180
- - Updates payment status (authorized/failed)
181
- - Triggers order completion workflow
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 for redirects | Yes |
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.1.0",
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",