- From: Rouslan Solomakhin <notifications@github.com>
- Date: Tue, 31 Jan 2017 08:59:54 -0800
- To: w3c/webpayments-payment-apps-api <webpayments-payment-apps-api@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webpayments-payment-apps-api/issues/96/276423629@github.com>
@adamroach proposed: > const methodData = [{ supportedMethods: ["basic-card"], filters: { supportedNetworks: ['visa', 'mastercard'], supportedTypes: ['credit'] }, data: { // Any payment-method-specific fields go here. } }]; I like this approach to filtering, but would prefer to avoid breaking changes to the PaymentMethodData structure. So, let's not add `filters`, but define an algorithm for the browser to filter payment apps based on subset of `data`. In particular, let's consider all lists of strings to be filters. First, a payment app should tell the browser how it should be matched by filters: ```javascript hypothetical.api.register( "basic-card", "MyBank's Debit Card", data: { supportedNetworks: "visa", supportedTypes: "debit" }); ``` Second, the merchant website requests a payment: ```javascript new PaymentRequest([{ supportedMethods: ["basic-card"], data: { supportedNetworks: ["visa", "amex"], supportedTypes: ["debit", "prepaid"], } }], details); ``` Third, the browser runs the matching algorithm for `PaymentRequest.show()`. This matching algorithm returns the list of payment methods that the user should be able to select: * Let `matchingMethods` be an empty list. * For each `PaymentMethodData`: * Let `requestMethodNames` be `PaymentMethodData.supportedMethods`, e.g., `["basic-card]`. * Let `filterKeys` be the keys of `PaymentMethodData.data` that have a type of "array of strings", e.g., `["supportedNetworks", "supportedTypes"]`. * For each registered payment method: * Let `matchingFiltersNumber` be `0`. * Let `method` be the current payment method, e.g., `"basic-card", "MyBank's Debit Card", data: {...}`. * Let `methodName` be the payment method identifier, e.g., `"basic-card"`. * If `methodName` is in `requestMethodNames`: * Let `dataKeys` be the names of the keys of `method.data`, e.g., `["supportedNetworks", "supportedTypes"]`. * For each `key` in `dataKeys`: * If `key` is in `filterKeys`: * Let `methodValue` be the value of `method.data[key]`, e.g., `"visa"`. * Let `requestFilter` be the value of `PaymentMethodData.data[key]`, e.g., `["visa", "amex"]`. * If `methodValue` is in `requestFilter`: * Increment `matchingFiltersNumber` by 1. * If `matchingFiltersNumber` is equal to `len(dataKeys)`, i.e., all filters match: * Add `method` to `matchingMethods`. * Return `matchingMethods`. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/w3c/webpayments-payment-apps-api/issues/96#issuecomment-276423629
Received on Tuesday, 31 January 2017 17:00:50 UTC