Skip to content

Should it be possible to vary amounts depending on payment method #4

Open
adrianba opened this Issue Mar 2, 2016 · 21 comments
@adrianba
adrianba commented Mar 2, 2016

This was discussed at the F2F.

The question is whether it should be possible to request different amounts depending on payment method selected and if so how to supply the amounts. During the discussion there was some desire to support this use case but also a desire to keep the case where amounts do not vary simple.

@mattsaxon

This is a very common use case, certainly in the UK; for example it is common for debit cards to attract no additional fees from the merchant, whereas credit cards often do.

Also some payment methods may support specific currencies, e.g. BitCoins, so a different amount is required in those cases. I guess I could conceive of this being true for other more traditional payment methods also that might support specific currencies.

@burdges
burdges commented Mar 7, 2016

I've no answer, but..

I think many merchants have traditionally used this to attract customers to their own Credit Card brand.

There are definitely European merchants that give the user a choice of being billed in EUR or GBP when paying with a UK bank card, certainly ATMs and several budget airlines. It's very hard for users to figure out the optimal decision with such systems, certainly I never figured out if it was good or bad.

Conversely, there are now some legal restrictions on charging different fees based upon the payment method in some jurisdictions. One could imagine some choices here leading to merchants violating laws, although that landscape appears complicated.

@mattsaxon

Yes, the landscape is complicated,,, I don't think we should be trying to code legislative restrictions into the API, the legislations moves with time and region.

@mattsaxon

As a further complication, the charging that certain merchants apply goes to a lower level than brand. For example a Visa Debit card can attract different changes from the Visa Credit. Currently the Payment Method identifiers don't specify a subbrand, but I've submitted PR #95 to show a reasonable example of how these split down. The PR shows a hierarchy and matching of PMIs could be done at multiple levels, so a merchant may say they accept "Visa" meaning any type of visa or be more specific if they only want to accept sub-brands, e.g. "Electron"

@mattsaxon mattsaxon added this to the Priority: Medium milestone Mar 21, 2016
@davidillsley

Just to provide a concrete (though definitely unusual) example, different rates for different cards are laid out in legislation for card payment of taxes in the UK: http://www.legislation.gov.uk/uksi/2016/333/pdfs/uksi_20160333_en.pdf

@mattsaxon

@davidillsley thanks for that, this shows an even greater granularity that the debit/credit split that I've shown. I agree it can get very complex, though I haven't personally experienced a merchant applying charges at this granularity, usually the merchant gives a blended via that covers any discrepancy as far as I can tell.

@rsolomakhin

Let's keep the API simple for now, unless the merchants come back clamoring for this feature. The merchant can show a single price to the user and absorb the fees themselves.

@dlongley

Let's keep the API simple for now, unless the merchants come back clamoring for this feature. The merchant can show a single price to the user and absorb the fees themselves.

-1 This makes it difficult for merchants to incentivize users toward preferred payment methods. We want to enable more competition, not less.

@nickjshearer

We want to enable more competition, not less.

I am not sure I would see it that way - if anything it makes it harder for small players to compete with larger ones who can afford to subsidize merchants - but I agree it's desirable. It's very common in Europe for some verticals to surcharge some payment methods over others. There may be some middle ground here, where we initially provide the ability to vary the amount by brand/instrument and then have a future action item to look at supporting merchants who require further fidelity.

@adrianhopebailie

I agree with @nickjshearer

I think everyone is in favour of as much felxibility as we can offer to all stakeholders to allow them to innovate and differentiate BUT we must balance that with keeping the API simple (especially to start) and our need to produce something concrete very soon.

In short, I'm :+1: on the question being asked (yes it should be possible) but I'm not convinced we MUST offer this in the FPWD if we have an issue marker asking if it's a requirement and also how much fidelity the community feels is desirable.

@dlongley

In short, I'm :+1: on the question being asked (yes it should be possible) but I'm not convinced we MUST offer this in the FPWD if we have an issue marker asking if it's a requirement and also how much fidelity the community feels is desirable.

+1 to @adrianhopebailie's position

@mattsaxon

I'm happy that this is not in FPWD, that is not the question for me.

On behalf of the community, this is needed, so Im a -1 to leaving it out. The issue should say that we need different pricing per PMI IMO.

@rsolomakhin

I think it makes sense to allow items to be optionally present in the payment-method specific data. What do you think?

var paymentRequest = new PaymentRequest(
    ["foo", "visa"],
    {"items": [{
        "id": "total",
        "label": "Total amount",
        "amount": {"currencyCode": "USD", "value": "1.00"}
    }]},
    {"requestShipping": false},
    {"foo": {
        "bar": "baz",
        "items": [{
            "id": "original",
            "label": "Original price",
            "amount": {"currencyCode": "USD", "value": "1.00"}
        }, {
            "id": "foodiscount",
            "label": "Foo payment method discount",
            "amount": {"currencyCode": "USD", "value": "-0.30"}
        }, {
            "id": "total",
            "label": "Total amount",
            "amount": {"currencyCode": "USD", "value": "0.70"}
        }]
    }});
@rsolomakhin

I've thought of a better way to accomplish payment method specific discounts: have two "Buy" buttons on the webpage. This lets us keep the API simple in v1 and still accommodate the use case. What do you think? Example:

