diff options
Diffstat (limited to 'packages/taler-wallet-core/src/pay-merchant.ts')
-rw-r--r-- | packages/taler-wallet-core/src/pay-merchant.ts | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts index f08db3a6a..8b6cb5e8d 100644 --- a/packages/taler-wallet-core/src/pay-merchant.ts +++ b/packages/taler-wallet-core/src/pay-merchant.ts @@ -34,6 +34,8 @@ import { assertUnreachable, AsyncFlag, checkDbInvariant, + CheckPaymentResponse, + CheckPayTemplateReponse, CheckPayTemplateRequest, codecForAbortResponse, codecForMerchantContractTerms, @@ -79,6 +81,7 @@ import { TalerErrorCode, TalerErrorDetail, TalerMerchantApi, + TalerMerchantInstanceHttpClient, TalerPreciseTimestamp, TalerProtocolViolationError, TalerUriAction, @@ -627,8 +630,7 @@ async function processDownloadProposal( if (proposal.purchaseStatus != PurchaseStatus.PendingDownloadingProposal) { logger.error( - `unexpected state ${proposal.purchaseStatus}/${ - PurchaseStatus[proposal.purchaseStatus] + `unexpected state ${proposal.purchaseStatus}/${PurchaseStatus[proposal.purchaseStatus] } for ${ctx.transactionId} in processDownloadProposal`, ); return TaskRunResult.finished(); @@ -887,8 +889,7 @@ async function createOrReusePurchase( oldProposal.claimToken === claimToken ) { logger.info( - `Found old proposal (status=${ - PurchaseStatus[oldProposal.purchaseStatus] + `Found old proposal (status=${PurchaseStatus[oldProposal.purchaseStatus] }) for order ${orderId} at ${merchantBaseUrl}`, ); if (oldProposal.purchaseStatus === PurchaseStatus.DialogShared) { @@ -1601,16 +1602,31 @@ async function downloadTemplate( export async function checkPayForTemplate( wex: WalletExecutionContext, req: CheckPayTemplateRequest, -): Promise<TalerMerchantApi.WalletTemplateDetails> { +): Promise<CheckPayTemplateReponse> { const parsedUri = parsePayTemplateUri(req.talerPayTemplateUri); if (!parsedUri) { throw Error("invalid taler-template URI"); } - return await downloadTemplate( + const asd = await downloadTemplate( wex, parsedUri.merchantBaseUrl, parsedUri.templateId, ); + + const merchantApi = new TalerMerchantInstanceHttpClient( + parsedUri.merchantBaseUrl, + wex.http, + ); + + const cfg = await merchantApi.getConfig() + if (cfg.type === "fail") { + throw TalerError.fromUncheckedDetail(cfg.detail); + } + + return { + ...asd, + supportedCurrencies: Object.keys(cfg.body.currencies) + } } export async function preparePayForTemplate( @@ -1630,28 +1646,26 @@ export async function preparePayForTemplate( parsedUri.templateId, ); - const amountFromUri = templateInfo.editable_defaults?.amount; - if (amountFromUri != null) { - const templateParamsAmount = req.templateParams?.amount; - if (templateParamsAmount != null) { - templateDetails.amount = templateParamsAmount as AmountString; - } else { - if (Amounts.isCurrency(amountFromUri)) { - throw Error( - "Amount from template URI only has a currency without value. The value must be provided in the templateParams.", - ); - } else { - templateDetails.amount = amountFromUri as AmountString; - } + const templateParamsAmount = req.templateParams?.amount as AmountString | undefined; + if (templateParamsAmount === null) { + const amountFromUri = templateInfo.editable_defaults?.amount; + if (amountFromUri != null) { + templateDetails.amount = amountFromUri as AmountString; } + } else { + templateDetails.amount = templateParamsAmount } - if ( - templateInfo.editable_defaults?.summary !== undefined && - typeof templateInfo.editable_defaults?.summary === "string" - ) { - templateDetails.summary = - req.templateParams?.summary ?? templateInfo.editable_defaults?.summary; + + const templateParamsSummary = req.templateParams?.summary; + if (templateParamsSummary === null) { + const summaryFromUri = templateInfo.editable_defaults?.summary; + if (summaryFromUri != null) { + templateDetails.summary = summaryFromUri; + } + } else { + templateDetails.summary = templateParamsSummary } + const reqUrl = new URL( `templates/${parsedUri.templateId}`, parsedUri.merchantBaseUrl, |