{"version":3,"sources":["jsdelivr-header.js","/npm/mtn-momo-sdk@1.3.0/lib/index.js"],"names":[],"mappings":"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","file":"/npm/mtn-momo-sdk@1.3.0/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/mtn-momo-sdk@1.3.0/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","//lib/index.js\n\nrequire('dotenv').config();\nconst axios = require('axios');\nconst { v4: uuidv4 } = require('uuid');\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 1) Configuration & Environment\n// ───────────────────────────────────────────────────────────────────────────────\n// Read MTN_MOMO_ENV directly—no fallback here\nconst MTN_MOMO_ENV = process.env.MTN_MOMO_ENV;\nif (!MTN_MOMO_ENV) {\n  throw new Error('MTN_MOMO_ENV is not set. Must be \"sandbox\" or \"production\".');\n}\nif (!['sandbox', 'production'].includes(MTN_MOMO_ENV)) {\n  throw new Error(`Invalid MTN_MOMO_ENV \"${MTN_MOMO_ENV}\". Must be \"sandbox\" or \"production\".`);\n}\n\nconst LOCAL_CURRENCY = process.env.LOCAL_CURRENCY || 'ZMW';\n\n// Sandbox vars\nconst {\n  MOMO_API_BASE_URL_SANDBOX,\n  X_TARGET_ENVIRONMENT_SANDBOX,\n  SUBSCRIPTION_KEY_SANDBOX,\n  PROVIDER_CALLBACK_HOST_SANDBOX\n} = process.env;\n\n// Production vars\nconst {\n  MOMO_API_BASE_URL_PRODUCTION,\n  X_TARGET_ENVIRONMENT_PRODUCTION,\n  SUBSCRIPTION_KEY_PRODUCTION,\n  API_USER_PRODUCTION,\n  API_KEY_PRODUCTION,\n  PROVIDER_CALLBACK_HOST_PRODUCTION\n} = process.env;\n\n// Polling defaults\nconst DEFAULT_POLL_RETRIES   = Number(process.env.DEFAULT_POLL_RETRIES  || 3);\nconst DEFAULT_POLL_DELAY_MS  = Number(process.env.DEFAULT_POLL_DELAY_MS || 5000);\n\nconst isProduction = MTN_MOMO_ENV === 'production';\n\nconst CONFIG = {\n  baseUrl:             isProduction ? MOMO_API_BASE_URL_PRODUCTION   : MOMO_API_BASE_URL_SANDBOX,\n  targetEnv:           isProduction ? X_TARGET_ENVIRONMENT_PRODUCTION : X_TARGET_ENVIRONMENT_SANDBOX,\n  subscriptionKey:     isProduction ? SUBSCRIPTION_KEY_PRODUCTION     : SUBSCRIPTION_KEY_SANDBOX,\n  providerCallbackHost: isProduction ? PROVIDER_CALLBACK_HOST_PRODUCTION : PROVIDER_CALLBACK_HOST_SANDBOX,\n  apiUser:             API_USER_PRODUCTION,\n  apiKey:              API_KEY_PRODUCTION\n};\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 2) Utility: Centralized Error Logging\n// ───────────────────────────────────────────────────────────────────────────────\nfunction logAxiosError(fnName, error) {\n  console.error(`Error in ${fnName}:`, error.message);\n  if (error.response) {\n    console.error('  Response Status:', error.response.status);\n    console.error('  Response Headers:', error.response.headers);\n    console.error('  Response Data:', error.response.data);\n    console.error('  Response URL:', error.response.config?.url);\n    console.error('  Request Method:', error.response.config?.method);\n    console.error('  Request Headers:', error.response.config?.headers);\n    console.error('  Request Data:', error.response.config?.data);\n  } else if (error.request) {\n    console.error('  Request was made but no response received');\n    console.error('  Request:', error.request);\n  } else {\n    console.error('  Error setting up request:', error.message);\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 3) Sandbox‐only setup: create API user & key\n// ───────────────────────────────────────────────────────────────────────────────\nasync function createApiUser(referenceId) {\n  console.log('[Sandbox] Creating API user, X-Reference-Id:', referenceId);\n  const url = `${CONFIG.baseUrl}/v1_0/apiuser`;\n  try {\n    const { data } = await axios.post(\n      url,\n      { providerCallbackHost: CONFIG.providerCallbackHost },\n      {\n        headers: {\n          'Ocp-Apim-Subscription-Key': CONFIG.subscriptionKey,\n          'Content-Type': 'application/json',\n          'X-Reference-Id': referenceId\n        }\n      }\n    );\n    console.log('[Sandbox] API user created:', data);\n    return data;\n  } catch (err) {\n    logAxiosError('createApiUser', err);\n    throw err;\n  }\n}\n\nasync function createApiKey(referenceId) {\n  console.log('[Sandbox] Creating API key, for user:', referenceId);\n  const url = `${CONFIG.baseUrl}/v1_0/apiuser/${referenceId}/apikey`;\n  try {\n    const { data } = await axios.post(\n      url,\n      null,\n      {\n        headers: {\n          'Ocp-Apim-Subscription-Key': CONFIG.subscriptionKey\n        }\n      }\n    );\n    console.log('[Sandbox] API key created.');\n    return data.apiKey;\n  } catch (err) {\n    logAxiosError('createApiKey', err);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 4) Create Bearer Token\n// ───────────────────────────────────────────────────────────────────────────────\nasync function createBearerToken(apiUserId, apiKey) {\n  console.log('Requesting Bearer token for user:', apiUserId);\n  const url = `${CONFIG.baseUrl}/collection/token/`;\n  const auth = Buffer.from(`${apiUserId}:${apiKey}`).toString('base64');\n  try {\n    const { data } = await axios.post(\n      url,\n      null,\n      {\n        headers: {\n          'Ocp-Apim-Subscription-Key': CONFIG.subscriptionKey,\n          Authorization: `Basic ${auth}`,\n          'Content-Length': 0\n        }\n      }\n    );\n    console.log('Bearer token acquired.');\n    return data.access_token;\n  } catch (err) {\n    logAxiosError('createBearerToken', err);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 5) Request Payment\n// ───────────────────────────────────────────────────────────────────────────────\nasync function requestPayment({ referenceId, bearerToken, amount, phone, businessRef, xReferenceId }) {\n  console.log('Requesting payment, X-Reference-Id:', xReferenceId);\n  const url = `${CONFIG.baseUrl}/collection/v1_0/requesttopay`;\n  \n  const body = {\n    amount,\n    currency: LOCAL_CURRENCY,\n    externalId: uuidv4(),\n    payer: { partyIdType: 'MSISDN', partyId: phone },\n    payerMessage: `Payment for ${businessRef}`,\n    payeeNote: 'Payment Initiated'\n  };\n\n  // Debug logging - show exactly what we're sending\n  console.log('=== DEBUG: Request Details ===');\n  console.log('URL:', url);\n  console.log('Body:', JSON.stringify(body, null, 2));\n  console.log('Config:', {\n    baseUrl: CONFIG.baseUrl,\n    targetEnv: CONFIG.targetEnv,\n    subscriptionKey: CONFIG.subscriptionKey ? '***SET***' : '***MISSING***',\n    providerCallbackHost: CONFIG.providerCallbackHost ? '***SET***' : '***MISSING***',\n    apiUser: CONFIG.apiUser ? '***SET***' : '***MISSING***',\n    apiKey: CONFIG.apiKey ? '***SET***' : '***MISSING***'\n  });\n  console.log('Bearer Token:', bearerToken ? '***SET***' : '***MISSING***');\n  console.log('Phone:', phone);\n  console.log('Amount:', amount, 'Type:', typeof amount);\n  console.log('X-Reference-Id (UUID):', xReferenceId);\n  console.log('Business Ref:', businessRef);\n  console.log('==============================');\n\n  try {\n    const { data } = await axios.post(\n      url,\n      body,\n      {\n        headers: {\n          'X-Target-Environment': CONFIG.targetEnv,\n          'X-Reference-Id': xReferenceId, // Use the generated UUID\n          'Ocp-Apim-Subscription-Key': CONFIG.subscriptionKey,\n          'Content-Type': 'application/json',\n          'X-Callback-Url': CONFIG.providerCallbackHost,\n          Authorization: `Bearer ${bearerToken}`\n        }\n      }\n    );\n    console.log('Payment request accepted:', data);\n    return data;\n  } catch (err) {\n    logAxiosError('requestPayment', err);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 6) Get Payment Status\n// ───────────────────────────────────────────────────────────────────────────────\nasync function getPaymentStatus({ referenceId, bearerToken, xReferenceId }) {\n  console.log('Fetching payment status, X-Reference-Id:', xReferenceId);\n  const url = `${CONFIG.baseUrl}/collection/v1_0/requesttopay/${xReferenceId}`;\n  try {\n    const { data } = await axios.get(\n      url,\n      {\n        headers: {\n          'X-Target-Environment': CONFIG.targetEnv,\n          'Ocp-Apim-Subscription-Key': CONFIG.subscriptionKey,\n          Authorization: `Bearer ${bearerToken}`\n        }\n      }\n    );\n    console.log('Payment status:', data);\n    return data;\n  } catch (err) {\n    logAxiosError('getPaymentStatus', err);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 7) Polling Loop\n// ───────────────────────────────────────────────────────────────────────────────\nasync function pollPaymentStatus({ referenceId, bearerToken, xReferenceId, retries = DEFAULT_POLL_RETRIES, delay = DEFAULT_POLL_DELAY_MS }) {\n  console.log('Starting polling for', xReferenceId);\n  for (let i = 1; i <= retries; i++) {\n    try {\n      const status = await getPaymentStatus({ referenceId, bearerToken, xReferenceId });\n      if (['SUCCESSFUL', 'FAILED'].includes(status.status)) {\n        console.log('Final status:', status.status);\n        return status;\n      }\n      console.log(`Status = ${status.status}, retrying in ${delay}ms (${i}/${retries})`);\n    } catch (err) {\n      console.error(`Polling error (attempt ${i}):`, err.message);\n    }\n    await new Promise(res => setTimeout(res, delay));\n  }\n  console.error('Polling timed out after', retries, 'attempts');\n  throw new Error('Payment status polling timed out');\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 8) Public API: processPayment()\n// ───────────────────────────────────────────────────────────────────────────────\nasync function processPayment(amount, phone, businessRef) {\n  console.log(`\\n=== Processing Payment (${MTN_MOMO_ENV}) ===`);\n  console.log(`Amount: ${amount}, Phone: ${phone}, Ref: ${businessRef}`);\n  \n  // Debug: Show input types and values\n  console.log('=== INPUT DEBUG ===');\n  console.log('Amount type:', typeof amount, 'Value:', amount);\n  console.log('Phone type:', typeof phone, 'Value:', phone);\n  console.log('BusinessRef type:', typeof businessRef, 'Value:', businessRef);\n  console.log('Environment:', MTN_MOMO_ENV);\n  console.log('Is Production:', isProduction);\n  console.log('==================');\n\n  // Generate a proper UUID for X-Reference-Id as required by MTN MoMo API\n  const xReferenceId = uuidv4();\n  console.log('Generated X-Reference-Id (UUID):', xReferenceId);\n\n  try {\n    let apiUserId, apiKey;\n\n    if (isProduction) {\n      console.log('Production mode: using env API_USER & API_KEY');\n      apiUserId = CONFIG.apiUser;\n      apiKey     = CONFIG.apiKey;\n    } else {\n      console.log('Sandbox mode: creating API user & key');\n      await createApiUser(xReferenceId);\n      apiUserId = xReferenceId;\n      apiKey    = await createApiKey(xReferenceId);\n    }\n\n    const bearerToken = await createBearerToken(apiUserId, apiKey);\n\n    await requestPayment({ referenceId: businessRef, bearerToken, amount, phone, businessRef, xReferenceId });\n\n    // If callback fails, fallback to polling:\n    const finalStatus = await pollPaymentStatus({ referenceId: businessRef, bearerToken, xReferenceId });\n\n    return { status: finalStatus.status, data: finalStatus };\n  } catch (err) {\n    console.error('processPayment failed:', err.message);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 9) Public API: Poll Payment Status (NEW - for checking existing payments)\n// ───────────────────────────────────────────────────────────────────────────────\nasync function pollPaymentStatus(transactionIdOrRef) {\n  console.log(`\\n=== Polling MTN payment status ===`);\n  console.log(`Transaction ID/Reference: ${transactionIdOrRef}`);\n  \n  try {\n    let apiUserId, apiKey;\n\n    if (isProduction) {\n      console.log('Production mode: using env API_USER & API_KEY');\n      apiUserId = CONFIG.apiUser;\n      apiKey     = CONFIG.apiKey;\n    } else {\n      console.log('Sandbox mode: creating API user & key for status check');\n      await createApiUser(transactionIdOrRef);\n      apiUserId = transactionIdOrRef;\n      apiKey    = await createApiKey(transactionIdOrRef);\n    }\n\n    const bearerToken = await createBearerToken(apiUserId, apiKey);\n    console.log('Bearer token acquired for status check.');\n\n    // Check the payment status\n    const status = await getPaymentStatus({ \n      referenceId: transactionIdOrRef, \n      bearerToken, \n      xReferenceId: transactionIdOrRef \n    });\n    \n    console.log('Status check result:', JSON.stringify(status, null, 2));\n    \n    // Parse the response to determine final status\n    if (status?.status) {\n      if (status.status === 'SUCCESSFUL') {\n        console.log('Final status: Payment successful');\n        return { status: 'SUCCESSFUL', data: status, message: 'Payment successful' };\n      } else if (status.status === 'FAILED') {\n        console.log('Final status: Payment failed');\n        return { status: 'FAILED', data: status, message: status.message || 'Payment failed' };\n      } else if (status.status === 'PENDING') {\n        console.log('Status: Payment pending');\n        return { status: 'PENDING', data: status, message: 'Payment pending' };\n      } else {\n        console.log('Status: Unknown status');\n        return { status: 'UNKNOWN', data: status, message: `Status: ${status.status}` };\n      }\n    } else {\n      console.log('No status data in response');\n      return { status: 'UNKNOWN', data: status, message: 'No status data' };\n    }\n  } catch (err) {\n    console.error('pollPaymentStatus failed:', err.message);\n    throw err;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// 10) Export\n// ───────────────────────────────────────────────────────────────────────────────\nmodule.exports = { \n  processPayment,\n  pollPaymentStatus\n};\n"]}