<button onClick="discountPrice();">Use Foo to buy for $0.70</button>
<button onClick="fullPrice();">Buy for $1.00</button>
<script>
function discountPrice() {
    new PaymentRequest(
        ["foo"],
        {"items": [{
                "id": "original",
                "label": "Original price",
                "amount": {"currencyCode": "USD", "value": "1.00"}
            }, {
                "id": "foodiscount",
                "label": "Foo payment method discount",
                "amount": {"currencyCode": "USD", "value": "-0.30"}
            }, {
                "id": "total",
                "label": "Total amount",
                "amount": {"currencyCode": "USD", "value": "0.70"}
            }]}).show().then(chargeDiscountPrice).catch(handleError);
}
function fullPrice() {
    new PaymentRequest(
        ["visa", "mastercard", "amex"],
        {"items": [{
                "id": "total",
                "label": "Total amount",
                "amount": {"currencyCode": "USD", "value": "1.00"}
            }]}).show().then(chargeFullPrice).catch(handleError);
}
</script>
@halindrome

It would work. It wouldn't scale super well. Also it presumes that the merchant knows all of the payment methods that the customer has in their wallet. I thought we weren't supporting that sort of interrogation? If we are not, then the merchant might be offering a buy button that would immediately fail. That doesn't feel super user friendly.

@rsolomakhin

it presumes that the merchant knows all of the payment methods that the customer has in their wallet.

Good point. Multiple buttons would not work.

@adrianhopebailie

In TAG review @triblondon said:

#23 and #4 discuss the ability for merchants to express a payment method preference and to charge differently for different payment methods. Merchant preference seems basically meaningless unless there is a charge element - the user has no reason to choose a particular payment method simply because the merchant wants them to, but they would certainly be swayed if using one method added a surcharge. Perhaps the simplest way to model that would be to have the merchant pre-calculate a supplement charge to attach to the payment method at the PaymentRequest level, rather than polluting the PaymentDetails items dictionary with multiple additional charges per item (this is suggested in w3c/browser-payment-api#4 (comment), which I agree with). I'm concerned that any potential desire to add granularity to the cost of an individual item will get multi-dimensional very quickly - eg supporting different charges based on payment method, and also expressing pricing in different currencies, you would need a value for each intersection of that possibility space.

@mattsaxon

Merchant preference seems basically meaningless unless there is a charge element

The merchant preference may be that they can process them easier/cheaper, even if they do not want (or are compelled not) to charge the consumer differently.

@djackso3
djackso3 commented Apr 8, 2016

FYI -- I verified with a small merchant -- they ARE paying higher fees because of the mismatch and confusion at the bank over the "billing" v "home" v "mailing" which failed. So the merchant DOES care. A tailor I used asked me about it because he paid a higher interchange due to "zip mismatch" and "address mismatch".

@mattsaxon

Yes, there are many reasons for the merchant to express a preference, Quite how we might reconcile this with the user preference may well be up to the user agent, but I think the API must support the semantics for the merchant to express their preference.

@adrianhopebailie adrianhopebailie added a commit to adrianhopebailie/browser-payment-api that referenced this issue Apr 10, 2016
@adrianhopebailie adrianhopebailie Merged PaymentRequest params and tweaked to address some issues
Merged PaymentRequest constructor params to allow for options (only
processed by the UA) and details (passed to the payment app).
This commit also proposes solutions to:
#4, #15 and #18
66e5a51
@adrianhopebailie

By separating the options and details of the PaymentRequest PR #133 would allow for this to be easily solved and an issue marker has been included to reflect this.

The solution is simply to allow an amount for each PaymentMethod (in exactly the same format as the amount specified in details.amount).

A sample details object might look like:

{
  "amount" : [{
    "currency" : "USD",
    "value" : "55.00"
  }],
  "supportedMethods" : [
    {
      "identifers" : ["visa", "mastercard"],
      "data" : {}
    },
    {
      "identifers" : ["bobpay.com"],
      "data" : {
        "merchantIdentifier" : "XXXX",
        "bobPaySpecificField" : true
      },
      "amount" : [{
        "currency" : "USD",
        "value" : "55.00"}],
      },
    {
      "identifiers" : ["bitcoin"],
      "data" : {
        "address" : "XXXX"
      }
      "amount" : [{
        "currency" : "XBT",
        "value" : "0.000123"}],
      },
    }
  }
@adrianba adrianba added a commit to adrianba/browser-payment-api that referenced this issue Apr 28, 2016
@adrianba adrianba Remove issue #48 label.
Fixes #48.

PR #162 refactored the supportedMethods and payment specific data
fields. Issue #3 discusses supporting multiple currencies and issue #4
discusses price per payment method and we should consider specific
proposals for those issues.

PR #162 replaces the `sequence<DOMString>` with
`sequence<PaymentMethodData>` so we now use objects.
7bcb324
@adrianba adrianba added a commit that referenced this issue Apr 28, 2016
@adrianba adrianba Remove issue #48 label.
Fixes #48.

PR #162 refactored the supportedMethods and payment specific data
fields. Issue #3 discusses supporting multiple currencies and issue #4
discusses price per payment method and we should consider specific
proposals for those issues.

PR #162 replaces the `sequence<DOMString>` with
`sequence<PaymentMethodData>` so we now use objects.
63d1aa6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.