- From: Dave Longley <dlongley@digitalbazaar.com>
- Date: Wed, 10 Feb 2016 20:16:20 -0500
- To: Rouslan Solomakhin <rouslan@google.com>, Ian Jacobs <ij@w3.org>
- Cc: public-payments-wg@w3.org, Manu Sporny <msporny@digitalbazaar.com>
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 01:16:48 UTC