import {z} from 'zod' export type PaymentPaymentToken = string; export type CardholderName = string; export type CardholderEmail = string; export type PaymentGeneratePaymentToken = boolean; export type PaymentCustomer = {email?: string | undefined, name?: string | undefined, phone?: string | undefined}; export type Country = string; export type Address = {country?: Country | undefined, city?: string | undefined, line1?: string | undefined, line2?: string | undefined, zip?: string | undefined, state?: string | undefined}; export type PaymentBillingDetails = {name?: string | undefined, email?: string | undefined, phone?: string | undefined, company?: string | undefined, taxId?: string | undefined, address?: Address | undefined}; export type PaymentShippingDetails = {name?: string | undefined, email?: string | undefined, phone?: string | undefined, company?: string | undefined, taxId?: string | undefined, address?: Address | undefined}; export type IP = string; export type Lang = string; export type DeviceType = string; export type DeviceModel = string; export type Browser = string; export type BrowserVersion = string; export type Os = string; export type OsVersion = string; export type Source = string; export type SourceVersion = string; export type UserAgent = string; export type BrowserAccept = string; export type BrowserColorDepth = string; export type BrowserScreenHeight = string; export type BrowserScreenWidth = string; export type BrowserTimezoneOffset = string; export type PaymentSessionDetails = {ip?: IP | undefined, countryCode?: Country | undefined, lang?: Lang | undefined, deviceType?: DeviceType | undefined, deviceModel?: DeviceModel | undefined, browser?: Browser | undefined, browserVersion?: BrowserVersion | undefined, os?: Os | undefined, osVersion?: OsVersion | undefined, source?: Source | undefined, sourceVersion?: SourceVersion | undefined, userAgent?: UserAgent | undefined, browserAccept?: BrowserAccept | undefined, browserColorDepth?: BrowserColorDepth | undefined, browserScreenHeight?: BrowserScreenHeight | undefined, browserScreenWidth?: BrowserScreenWidth | undefined, browserTimezoneOffset?: BrowserTimezoneOffset | undefined}; export type Metadata = Record; export type ConfirmPaymentRequest = {paymentToken: PaymentPaymentToken, paymentMethod?: ({card?: ({cardholderName?: CardholderName | undefined, cardholderEmail?: CardholderEmail | undefined}) | undefined}) | undefined, generatePaymentToken?: PaymentGeneratePaymentToken | undefined, customer?: PaymentCustomer | undefined, billingDetails?: PaymentBillingDetails | undefined, shippingDetails?: PaymentShippingDetails | undefined, sessionDetails?: PaymentSessionDetails | undefined, metadata?: Metadata | undefined}; export type CreateApiPaymentsIdConfirmArgs = {body: ConfirmPaymentRequest}; export type CreateApiPaymentsIdConfirmOptions = {baseUrl?: string | undefined, APIKey?: string | undefined, fetch?: typeof fetch | undefined}; export const paymentId = z.string(); export const paymentAmount = z.number().int(); export const paymentCurrency = z.string(); export const paymentOrderId = z.string().min(1).max(40); export const paymentDescription = z.string(); export const accountId = z.string(); export const paymentAuthorizationCode = z.string(); export const livemode = z.boolean(); export const paymentStatus = z.enum(["SUCCEEDED", "PENDING", "FAILED", "CANCELED", "REFUNDED", "PARTIALLY_REFUNDED", "AUTHORIZED", "EXPIRED", "PENDING_PROCESSING", "PAID_OUT"]); export const paymentStatusCode = z.string(); export const paymentStatusMessage = z.string(); export const paymentCustomerId = z.string(); export const paymentCustomer = z.object({email: z.string().optional(), name: z.string().optional(), phone: z.string().optional()}); export const country = z.string(); export const paymentShop = z.object({name: z.string().optional(), country: country.optional()}); export const address = z.object({country: country.optional(), city: z.string().optional(), line1: z.string().optional(), line2: z.string().optional(), zip: z.string().optional(), state: z.string().optional()}); export const paymentBillingDetails = z.object({name: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), company: z.string().optional(), taxId: z.string().optional(), address: address.optional()}); export const paymentShippingDetails = z.object({name: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), company: z.string().optional(), taxId: z.string().optional(), address: address.optional()}); export const paymentRefundedAmount = z.number().int(); export const paymentLastRefundAmount = z.number().int(); export const paymentLastRefundReason = z.enum(["duplicated", "fraudulent", "requested_by_customer", "order_canceled"]); export const paymentCancellationReason = z.enum(["duplicated", "fraudulent", "requested_by_customer", "order_canceled"]); export const iP = z.string(); export const lang = z.string(); export const deviceType = z.string(); export const deviceModel = z.string(); export const browser = z.string(); export const browserVersion = z.string(); export const os = z.string(); export const osVersion = z.string(); export const source = z.string(); export const sourceVersion = z.string(); export const userAgent = z.string(); export const browserAccept = z.string(); export const browserColorDepth = z.string(); export const browserScreenHeight = z.string(); export const browserScreenWidth = z.string(); export const browserTimezoneOffset = z.string(); export const paymentSessionDetails = z.object({ip: iP.optional(), countryCode: country.optional(), lang: lang.optional(), deviceType: deviceType.optional(), deviceModel: deviceModel.optional(), browser: browser.optional(), browserVersion: browserVersion.optional(), os: os.optional(), osVersion: osVersion.optional(), source: source.optional(), sourceVersion: sourceVersion.optional(), userAgent: userAgent.optional(), browserAccept: browserAccept.optional(), browserColorDepth: browserColorDepth.optional(), browserScreenHeight: browserScreenHeight.optional(), browserScreenWidth: browserScreenWidth.optional(), browserTimezoneOffset: browserTimezoneOffset.optional()}); export const paymentTraceDetails = z.object({ip: iP.optional(), countryCode: country.optional(), lang: lang.optional(), deviceType: deviceType.optional(), deviceModel: deviceModel.optional(), browser: browser.optional(), browserVersion: browserVersion.optional(), os: os.optional(), osVersion: osVersion.optional(), source: source.optional(), sourceVersion: sourceVersion.optional(), userAgent: userAgent.optional(), browserAccept: browserAccept.optional(), browserColorDepth: browserColorDepth.optional(), browserScreenHeight: browserScreenHeight.optional(), browserScreenWidth: browserScreenWidth.optional(), browserTimezoneOffset: browserTimezoneOffset.optional(), userId: z.string().optional(), userEmail: z.string().optional()}); export const paymentPaymentToken = z.string(); export const paymentPaymentMethodCard = z.object({country: country.optional(), brand: z.enum(["visa", "mastercard", "diners", "amex", "jcb", "unionpay", "discover", "unknown"]).optional(), type: z.enum(["debit", "credit"]).optional(), threeDSecure: z.boolean().optional(), threeDSecureVersion: z.string().optional(), threeDSecureFlow: z.enum(["CHALLENGE", "FRICTIONLESS", "FRICTIONLESS_CHALLENGE", "DIRECT"]).optional(), expiration: z.number().int().optional(), last4: z.string().optional(), fingerprint: z.string().optional(), tokenizationMethod: z.enum(["applePay", "googlePay", "clickToPay"]).optional(), cardholderName: z.string().optional(), cardholderEmail: z.string().optional()}); export const paymentPaymentMethodBizum = z.object({phoneNumber: z.string().optional()}); export const paymentPaymentMethodPaypal = z.object({orderId: z.string().optional(), payerId: z.string().optional(), email: z.string().optional(), name: z.string().optional()}); export const paymentPaymentMethodMbway = z.object({phoneNumber: z.string().optional()}); export const paymentPaymentMethodTrustly = z.object({customerId: z.string().optional()}); export const paymentPaymentMethodSepa = z.object({accountholderAddress: z.string().optional(), accountholderEmail: z.string().optional(), accountholderName: z.string().optional(), countryCode: z.string().optional(), bankAddress: z.string().optional(), bankCode: z.string().optional(), bankName: z.string().optional(), bic: z.string().optional(), last4: z.string().optional(), fingerprint: z.string().optional()}); export const paymentPaymentMethodKlarna = z.object({billingCategory: z.enum(["PAY_LATER", "PAY_NOW", "SLICE_IT", "SLICE_IT_BY_CARD", "PAY_IN_PARTS"]).optional(), authPaymentMethod: z.enum(["invoice", "fixed_amount", "pix", "base_account", "deferred_interest", "direct_debit", "direct_bank_transfer", "b2b_invoice", "card", "slice_it_by_card"]).optional()}); export const paymentPaymentMethod = z.object({method: z.enum(["alipay", "card", "bizum", "paypal", "mbway", "multibanco", "iDeal", "bancontact", "sofort", "trustly", "sepa", "klarna", "giropay", "eps", "blik"]).optional(), card: paymentPaymentMethodCard.optional(), bizum: paymentPaymentMethodBizum.optional(), paypal: paymentPaymentMethodPaypal.optional(), mbway: paymentPaymentMethodMbway.optional(), trustly: paymentPaymentMethodTrustly.optional(), sepa: paymentPaymentMethodSepa.optional(), klarna: paymentPaymentMethodKlarna.optional()}); export const paymentSequenceRecurring = z.object({expiry: z.string().optional(), frequency: z.number().int().optional()}); export const paymentSequence = z.object({type: z.literal("recurring"), recurring: paymentSequenceRecurring.optional()}); export const paymentSequenceId = z.string(); export const paymentStoreId = z.string(); export const paymentPointOfSaleId = z.string(); export const metadata = z.object({}); export const paymentNextAction = z.object({type: z.enum(["CONFIRM", "CHALLENGE", "FRICTIONLESS_CHALLENGE", "BIZUM_CHALLENGE", "INSTALLMENT_SELECT", "COMPLETE"]).optional(), mustRedirect: z.boolean().optional(), redirectUrl: z.string().optional()}); export const createdAt = z.number().int(); export const updatedAt = z.number().int(); export const payment = z.object({id: paymentId, amount: paymentAmount, currency: paymentCurrency, orderId: paymentOrderId.optional(), description: paymentDescription.optional(), accountId: accountId, authorizationCode: paymentAuthorizationCode.optional(), livemode: livemode, status: paymentStatus, statusCode: paymentStatusCode.optional(), statusMessage: paymentStatusMessage.optional(), customerId: paymentCustomerId.optional(), customer: paymentCustomer.optional(), shop: paymentShop.optional(), billingDetails: paymentBillingDetails.optional(), shippingDetails: paymentShippingDetails.optional(), refundedAmount: paymentRefundedAmount.optional(), lastRefundAmount: paymentLastRefundAmount.optional(), lastRefundReason: paymentLastRefundReason.optional(), cancellationReason: paymentCancellationReason.optional(), sessionDetails: paymentSessionDetails.optional(), traceDetails: paymentTraceDetails.optional(), paymentToken: paymentPaymentToken.optional(), paymentMethod: paymentPaymentMethod.optional(), sequence: paymentSequence.optional(), sequenceId: paymentSequenceId.optional(), storeId: paymentStoreId.optional(), pointOfSaleId: paymentPointOfSaleId.optional(), metadata: metadata.optional(), nextAction: paymentNextAction.optional(), createdAt: createdAt.optional(), updatedAt: updatedAt.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Confirm Payment * * POST /payments/{id}/confirm */ export const createApiPaymentsIdConfirm = async (args: CreateApiPaymentsIdConfirmArgs, options?: CreateApiPaymentsIdConfirmOptions) => { const {baseUrl = "https://api.monei.com/v1", fetch: fetchFn = fetch, APIKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (APIKey !== undefined) headers.set("Authorization", APIKey) const url = `${baseUrl.replace(/\/+$/, '')}/payments/${encodeURIComponent(String(args.id))}/confirm${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(payment, await res.json()) };