- From: Zach Koch <zkoch@google.com>
- Date: Thu, 11 Feb 2016 11:19:00 +0000
- To: Adrian Hope-Bailie <adrian@hopebailie.com>
- Cc: Dave Longley <dlongley@digitalbazaar.com>, Rouslan Solomakhin <rouslan@google.com>, Ian Jacobs <ij@w3.org>, Payments WG <public-payments-wg@w3.org>, Manu Sporny <msporny@digitalbazaar.com>
- Message-ID: <CAOsZg65zCbrxX9d=_x6wTwukbJWbm3Gz15rfEpMDv8Rt0x9jTA@mail.gmail.com>
Hi all - I've been mulling this over the last week, and I've posted some thoughts below. Hopefully we can talk more about this on today's call: * I don't think we should break this out into two separate APIs. I would still prefer a single API that developers can use in a consistent way to get the information necessary to finalize a transaction (i.e. payment credential, potentially a shipping address). For example, if I'm a game developer and I run an online store that sells both virtual goods and physical goods (apparel, card decks, etc), it's strange to me that in a pure virtual good flow I wouldn't use checkout() but in a physical good I would use checkout. There should just be a single paymentRequest (or checkout if we prefer that naming) API. * From an API perspective, I do think there is a nice level of cleanliness (not sure of the right word) to Dave's proposal and the way information is requested. I think we could potentially use this and it provides room for expansion later (e.g. request invoice, request favoriteColor). I've been traveling this week in Europe so I haven't had a lot of time to play around with the API, but perhaps we could do something like: paymentRequest = new PaymentRequest(...initialParams); paymentRequest .request('shippingAddress') .show() .then(function(paymentResponse) { }); I also would prefer an event-based mechanism for thinks like shippingOptionChange and addressChange. It just feels cleaner. * To Adrian's point about UI, I'm not sure I agree with that statement. It could also be that I'm misunderstanding, but there are many UI patterns that could be taken advantage of to resolve any issues. But more importantly, I want to make clear that we aren't necessarily advocating for "a single UI screen" but instead a consistent user experience. These aren't necessarily the same thing. Zach On Thu, Feb 11, 2016 at 8:30 AM, Adrian Hope-Bailie <adrian@hopebailie.com <javascript:_e(%7B%7D,'cvml','adrian@hopebailie.com');>> wrote: > Dave has some time on today's call to discuss his proposal which will give > him an opportunity to expand on some of the motivations and design > decisions. > > One thing that I think we need to consider is that, whether we use this > API or not, it is almost impossible to present a single UI to the user for > selecting shipping details and also payment app. > > The demo UI from AdrianB shows all of these in a single UI but that won't > work with the architecture we have today. Today we combine the set of > supported payment methods and the amount in the payment request so it > follows that the user can only be prompted to select a payment app (based > on payment method) after the amount has been finalized. > > If we feel like the website needs more control over this flow (select > payment app and then provide amount separately) we need to consider how we > can acheive that without compromising user privacy (i.e. we don't allow > websites to take the user through the app selection process without > actually requesting a payment) > > On 11 February 2016 at 03:16, Dave Longley <dlongley@digitalbazaar.com > <javascript:_e(%7B%7D,'cvml','dlongley@digitalbazaar.com');>> wrote: > >> On 02/10/2016 02:39 PM, Rouslan Solomakhin wrote: >> > Hi Manu, >> > >> > I've looked over the Checkout spec. It's a great start. There's one >> > issue to resolve. >> > >> > The browser can signal the merchant only by resolving the promise that >> > calls finishCheckout() in your examples. In the course of a checkout, >> > it's conceivable that the user selects shipping option 1, then shipping >> > option 2, then shipping option 1 again. Your examples show >> > recalculations of the line items with a call to >> > checkout.send('paymentItem', checkoutDetails.items) when this happens. >> > The checkout.send() function is synchronous. After calling it, the code >> > steps down to the line that requests the payment. However, the user has >> > not finished selection their payment options yet. >> > >> > I can see 2 ways to resolve this issue from the top of my head: >> > >> > 1. checkoutDetails should have a "finished" boolean field. This is set >> > to false when user changes shipping options. It is set to true when >> > the user clicks "Buy". The merchant has to check this field. >> > >> > if (!checkoutDetails.finished) >> > checkout.continue().then(finishCheckout); >> > else >> > checkout.finish(...); >> > >> > 2. Fire events instead of resolving a promise when the user selects a >> > shipping option. Usage of your API would change slightly. >> > >> > var checkout = new Checkout(); >> > checkout >> > .onEvent('shippingOptionChange', recalculateLineItems) >> > .show() >> > .then(finishCheckout); >> > >> > // Returns line items with updated price/tax/etc based on the >> > options that the user has selected in checkoutDetails. >> > function recalculateLineItems(checkoutDetails) { >> > ... >> > } >> > >> > // Requests the payment from the browser. >> > function finishCheckout(checkoutDetails) { >> > checkout.finish(...); >> > } >> > >> > >> > I prefer option 2, because it's harder for the merchant to accidently >> > charge you before you've finished selecting your payment and shipping >> > options. What do you think? >> >> The merchant can't accidentally charge you -- they need to receive a >> payment acknowledgement first. The payment acknowledgement won't arrive >> until the user is taken to the appropriate payment app, which should >> only happen after they've clicked "Buy". So I like option 1 better, >> which keeps the flow control more obvious. >> >> >> -- >> Dave Longley >> CTO >> Digital Bazaar, Inc. >> >> >
Received on Thursday, 11 February 2016 11:19:31 UTC