@nehorai/payments-il 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/hyp/index.ts","../../src/providers/hyp/hyp-provider.ts","../../src/providers/hyp/hyp-types.ts","../../src/providers/hyp/hyp-webhook-handler.ts"],"sourcesContent":["/**\r\n * Hyp (CreditGuard) Provider Exports\r\n */\r\n\r\n// Provider\r\nexport { HypProvider } from './hyp-provider.js';\r\n\r\n// Webhook Handler\r\nexport { HypWebhookHandler, createHypWebhookHandler } from './hyp-webhook-handler.js';\r\n\r\n// Types\r\nexport type {\r\n HypConfig,\r\n HypDoDealRequest,\r\n HypDoDealResponse,\r\n HypRefundDealRequest,\r\n HypRefundDealResponse,\r\n HypResultCode,\r\n} from './hyp-types.js';\r\n\r\nexport {\r\n DEFAULT_HYP_ENDPOINTS,\r\n HYP_SUPPORTED_CURRENCIES,\r\n HYP_VALIDATION_MODES,\r\n HYP_TRANSACTION_TYPES,\r\n HYP_TRANSACTION_CODES,\r\n HYP_CREDIT_TYPES,\r\n HYP_RESULT_CODE_MAP,\r\n HYP_ERROR_MAP,\r\n mapHypStatus,\r\n mapHypError,\r\n isHypSupportedCurrency,\r\n isHypSuccess,\r\n formatHypAmount,\r\n formatCardExpiration,\r\n parseCardExpiration,\r\n} from './hyp-types.js';\r\n","/**\r\n * Hyp (CreditGuard) Provider Implementation\r\n *\r\n * Implements IPaymentProvider for Hyp/CreditGuard payment processing.\r\n * Supports Two-Phase Commit (J5) with manual capture via TxOnly validation.\r\n *\r\n * API Documentation: https://cgpay3.creditguard.co.il/docs\r\n *\r\n * @see https://www.creditguard.co.il\r\n */\r\n\r\nimport type {\r\n PaymentProvider,\r\n CreatePaymentIntentParams,\r\n PaymentIntentResult,\r\n AuthorizePaymentParams,\r\n AuthorizationResult,\r\n CapturePaymentParams,\r\n CaptureResult,\r\n VoidPaymentParams,\r\n VoidResult,\r\n RefundParams,\r\n RefundResult,\r\n ProviderHealthStatus,\r\n} from '@nehorai/payments/types';\r\nimport type {\r\n IPaymentProvider,\r\n SavePaymentMethodParams,\r\n SavePaymentMethodResult,\r\n DeletePaymentMethodResult,\r\n CreateSetupIntentParams,\r\n SetupIntentResult,\r\n CreateCustomerParams,\r\n CreateCustomerResult,\r\n} from '@nehorai/payments/providers';\r\nimport { calculateCaptureDeadline } from '@nehorai/payments/types';\r\nimport {\r\n DEFAULT_HYP_ENDPOINTS,\r\n HYP_SUPPORTED_CURRENCIES,\r\n HYP_VALIDATION_MODES,\r\n HYP_TRANSACTION_TYPES,\r\n HYP_TRANSACTION_CODES,\r\n HYP_CREDIT_TYPES,\r\n mapHypStatus,\r\n mapHypError,\r\n isHypSuccess,\r\n formatHypAmount,\r\n} from './hyp-types.js';\r\nimport type {\r\n HypConfig,\r\n HypDoDealRequest,\r\n HypDoDealResponse,\r\n HypRefundDealRequest,\r\n HypRefundDealResponse,\r\n} from './hyp-types.js';\r\n\r\n/**\r\n * Hyp Payment Provider\r\n *\r\n * Full implementation of IPaymentProvider for CreditGuard.\r\n */\r\nexport class HypProvider implements IPaymentProvider {\r\n readonly name: PaymentProvider = 'hyp';\r\n readonly supportedCurrencies = HYP_SUPPORTED_CURRENCIES;\r\n readonly supportsRecurring = true;\r\n readonly supportsSplitPayments = false;\r\n\r\n private config: HypConfig & { baseUrl: string };\r\n\r\n constructor(config: HypConfig) {\r\n if (!config.terminalNumber || !config.user || !config.password) {\r\n throw new Error(\r\n 'HypProvider requires terminalNumber, user, and password in config'\r\n );\r\n }\r\n\r\n // Resolve baseUrl: explicit baseUrl > environment > default to sandbox\r\n const baseUrl = config.baseUrl\r\n ?? (config.environment === 'production'\r\n ? DEFAULT_HYP_ENDPOINTS.production\r\n : DEFAULT_HYP_ENDPOINTS.test);\r\n\r\n this.config = { ...config, baseUrl };\r\n }\r\n\r\n // ==========================================================================\r\n // Payment Intent Operations\r\n // ==========================================================================\r\n\r\n /**\r\n * Create a payment intent\r\n *\r\n * For Hyp, this generates a hosted payment page or prepares for direct charge.\r\n */\r\n async createPaymentIntent(\r\n params: CreatePaymentIntentParams\r\n ): Promise<PaymentIntentResult> {\r\n try {\r\n // For hosted page flow (no payment method provided)\r\n if (!params.paymentMethodId) {\r\n return await this.createHostedPage(params);\r\n }\r\n\r\n // For direct charge with saved payment method\r\n return await this.chargeWithToken(params);\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Create hosted payment page\r\n */\r\n private async createHostedPage(\r\n params: CreatePaymentIntentParams\r\n ): Promise<PaymentIntentResult> {\r\n const uniqueid = params.idempotencyKey;\r\n\r\n const request: HypDoDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n total: formatHypAmount(params.amount.amountMinor),\r\n currency: params.amount.currency,\r\n transactionType: HYP_TRANSACTION_TYPES.DEBIT,\r\n transactionCode:\r\n params.captureMethod === 'manual'\r\n ? HYP_TRANSACTION_CODES.VERIFY\r\n : HYP_TRANSACTION_CODES.REGULAR,\r\n validation:\r\n params.captureMethod === 'manual'\r\n ? HYP_VALIDATION_MODES.TX_ONLY\r\n : HYP_VALIDATION_MODES.AUTO_COMM,\r\n uniqueid,\r\n successUrl: params.returnUrl,\r\n errorUrl: params.returnUrl,\r\n cancelUrl: params.returnUrl,\r\n language: 'en',\r\n };\r\n\r\n const response = await this.sendDoDealRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Transaction failed',\r\n errorCode: mapHypError(response.resultCode),\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n providerIntentId: response.transactionId ?? uniqueid,\r\n redirectUrl: response.redirectUrl,\r\n status: 'created',\r\n };\r\n }\r\n\r\n /**\r\n * Charge with saved payment method token\r\n */\r\n private async chargeWithToken(\r\n params: CreatePaymentIntentParams\r\n ): Promise<PaymentIntentResult> {\r\n const uniqueid = params.idempotencyKey;\r\n\r\n const request: HypDoDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n total: formatHypAmount(params.amount.amountMinor),\r\n currency: params.amount.currency,\r\n transactionType: HYP_TRANSACTION_TYPES.DEBIT,\r\n transactionCode:\r\n params.captureMethod === 'manual'\r\n ? HYP_TRANSACTION_CODES.VERIFY\r\n : HYP_TRANSACTION_CODES.REGULAR,\r\n validation:\r\n params.captureMethod === 'manual'\r\n ? HYP_VALIDATION_MODES.TX_ONLY\r\n : HYP_VALIDATION_MODES.AUTO_COMM,\r\n creditType: HYP_CREDIT_TYPES.TOKEN,\r\n cardToken: params.paymentMethodId,\r\n uniqueid,\r\n };\r\n\r\n const response = await this.sendDoDealRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Transaction failed',\r\n errorCode: mapHypError(response.resultCode),\r\n };\r\n }\r\n\r\n const status = mapHypStatus(response.resultCode) ?? 'created';\r\n\r\n return {\r\n success: true,\r\n providerIntentId: response.transactionId ?? uniqueid,\r\n status,\r\n };\r\n }\r\n\r\n async authorize(params: AuthorizePaymentParams): Promise<AuthorizationResult> {\r\n try {\r\n return {\r\n success: true,\r\n authorizationCode: params.providerIntentId,\r\n status: 'authorized',\r\n captureDeadline: calculateCaptureDeadline(new Date()),\r\n };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n async capture(params: CapturePaymentParams): Promise<CaptureResult> {\r\n try {\r\n const request: HypDoDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n total: params.amount\r\n ? formatHypAmount(params.amount.amountMinor)\r\n : undefined,\r\n currency: params.amount?.currency ?? 'ILS',\r\n transactionType: HYP_TRANSACTION_TYPES.DEBIT,\r\n transactionCode: HYP_TRANSACTION_CODES.FORCE,\r\n validation: HYP_VALIDATION_MODES.AUTO_COMM,\r\n uniqueid: params.idempotencyKey,\r\n authorizationCode: params.providerIntentId,\r\n };\r\n\r\n const response = await this.sendDoDealRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Capture failed',\r\n errorCode: mapHypError(response.resultCode),\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n providerTransactionId: response.transactionId ?? params.providerIntentId,\r\n status: 'captured',\r\n capturedAmount: params.amount ?? {\r\n amountMinor: 0,\r\n currency: 'ILS',\r\n },\r\n };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n async void(params: VoidPaymentParams): Promise<VoidResult> {\r\n try {\r\n const request: HypRefundDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n transactionId: params.providerIntentId,\r\n currency: 'ILS',\r\n uniqueid: params.providerIntentId,\r\n };\r\n\r\n const response = await this.sendRefundRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Void failed',\r\n };\r\n }\r\n\r\n return { success: true, status: 'voided' };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Refunds\r\n // ==========================================================================\r\n\r\n async refund(params: RefundParams): Promise<RefundResult> {\r\n try {\r\n const request: HypRefundDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n transactionId: params.providerTransactionId,\r\n total: params.amount\r\n ? formatHypAmount(params.amount.amountMinor)\r\n : undefined,\r\n currency: params.amount?.currency ?? 'ILS',\r\n uniqueid: params.idempotencyKey,\r\n };\r\n\r\n const response = await this.sendRefundRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Refund failed',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n providerRefundId: response.transactionId ?? params.idempotencyKey,\r\n refundedAmount: params.amount ?? {\r\n amountMinor: 0,\r\n currency: 'ILS',\r\n },\r\n status: 'succeeded',\r\n };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Payment Methods (Tokenization)\r\n // ==========================================================================\r\n\r\n async createSetupIntent(\r\n params: CreateSetupIntentParams\r\n ): Promise<SetupIntentResult> {\r\n try {\r\n const uniqueid = `setup_${params.userId}_${Date.now()}`;\r\n\r\n const request: HypDoDealRequest = {\r\n terminalNumber: this.config.terminalNumber,\r\n user: this.config.user,\r\n password: this.config.password,\r\n total: 0,\r\n currency: 'ILS',\r\n transactionType: HYP_TRANSACTION_TYPES.DEBIT,\r\n transactionCode: HYP_TRANSACTION_CODES.VERIFY,\r\n validation: HYP_VALIDATION_MODES.TX_ONLY,\r\n creditType: HYP_CREDIT_TYPES.TOKEN,\r\n customerData: params.customerId ?? params.userId,\r\n uniqueid,\r\n language: 'en',\r\n };\r\n\r\n const response = await this.sendDoDealRequest(request);\r\n\r\n if (!isHypSuccess(response.resultCode)) {\r\n return {\r\n success: false,\r\n error: response.resultDescription ?? 'Setup failed',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n setupIntentId: response.transactionId ?? uniqueid,\r\n clientSecret: response.redirectUrl,\r\n };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n async savePaymentMethod(\r\n params: SavePaymentMethodParams\r\n ): Promise<SavePaymentMethodResult> {\r\n try {\r\n const cardToken = params.setupData.cardToken as string;\r\n const cardMask = params.setupData.cardMask as string;\r\n const cardBrand = params.setupData.cardBrand as string;\r\n const cardExpiration = params.setupData.cardExpiration as string;\r\n\r\n if (!cardToken) {\r\n return {\r\n success: false,\r\n error: 'No card token received',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n paymentMethodId: cardToken,\r\n cardBrand: cardBrand ?? 'unknown',\r\n cardLast4: cardMask?.slice(-4) ?? '0000',\r\n cardExpMonth: cardExpiration?.substring(0, 2) ?? '01',\r\n cardExpYear: `20${cardExpiration?.substring(2, 4) ?? '99'}`,\r\n };\r\n } catch (error) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n async deletePaymentMethod(\r\n _paymentMethodId: string\r\n ): Promise<DeletePaymentMethodResult> {\r\n return {\r\n success: true,\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // Customer Management\r\n // ==========================================================================\r\n\r\n async createCustomer(\r\n params: CreateCustomerParams\r\n ): Promise<CreateCustomerResult> {\r\n return {\r\n success: true,\r\n customerId: params.userId,\r\n };\r\n }\r\n\r\n async getOrCreateCustomer(\r\n userId: string,\r\n _email: string\r\n ): Promise<CreateCustomerResult> {\r\n return {\r\n success: true,\r\n customerId: userId,\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // Health & Security\r\n // ==========================================================================\r\n\r\n async getHealth(): Promise<ProviderHealthStatus> {\r\n const start = Date.now();\r\n try {\r\n const response = await fetch(`${this.config.baseUrl}/xpo/Relay`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'text/xml',\r\n },\r\n body: this.buildTestXML(),\r\n signal: AbortSignal.timeout(5000),\r\n });\r\n\r\n const healthy = response.ok;\r\n\r\n return {\r\n provider: 'hyp',\r\n healthy,\r\n lastChecked: new Date(),\r\n avgLatencyMs: Date.now() - start,\r\n circuitBreakerOpen: false,\r\n };\r\n } catch {\r\n return {\r\n provider: 'hyp',\r\n healthy: false,\r\n lastChecked: new Date(),\r\n circuitBreakerOpen: false,\r\n };\r\n }\r\n }\r\n\r\n validateWebhookSignature(_payload: string, _signature: string): boolean {\r\n if (!this.config.webhookSecret) return false;\r\n return !!this.config.webhookSecret;\r\n }\r\n\r\n async getPaymentIntentStatus(\r\n _providerIntentId: string\r\n ): Promise<{ status: string; error?: string }> {\r\n return {\r\n status: 'unknown',\r\n error: 'Status query not supported by Hyp basic integration',\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // XML Request Builders\r\n // ==========================================================================\r\n\r\n private buildDoDealXML(request: HypDoDealRequest): string {\r\n const parts: string[] = [];\r\n\r\n parts.push('<?xml version=\"1.0\" encoding=\"utf-8\"?>');\r\n parts.push('<ashrait>');\r\n parts.push('<request>');\r\n parts.push(`<version>1000</version>`);\r\n parts.push('<language>ENG</language>');\r\n\r\n parts.push('<command>doDeal</command>');\r\n parts.push(`<terminalNumber>${this.escapeXml(request.terminalNumber)}</terminalNumber>`);\r\n parts.push(`<user>${this.escapeXml(request.user)}</user>`);\r\n parts.push(`<password>${this.escapeXml(request.password)}</password>`);\r\n\r\n if (request.cardNo) {\r\n parts.push(`<cardNo>${this.escapeXml(request.cardNo)}</cardNo>`);\r\n }\r\n if (request.cardExpiration) {\r\n parts.push(`<cardExpiration>${this.escapeXml(request.cardExpiration)}</cardExpiration>`);\r\n }\r\n if (request.cvv) {\r\n parts.push(`<cvv>${this.escapeXml(request.cvv)}</cvv>`);\r\n }\r\n if (request.cardToken) {\r\n parts.push(`<cardToken>${this.escapeXml(request.cardToken)}</cardToken>`);\r\n }\r\n if (request.authorizationCode) {\r\n parts.push(`<authNumber>${this.escapeXml(request.authorizationCode)}</authNumber>`);\r\n }\r\n\r\n if (request.total !== undefined) {\r\n parts.push(`<total>${request.total}</total>`);\r\n }\r\n parts.push(`<currency>${this.escapeXml(request.currency)}</currency>`);\r\n parts.push(`<transactionType>${this.escapeXml(request.transactionType)}</transactionType>`);\r\n\r\n if (request.transactionCode) {\r\n parts.push(`<transactionCode>${this.escapeXml(request.transactionCode)}</transactionCode>`);\r\n }\r\n if (request.creditType) {\r\n parts.push(`<creditType>${request.creditType}</creditType>`);\r\n }\r\n if (request.validation) {\r\n parts.push(`<validation>${this.escapeXml(request.validation)}</validation>`);\r\n }\r\n if (request.uniqueid) {\r\n parts.push(`<uniqueid>${this.escapeXml(request.uniqueid)}</uniqueid>`);\r\n }\r\n if (request.customerData) {\r\n parts.push(`<customerData>${this.escapeXml(request.customerData)}</customerData>`);\r\n }\r\n\r\n if (request.successUrl) {\r\n parts.push(`<successUrl>${this.escapeXml(request.successUrl)}</successUrl>`);\r\n }\r\n if (request.errorUrl) {\r\n parts.push(`<errorUrl>${this.escapeXml(request.errorUrl)}</errorUrl>`);\r\n }\r\n if (request.cancelUrl) {\r\n parts.push(`<cancelUrl>${this.escapeXml(request.cancelUrl)}</cancelUrl>`);\r\n }\r\n\r\n parts.push('</request>');\r\n parts.push('</ashrait>');\r\n\r\n return parts.join('');\r\n }\r\n\r\n private buildRefundXML(request: HypRefundDealRequest): string {\r\n const parts: string[] = [];\r\n\r\n parts.push('<?xml version=\"1.0\" encoding=\"utf-8\"?>');\r\n parts.push('<ashrait>');\r\n parts.push('<request>');\r\n parts.push(`<version>1000</version>`);\r\n parts.push('<language>ENG</language>');\r\n\r\n parts.push('<command>refundDeal</command>');\r\n parts.push(`<terminalNumber>${this.escapeXml(request.terminalNumber)}</terminalNumber>`);\r\n parts.push(`<user>${this.escapeXml(request.user)}</user>`);\r\n parts.push(`<password>${this.escapeXml(request.password)}</password>`);\r\n\r\n parts.push(`<transactionId>${this.escapeXml(request.transactionId)}</transactionId>`);\r\n parts.push(`<currency>${this.escapeXml(request.currency)}</currency>`);\r\n\r\n if (request.total !== undefined) {\r\n parts.push(`<total>${request.total}</total>`);\r\n }\r\n if (request.uniqueid) {\r\n parts.push(`<uniqueid>${this.escapeXml(request.uniqueid)}</uniqueid>`);\r\n }\r\n\r\n parts.push('</request>');\r\n parts.push('</ashrait>');\r\n\r\n return parts.join('');\r\n }\r\n\r\n private buildTestXML(): string {\r\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ashrait>\r\n <request>\r\n <version>1000</version>\r\n <language>ENG</language>\r\n <command>echo</command>\r\n </request>\r\n</ashrait>`;\r\n }\r\n\r\n // ==========================================================================\r\n // HTTP Helpers\r\n // ==========================================================================\r\n\r\n private async sendDoDealRequest(\r\n request: HypDoDealRequest\r\n ): Promise<HypDoDealResponse> {\r\n const xmlBody = this.buildDoDealXML(request);\r\n\r\n const response = await fetch(`${this.config.baseUrl}/xpo/Relay`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'text/xml; charset=utf-8',\r\n },\r\n body: xmlBody,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const xmlResponse = await response.text();\r\n return this.parseDoDealResponse(xmlResponse);\r\n }\r\n\r\n private async sendRefundRequest(\r\n request: HypRefundDealRequest\r\n ): Promise<HypRefundDealResponse> {\r\n const xmlBody = this.buildRefundXML(request);\r\n\r\n const response = await fetch(`${this.config.baseUrl}/xpo/Relay`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'text/xml; charset=utf-8',\r\n },\r\n body: xmlBody,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const xmlResponse = await response.text();\r\n return this.parseRefundResponse(xmlResponse);\r\n }\r\n\r\n // ==========================================================================\r\n // XML Parsing\r\n // ==========================================================================\r\n\r\n private parseDoDealResponse(xml: string): HypDoDealResponse {\r\n return {\r\n resultCode: this.extractXmlValue(xml, 'resultCode') ?? '100',\r\n resultDescription: this.extractXmlValue(xml, 'resultDescription'),\r\n transactionId: this.extractXmlValue(xml, 'transactionId'),\r\n authorizationCode: this.extractXmlValue(xml, 'authorizationCode'),\r\n voucherNumber: this.extractXmlValue(xml, 'voucherNumber'),\r\n cardToken: this.extractXmlValue(xml, 'cardToken'),\r\n cardMask: this.extractXmlValue(xml, 'cardMask'),\r\n cardBrand: this.extractXmlValue(xml, 'cardBrand'),\r\n cardExpiration: this.extractXmlValue(xml, 'cardExpiration'),\r\n redirectUrl: this.extractXmlValue(xml, 'redirectUrl'),\r\n uniqueid: this.extractXmlValue(xml, 'uniqueid'),\r\n rawXml: xml,\r\n };\r\n }\r\n\r\n private parseRefundResponse(xml: string): HypRefundDealResponse {\r\n return {\r\n resultCode: this.extractXmlValue(xml, 'resultCode') ?? '100',\r\n resultDescription: this.extractXmlValue(xml, 'resultDescription'),\r\n transactionId: this.extractXmlValue(xml, 'transactionId'),\r\n authorizationCode: this.extractXmlValue(xml, 'authorizationCode'),\r\n uniqueid: this.extractXmlValue(xml, 'uniqueid'),\r\n };\r\n }\r\n\r\n private extractXmlValue(xml: string, tagName: string): string | undefined {\r\n const regex = new RegExp(`<${tagName}>([^<]*)</${tagName}>`, 'i');\r\n const match = xml.match(regex);\r\n return match ? match[1].trim() : undefined;\r\n }\r\n\r\n private escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n }\r\n\r\n // ==========================================================================\r\n // Error Handling\r\n // ==========================================================================\r\n\r\n private handleError(error: unknown): {\r\n success: false;\r\n error: string;\r\n errorCode?: string;\r\n } {\r\n if (error instanceof Error) {\r\n return {\r\n success: false,\r\n error: error.message,\r\n errorCode: 'unknown',\r\n };\r\n }\r\n return {\r\n success: false,\r\n error: 'Unknown error occurred',\r\n errorCode: 'unknown',\r\n };\r\n }\r\n}\r\n","/**\r\n * Hyp (CreditGuard) Types\r\n *\r\n * Type definitions for Hyp/CreditGuard API interactions.\r\n * CreditGuard uses XML-based requests over HTTPS.\r\n *\r\n * @see https://cgpay3.creditguard.co.il/docs\r\n */\r\n\r\nimport type { TransactionStatus } from '@nehorai/payments/types';\r\n\r\n// ============================================================================\r\n// Hyp Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Hyp API configuration\r\n *\r\n * Provide either `environment` (auto-selects baseUrl) or `baseUrl` directly.\r\n * If both are provided, `baseUrl` takes precedence.\r\n */\r\nexport interface HypConfig {\r\n /** Terminal number assigned by CreditGuard */\r\n terminalNumber: string;\r\n /** API username */\r\n user: string;\r\n /** API password */\r\n password: string;\r\n /** Webhook secret for callback validation */\r\n webhookSecret?: string;\r\n /** Environment shortcut - auto-selects the correct baseUrl */\r\n environment?: 'sandbox' | 'production';\r\n /** Base URL override (takes precedence over environment) */\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * Hyp API endpoints\r\n */\r\nexport const DEFAULT_HYP_ENDPOINTS = {\r\n test: 'https://cguat2.creditguard.co.il',\r\n production: 'https://cgpay3.creditguard.co.il',\r\n} as const;\r\n\r\n/**\r\n * Hyp supported currencies (subset)\r\n */\r\nexport const HYP_SUPPORTED_CURRENCIES = [\r\n 'ILS', // Israeli Shekel (primary)\r\n 'USD', // US Dollar\r\n 'EUR', // Euro\r\n 'GBP', // British Pound\r\n] as const;\r\n\r\n// ============================================================================\r\n// XML Request/Response Types\r\n// ============================================================================\r\n\r\n/**\r\n * Hyp doDeal request parameters\r\n */\r\nexport interface HypDoDealRequest {\r\n /** Terminal number */\r\n terminalNumber: string;\r\n /** API username */\r\n user: string;\r\n /** API password */\r\n password: string;\r\n /** Card number (for direct charge) */\r\n cardNo?: string;\r\n /** Card expiration (MMYY) */\r\n cardExpiration?: string;\r\n /** CVV code */\r\n cvv?: string;\r\n /** Card token (for saved card transactions) */\r\n cardToken?: string;\r\n /** Authorization code (for force/capture transactions) */\r\n authorizationCode?: string;\r\n /** Amount in minor units (agorot for ILS) */\r\n total?: number;\r\n /** Currency code (ILS, USD, EUR, GBP) */\r\n currency: string;\r\n /** Transaction type (Debit, Credit, etc.) */\r\n transactionType: string;\r\n /** Transaction code for J5: Regular, Verify, etc. */\r\n transactionCode?: string;\r\n /** Credit type: 1=Regular, 8=Credit/Token */\r\n creditType?: string;\r\n /** Validation mode: AutoComm, TxOnly */\r\n validation?: string;\r\n /** Customer ID for tokenization */\r\n customerData?: string;\r\n /** Unique transaction identifier */\r\n uniqueid?: string;\r\n /** Success URL for hosted page */\r\n successUrl?: string;\r\n /** Error URL for hosted page */\r\n errorUrl?: string;\r\n /** Cancel URL for hosted page */\r\n cancelUrl?: string;\r\n /** Language code (he, en) */\r\n language?: string;\r\n}\r\n\r\n/**\r\n * Hyp doDeal response\r\n */\r\nexport interface HypDoDealResponse {\r\n /** Result code (000 = success) */\r\n resultCode: string;\r\n /** Result description */\r\n resultDescription?: string;\r\n /** Transaction ID from CreditGuard */\r\n transactionId?: string;\r\n /** Authorization number */\r\n authorizationCode?: string;\r\n /** Voucher number */\r\n voucherNumber?: string;\r\n /** Card token (if tokenization requested) */\r\n cardToken?: string;\r\n /** Card mask (last 4 digits) */\r\n cardMask?: string;\r\n /** Card brand (Visa, MasterCard, etc.) */\r\n cardBrand?: string;\r\n /** Card expiration */\r\n cardExpiration?: string;\r\n /** Redirect URL for hosted page */\r\n redirectUrl?: string;\r\n /** Unique ID echo */\r\n uniqueid?: string;\r\n /** Raw XML response for debugging */\r\n rawXml?: string;\r\n}\r\n\r\n/**\r\n * Hyp refundDeal request parameters\r\n */\r\nexport interface HypRefundDealRequest {\r\n /** Terminal number */\r\n terminalNumber: string;\r\n /** API username */\r\n user: string;\r\n /** API password */\r\n password: string;\r\n /** Original transaction ID */\r\n transactionId: string;\r\n /** Amount to refund in minor units (optional for full refund) */\r\n total?: number;\r\n /** Currency code */\r\n currency: string;\r\n /** Unique identifier */\r\n uniqueid?: string;\r\n}\r\n\r\n/**\r\n * Hyp refundDeal response\r\n */\r\nexport interface HypRefundDealResponse {\r\n /** Result code (000 = success) */\r\n resultCode: string;\r\n /** Result description */\r\n resultDescription?: string;\r\n /** Refund transaction ID */\r\n transactionId?: string;\r\n /** Authorization code for refund */\r\n authorizationCode?: string;\r\n /** Unique ID echo */\r\n uniqueid?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Status Mapping\r\n// ============================================================================\r\n\r\n/**\r\n * Hyp result codes\r\n */\r\nexport type HypResultCode = '000' | '001' | '002' | '003' | '004' | '005' | '006' | string;\r\n\r\n/**\r\n * Map Hyp result codes to our TransactionStatus\r\n */\r\nexport const HYP_RESULT_CODE_MAP: Record<string, TransactionStatus> = {\r\n '000': 'captured', // Success\r\n '001': 'failed', // Declined\r\n '002': 'failed', // Invalid card\r\n '003': 'failed', // Expired card\r\n '004': 'failed', // Insufficient funds\r\n '005': 'failed', // Invalid CVV\r\n '006': 'failed', // Card not permitted\r\n '033': 'failed', // Lost/Stolen card\r\n '034': 'failed', // Suspected fraud\r\n '051': 'failed', // Insufficient funds\r\n '054': 'failed', // Expired card\r\n '057': 'failed', // Transaction not permitted\r\n '100': 'failed', // System error\r\n '200': 'pending_authorization', // Pending\r\n};\r\n\r\n/**\r\n * Hyp transaction types\r\n */\r\nexport const HYP_TRANSACTION_TYPES = {\r\n /** Regular charge (immediate capture) */\r\n DEBIT: 'Debit',\r\n /** Refund */\r\n CREDIT: 'Credit',\r\n /** Authorization only (J5) */\r\n DEBIT_J5: 'Debit',\r\n} as const;\r\n\r\n/**\r\n * Hyp transaction codes for J5\r\n */\r\nexport const HYP_TRANSACTION_CODES = {\r\n /** Regular transaction */\r\n REGULAR: 'Regular',\r\n /** Verify only (authorization) */\r\n VERIFY: 'Verify',\r\n /** Force transaction */\r\n FORCE: 'Force',\r\n} as const;\r\n\r\n/**\r\n * Hyp validation modes\r\n */\r\nexport const HYP_VALIDATION_MODES = {\r\n /** Auto commit (immediate capture) */\r\n AUTO_COMM: 'AutoComm',\r\n /** Transaction only (authorization, requires manual capture) */\r\n TX_ONLY: 'TxOnly',\r\n} as const;\r\n\r\n/**\r\n * Hyp credit types\r\n */\r\nexport const HYP_CREDIT_TYPES = {\r\n /** Regular credit card */\r\n REGULAR: '1',\r\n /** Token/Saved card */\r\n TOKEN: '8',\r\n} as const;\r\n\r\n// ============================================================================\r\n// Error Mapping\r\n// ============================================================================\r\n\r\n/**\r\n * Map Hyp result codes to our error codes\r\n */\r\nexport const HYP_ERROR_MAP: Record<string, string> = {\r\n '001': 'card_declined',\r\n '002': 'invalid_card',\r\n '003': 'expired_card',\r\n '004': 'insufficient_funds',\r\n '005': 'invalid_cvc',\r\n '006': 'card_declined',\r\n '033': 'card_declined',\r\n '034': 'card_declined',\r\n '051': 'insufficient_funds',\r\n '054': 'expired_card',\r\n '057': 'card_declined',\r\n '100': 'processing_error',\r\n '200': 'authentication_required',\r\n};\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Map Hyp result code to our transaction status\r\n */\r\nexport function mapHypStatus(resultCode: string): TransactionStatus | null {\r\n return HYP_RESULT_CODE_MAP[resultCode] ?? null;\r\n}\r\n\r\n/**\r\n * Map Hyp error code to our error code\r\n */\r\nexport function mapHypError(resultCode: string): string {\r\n return HYP_ERROR_MAP[resultCode] ?? 'unknown';\r\n}\r\n\r\n/**\r\n * Check if currency is supported by Hyp\r\n */\r\nexport function isHypSupportedCurrency(currency: string): boolean {\r\n return HYP_SUPPORTED_CURRENCIES.includes(\r\n currency as (typeof HYP_SUPPORTED_CURRENCIES)[number]\r\n );\r\n}\r\n\r\n/**\r\n * Check if result code indicates success\r\n */\r\nexport function isHypSuccess(resultCode: string): boolean {\r\n return resultCode === '000';\r\n}\r\n\r\n/**\r\n * Format amount for Hyp (already in minor units, no conversion needed)\r\n */\r\nexport function formatHypAmount(amountMinor: number): number {\r\n return amountMinor;\r\n}\r\n\r\n/**\r\n * Format card expiration for Hyp (MMYY format)\r\n */\r\nexport function formatCardExpiration(month: string, year: string): string {\r\n const mm = month.padStart(2, '0');\r\n const yy = year.slice(-2);\r\n return `${mm}${yy}`;\r\n}\r\n\r\n/**\r\n * Parse card expiration from Hyp format (MMYY)\r\n */\r\nexport function parseCardExpiration(expiration: string): {\r\n month: string;\r\n year: string;\r\n} {\r\n const mm = expiration.substring(0, 2);\r\n const yy = expiration.substring(2, 4);\r\n return {\r\n month: mm,\r\n year: `20${yy}`,\r\n };\r\n}\r\n","/**\r\n * Hyp (CreditGuard) Webhook Handler\r\n *\r\n * Handles incoming webhooks/callbacks from Hyp/CreditGuard.\r\n * CreditGuard uses URL callbacks after transaction completion.\r\n *\r\n * @see https://cgpay3.creditguard.co.il/docs/callbacks\r\n */\r\n\r\nimport type {\r\n PaymentProvider,\r\n TransactionStatus,\r\n WebhookProcessingResult,\r\n ReconciliationResult,\r\n} from '@nehorai/payments/types';\r\nimport type {\r\n IWebhookHandler,\r\n ParsedWebhookEvent,\r\n ParseWebhookResult,\r\n} from '@nehorai/payments/providers';\r\nimport { mapHypStatus, mapHypError, isHypSuccess } from './hyp-types.js';\r\n\r\n/**\r\n * Hyp event types (synthesized from result codes)\r\n */\r\nconst HYP_EVENT_TYPES = {\r\n TRANSACTION_SUCCESS: 'transaction.success',\r\n TRANSACTION_FAILED: 'transaction.failed',\r\n TRANSACTION_PENDING: 'transaction.pending',\r\n REFUND_SUCCESS: 'refund.success',\r\n REFUND_FAILED: 'refund.failed',\r\n} as const;\r\n\r\n/**\r\n * Hyp Webhook Handler\r\n *\r\n * Processes callbacks from CreditGuard hosted pages and direct integrations.\r\n */\r\nexport class HypWebhookHandler implements IWebhookHandler {\r\n readonly provider: PaymentProvider = 'hyp';\r\n readonly supportedEventTypes = Object.values(HYP_EVENT_TYPES);\r\n\r\n parseEvent(rawPayload: Record<string, unknown>): ParseWebhookResult {\r\n try {\r\n const resultCode = String(rawPayload.resultCode ?? '100');\r\n const resultDescription = String(rawPayload.resultDescription ?? '');\r\n const transactionId = String(rawPayload.transactionId ?? '');\r\n const uniqueid = String(rawPayload.uniqueid ?? '');\r\n const total = Number(rawPayload.total ?? 0);\r\n const currency = String(rawPayload.currency ?? 'ILS');\r\n\r\n const eventType = this.determineEventType(resultCode);\r\n const newStatus = mapHypStatus(resultCode);\r\n\r\n const event: ParsedWebhookEvent = {\r\n provider: 'hyp',\r\n eventId: uniqueid || transactionId || `hyp_${Date.now()}`,\r\n eventType,\r\n providerTransactionId: transactionId,\r\n amountMinor: total,\r\n currency,\r\n newStatus: newStatus ?? undefined,\r\n error: isHypSuccess(resultCode)\r\n ? undefined\r\n : {\r\n code: resultCode,\r\n message: resultDescription,\r\n },\r\n timestamp: new Date(),\r\n rawPayload,\r\n };\r\n\r\n return {\r\n success: true,\r\n event,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Failed to parse webhook',\r\n };\r\n }\r\n }\r\n\r\n async processEvent(\r\n event: ParsedWebhookEvent\r\n ): Promise<WebhookProcessingResult> {\r\n try {\r\n if (!event.providerTransactionId) {\r\n return {\r\n success: false,\r\n error: 'Missing transaction ID in webhook',\r\n action: 'ignored_event_type',\r\n };\r\n }\r\n\r\n const action = this.determineAction(event);\r\n\r\n return {\r\n success: true,\r\n transactionId: event.providerTransactionId,\r\n action,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Processing failed',\r\n action: 'ignored_event_type',\r\n };\r\n }\r\n }\r\n\r\n canHandle(eventType: string): boolean {\r\n return this.supportedEventTypes.includes(\r\n eventType as (typeof HYP_EVENT_TYPES)[keyof typeof HYP_EVENT_TYPES]\r\n );\r\n }\r\n\r\n async reconcile(\r\n _transactionId: string,\r\n _providerTransactionId: string\r\n ): Promise<ReconciliationResult> {\r\n return {\r\n reconciled: false,\r\n finalStatus: 'pending_authorization',\r\n source: 'webhook',\r\n statusChanged: false,\r\n };\r\n }\r\n\r\n mapEventType(providerEventType: string): string {\r\n return providerEventType;\r\n }\r\n\r\n mapStatus(providerStatus: string): TransactionStatus | null {\r\n return mapHypStatus(providerStatus);\r\n }\r\n\r\n // ==========================================================================\r\n // Helper Methods\r\n // ==========================================================================\r\n\r\n private determineEventType(resultCode: string): string {\r\n if (isHypSuccess(resultCode)) {\r\n return HYP_EVENT_TYPES.TRANSACTION_SUCCESS;\r\n }\r\n\r\n if (resultCode === '200') {\r\n return HYP_EVENT_TYPES.TRANSACTION_PENDING;\r\n }\r\n\r\n return HYP_EVENT_TYPES.TRANSACTION_FAILED;\r\n }\r\n\r\n private determineAction(\r\n event: ParsedWebhookEvent\r\n ): WebhookProcessingResult['action'] {\r\n switch (event.eventType) {\r\n case HYP_EVENT_TYPES.TRANSACTION_SUCCESS:\r\n case HYP_EVENT_TYPES.TRANSACTION_FAILED:\r\n case HYP_EVENT_TYPES.TRANSACTION_PENDING:\r\n case HYP_EVENT_TYPES.REFUND_FAILED:\r\n return 'status_updated';\r\n\r\n case HYP_EVENT_TYPES.REFUND_SUCCESS:\r\n return 'refund_processed';\r\n\r\n default:\r\n return 'ignored_event_type';\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Webhook Validation\r\n // ==========================================================================\r\n\r\n validateSignature(\r\n payload: Record<string, unknown>,\r\n signature?: string,\r\n secret?: string\r\n ): boolean {\r\n const hasRequiredParams =\r\n payload.resultCode !== undefined &&\r\n (payload.transactionId !== undefined || payload.uniqueid !== undefined);\r\n\r\n if (!hasRequiredParams) {\r\n return false;\r\n }\r\n\r\n if (secret && signature) {\r\n return this.validateHMAC(payload, signature, secret);\r\n }\r\n\r\n return hasRequiredParams;\r\n }\r\n\r\n private validateHMAC(\r\n _payload: Record<string, unknown>,\r\n signature: string,\r\n _secret: string\r\n ): boolean {\r\n try {\r\n return !!signature;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Callback URL Builders\r\n // ==========================================================================\r\n\r\n buildSuccessUrl(baseUrl: string, transactionId: string): string {\r\n return `${baseUrl}/api/payments/hyp/callback?status=success&txId=${transactionId}`;\r\n }\r\n\r\n buildErrorUrl(baseUrl: string, transactionId: string): string {\r\n return `${baseUrl}/api/payments/hyp/callback?status=error&txId=${transactionId}`;\r\n }\r\n\r\n buildCancelUrl(baseUrl: string, transactionId: string): string {\r\n return `${baseUrl}/api/payments/hyp/callback?status=cancel&txId=${transactionId}`;\r\n }\r\n\r\n // ==========================================================================\r\n // Response Parsing\r\n // ==========================================================================\r\n\r\n extractErrorDetails(payload: Record<string, unknown>): {\r\n code: string;\r\n message: string;\r\n userMessage: string;\r\n } {\r\n const resultCode = String(payload.resultCode ?? 'unknown');\r\n const resultDescription = String(payload.resultDescription ?? 'Unknown error');\r\n\r\n return {\r\n code: resultCode,\r\n message: resultDescription,\r\n userMessage: this.getUserFriendlyMessage(resultCode),\r\n };\r\n }\r\n\r\n private getUserFriendlyMessage(resultCode: string): string {\r\n const errorCode = mapHypError(resultCode);\r\n\r\n const messages: Record<string, string> = {\r\n card_declined: 'Your card was declined. Please try another payment method.',\r\n invalid_card: 'The card information is invalid. Please check and try again.',\r\n expired_card: 'Your card has expired. Please use a different card.',\r\n insufficient_funds: 'Insufficient funds. Please try another payment method.',\r\n invalid_cvc: 'The security code (CVV) is incorrect.',\r\n processing_error: 'A processing error occurred. Please try again.',\r\n authentication_required:\r\n 'Additional authentication is required. Please complete the verification.',\r\n unknown: 'An error occurred. Please try again or contact support.',\r\n };\r\n\r\n return messages[errorCode] ?? messages.unknown;\r\n }\r\n\r\n extractCardDetails(payload: Record<string, unknown>): {\r\n cardToken?: string;\r\n cardMask?: string;\r\n cardBrand?: string;\r\n cardExpiration?: string;\r\n last4?: string;\r\n } {\r\n const cardToken = payload.cardToken as string | undefined;\r\n const cardMask = payload.cardMask as string | undefined;\r\n const cardBrand = payload.cardBrand as string | undefined;\r\n const cardExpiration = payload.cardExpiration as string | undefined;\r\n\r\n return {\r\n cardToken,\r\n cardMask,\r\n cardBrand,\r\n cardExpiration,\r\n last4: cardMask?.slice(-4),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create Hyp webhook handler instance\r\n */\r\nexport function createHypWebhookHandler(): HypWebhookHandler {\r\n return new HypWebhookHandler();\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,119 @@
1
+ import { PaymentProvider, CreatePaymentIntentParams, PaymentIntentResult, AuthorizePaymentParams, AuthorizationResult, CapturePaymentParams, CaptureResult, VoidPaymentParams, VoidResult, RefundParams, RefundResult, ProviderHealthStatus, WebhookProcessingResult, ReconciliationResult, TransactionStatus } from '@nehorai/payments/types';
2
+ import { IPaymentProvider, CreateSetupIntentParams, SetupIntentResult, SavePaymentMethodParams, SavePaymentMethodResult, DeletePaymentMethodResult, CreateCustomerParams, CreateCustomerResult, IWebhookHandler, ParseWebhookResult, ParsedWebhookEvent } from '@nehorai/payments/providers';
3
+ import { g as HypConfig } from '../hyp-types-BTLDpI0a.cjs';
4
+ export { D as DEFAULT_HYP_ENDPOINTS, H as HYP_CREDIT_TYPES, a as HYP_ERROR_MAP, b as HYP_RESULT_CODE_MAP, c as HYP_SUPPORTED_CURRENCIES, d as HYP_TRANSACTION_CODES, e as HYP_TRANSACTION_TYPES, f as HYP_VALIDATION_MODES, h as HypDoDealRequest, i as HypDoDealResponse, j as HypRefundDealRequest, k as HypRefundDealResponse, l as HypResultCode, m as formatCardExpiration, n as formatHypAmount, o as isHypSuccess, p as isHypSupportedCurrency, q as mapHypError, r as mapHypStatus, s as parseCardExpiration } from '../hyp-types-BTLDpI0a.cjs';
5
+
6
+ /**
7
+ * Hyp (CreditGuard) Provider Implementation
8
+ *
9
+ * Implements IPaymentProvider for Hyp/CreditGuard payment processing.
10
+ * Supports Two-Phase Commit (J5) with manual capture via TxOnly validation.
11
+ *
12
+ * API Documentation: https://cgpay3.creditguard.co.il/docs
13
+ *
14
+ * @see https://www.creditguard.co.il
15
+ */
16
+
17
+ /**
18
+ * Hyp Payment Provider
19
+ *
20
+ * Full implementation of IPaymentProvider for CreditGuard.
21
+ */
22
+ declare class HypProvider implements IPaymentProvider {
23
+ readonly name: PaymentProvider;
24
+ readonly supportedCurrencies: readonly ["ILS", "USD", "EUR", "GBP"];
25
+ readonly supportsRecurring = true;
26
+ readonly supportsSplitPayments = false;
27
+ private config;
28
+ constructor(config: HypConfig);
29
+ /**
30
+ * Create a payment intent
31
+ *
32
+ * For Hyp, this generates a hosted payment page or prepares for direct charge.
33
+ */
34
+ createPaymentIntent(params: CreatePaymentIntentParams): Promise<PaymentIntentResult>;
35
+ /**
36
+ * Create hosted payment page
37
+ */
38
+ private createHostedPage;
39
+ /**
40
+ * Charge with saved payment method token
41
+ */
42
+ private chargeWithToken;
43
+ authorize(params: AuthorizePaymentParams): Promise<AuthorizationResult>;
44
+ capture(params: CapturePaymentParams): Promise<CaptureResult>;
45
+ void(params: VoidPaymentParams): Promise<VoidResult>;
46
+ refund(params: RefundParams): Promise<RefundResult>;
47
+ createSetupIntent(params: CreateSetupIntentParams): Promise<SetupIntentResult>;
48
+ savePaymentMethod(params: SavePaymentMethodParams): Promise<SavePaymentMethodResult>;
49
+ deletePaymentMethod(_paymentMethodId: string): Promise<DeletePaymentMethodResult>;
50
+ createCustomer(params: CreateCustomerParams): Promise<CreateCustomerResult>;
51
+ getOrCreateCustomer(userId: string, _email: string): Promise<CreateCustomerResult>;
52
+ getHealth(): Promise<ProviderHealthStatus>;
53
+ validateWebhookSignature(_payload: string, _signature: string): boolean;
54
+ getPaymentIntentStatus(_providerIntentId: string): Promise<{
55
+ status: string;
56
+ error?: string;
57
+ }>;
58
+ private buildDoDealXML;
59
+ private buildRefundXML;
60
+ private buildTestXML;
61
+ private sendDoDealRequest;
62
+ private sendRefundRequest;
63
+ private parseDoDealResponse;
64
+ private parseRefundResponse;
65
+ private extractXmlValue;
66
+ private escapeXml;
67
+ private handleError;
68
+ }
69
+
70
+ /**
71
+ * Hyp (CreditGuard) Webhook Handler
72
+ *
73
+ * Handles incoming webhooks/callbacks from Hyp/CreditGuard.
74
+ * CreditGuard uses URL callbacks after transaction completion.
75
+ *
76
+ * @see https://cgpay3.creditguard.co.il/docs/callbacks
77
+ */
78
+
79
+ /**
80
+ * Hyp Webhook Handler
81
+ *
82
+ * Processes callbacks from CreditGuard hosted pages and direct integrations.
83
+ */
84
+ declare class HypWebhookHandler implements IWebhookHandler {
85
+ readonly provider: PaymentProvider;
86
+ readonly supportedEventTypes: ("transaction.success" | "transaction.failed" | "transaction.pending" | "refund.success" | "refund.failed")[];
87
+ parseEvent(rawPayload: Record<string, unknown>): ParseWebhookResult;
88
+ processEvent(event: ParsedWebhookEvent): Promise<WebhookProcessingResult>;
89
+ canHandle(eventType: string): boolean;
90
+ reconcile(_transactionId: string, _providerTransactionId: string): Promise<ReconciliationResult>;
91
+ mapEventType(providerEventType: string): string;
92
+ mapStatus(providerStatus: string): TransactionStatus | null;
93
+ private determineEventType;
94
+ private determineAction;
95
+ validateSignature(payload: Record<string, unknown>, signature?: string, secret?: string): boolean;
96
+ private validateHMAC;
97
+ buildSuccessUrl(baseUrl: string, transactionId: string): string;
98
+ buildErrorUrl(baseUrl: string, transactionId: string): string;
99
+ buildCancelUrl(baseUrl: string, transactionId: string): string;
100
+ extractErrorDetails(payload: Record<string, unknown>): {
101
+ code: string;
102
+ message: string;
103
+ userMessage: string;
104
+ };
105
+ private getUserFriendlyMessage;
106
+ extractCardDetails(payload: Record<string, unknown>): {
107
+ cardToken?: string;
108
+ cardMask?: string;
109
+ cardBrand?: string;
110
+ cardExpiration?: string;
111
+ last4?: string;
112
+ };
113
+ }
114
+ /**
115
+ * Create Hyp webhook handler instance
116
+ */
117
+ declare function createHypWebhookHandler(): HypWebhookHandler;
118
+
119
+ export { HypConfig, HypProvider, HypWebhookHandler, createHypWebhookHandler };
@@ -0,0 +1,119 @@
1
+ import { PaymentProvider, CreatePaymentIntentParams, PaymentIntentResult, AuthorizePaymentParams, AuthorizationResult, CapturePaymentParams, CaptureResult, VoidPaymentParams, VoidResult, RefundParams, RefundResult, ProviderHealthStatus, WebhookProcessingResult, ReconciliationResult, TransactionStatus } from '@nehorai/payments/types';
2
+ import { IPaymentProvider, CreateSetupIntentParams, SetupIntentResult, SavePaymentMethodParams, SavePaymentMethodResult, DeletePaymentMethodResult, CreateCustomerParams, CreateCustomerResult, IWebhookHandler, ParseWebhookResult, ParsedWebhookEvent } from '@nehorai/payments/providers';
3
+ import { g as HypConfig } from '../hyp-types-BTLDpI0a.js';
4
+ export { D as DEFAULT_HYP_ENDPOINTS, H as HYP_CREDIT_TYPES, a as HYP_ERROR_MAP, b as HYP_RESULT_CODE_MAP, c as HYP_SUPPORTED_CURRENCIES, d as HYP_TRANSACTION_CODES, e as HYP_TRANSACTION_TYPES, f as HYP_VALIDATION_MODES, h as HypDoDealRequest, i as HypDoDealResponse, j as HypRefundDealRequest, k as HypRefundDealResponse, l as HypResultCode, m as formatCardExpiration, n as formatHypAmount, o as isHypSuccess, p as isHypSupportedCurrency, q as mapHypError, r as mapHypStatus, s as parseCardExpiration } from '../hyp-types-BTLDpI0a.js';
5
+
6
+ /**
7
+ * Hyp (CreditGuard) Provider Implementation
8
+ *
9
+ * Implements IPaymentProvider for Hyp/CreditGuard payment processing.
10
+ * Supports Two-Phase Commit (J5) with manual capture via TxOnly validation.
11
+ *
12
+ * API Documentation: https://cgpay3.creditguard.co.il/docs
13
+ *
14
+ * @see https://www.creditguard.co.il
15
+ */
16
+
17
+ /**
18
+ * Hyp Payment Provider
19
+ *
20
+ * Full implementation of IPaymentProvider for CreditGuard.
21
+ */
22
+ declare class HypProvider implements IPaymentProvider {
23
+ readonly name: PaymentProvider;
24
+ readonly supportedCurrencies: readonly ["ILS", "USD", "EUR", "GBP"];
25
+ readonly supportsRecurring = true;
26
+ readonly supportsSplitPayments = false;
27
+ private config;
28
+ constructor(config: HypConfig);
29
+ /**
30
+ * Create a payment intent
31
+ *
32
+ * For Hyp, this generates a hosted payment page or prepares for direct charge.
33
+ */
34
+ createPaymentIntent(params: CreatePaymentIntentParams): Promise<PaymentIntentResult>;
35
+ /**
36
+ * Create hosted payment page
37
+ */
38
+ private createHostedPage;
39
+ /**
40
+ * Charge with saved payment method token
41
+ */
42
+ private chargeWithToken;
43
+ authorize(params: AuthorizePaymentParams): Promise<AuthorizationResult>;
44
+ capture(params: CapturePaymentParams): Promise<CaptureResult>;
45
+ void(params: VoidPaymentParams): Promise<VoidResult>;
46
+ refund(params: RefundParams): Promise<RefundResult>;
47
+ createSetupIntent(params: CreateSetupIntentParams): Promise<SetupIntentResult>;
48
+ savePaymentMethod(params: SavePaymentMethodParams): Promise<SavePaymentMethodResult>;
49
+ deletePaymentMethod(_paymentMethodId: string): Promise<DeletePaymentMethodResult>;
50
+ createCustomer(params: CreateCustomerParams): Promise<CreateCustomerResult>;
51
+ getOrCreateCustomer(userId: string, _email: string): Promise<CreateCustomerResult>;
52
+ getHealth(): Promise<ProviderHealthStatus>;
53
+ validateWebhookSignature(_payload: string, _signature: string): boolean;
54
+ getPaymentIntentStatus(_providerIntentId: string): Promise<{
55
+ status: string;
56
+ error?: string;
57
+ }>;
58
+ private buildDoDealXML;
59
+ private buildRefundXML;
60
+ private buildTestXML;
61
+ private sendDoDealRequest;
62
+ private sendRefundRequest;
63
+ private parseDoDealResponse;
64
+ private parseRefundResponse;
65
+ private extractXmlValue;
66
+ private escapeXml;
67
+ private handleError;
68
+ }
69
+
70
+ /**
71
+ * Hyp (CreditGuard) Webhook Handler
72
+ *
73
+ * Handles incoming webhooks/callbacks from Hyp/CreditGuard.
74
+ * CreditGuard uses URL callbacks after transaction completion.
75
+ *
76
+ * @see https://cgpay3.creditguard.co.il/docs/callbacks
77
+ */
78
+
79
+ /**
80
+ * Hyp Webhook Handler
81
+ *
82
+ * Processes callbacks from CreditGuard hosted pages and direct integrations.
83
+ */
84
+ declare class HypWebhookHandler implements IWebhookHandler {
85
+ readonly provider: PaymentProvider;
86
+ readonly supportedEventTypes: ("transaction.success" | "transaction.failed" | "transaction.pending" | "refund.success" | "refund.failed")[];
87
+ parseEvent(rawPayload: Record<string, unknown>): ParseWebhookResult;
88
+ processEvent(event: ParsedWebhookEvent): Promise<WebhookProcessingResult>;
89
+ canHandle(eventType: string): boolean;
90
+ reconcile(_transactionId: string, _providerTransactionId: string): Promise<ReconciliationResult>;
91
+ mapEventType(providerEventType: string): string;
92
+ mapStatus(providerStatus: string): TransactionStatus | null;
93
+ private determineEventType;
94
+ private determineAction;
95
+ validateSignature(payload: Record<string, unknown>, signature?: string, secret?: string): boolean;
96
+ private validateHMAC;
97
+ buildSuccessUrl(baseUrl: string, transactionId: string): string;
98
+ buildErrorUrl(baseUrl: string, transactionId: string): string;
99
+ buildCancelUrl(baseUrl: string, transactionId: string): string;
100
+ extractErrorDetails(payload: Record<string, unknown>): {
101
+ code: string;
102
+ message: string;
103
+ userMessage: string;
104
+ };
105
+ private getUserFriendlyMessage;
106
+ extractCardDetails(payload: Record<string, unknown>): {
107
+ cardToken?: string;
108
+ cardMask?: string;
109
+ cardBrand?: string;
110
+ cardExpiration?: string;
111
+ last4?: string;
112
+ };
113
+ }
114
+ /**
115
+ * Create Hyp webhook handler instance
116
+ */
117
+ declare function createHypWebhookHandler(): HypWebhookHandler;
118
+
119
+ export { HypConfig, HypProvider, HypWebhookHandler, createHypWebhookHandler };