- From: Marcos Cáceres <notifications@github.com>
- Date: Thu, 03 May 2018 21:59:20 -0700
- To: w3c/payment-request <payment-request@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/payment-request/issues/145/386505992@github.com>
Weirdly, I thought I had already put together a proposal for this, but can't find it on Github. Here is another one. ## Proposal Note: I wrote the following in such a way that we can just spin off a separate "Payment Request API: Coupons" spec. That way, this doesn't need to block on the main Payment Request API spec. It also makes it easier to shop around. ## Additions to `PaymentOptions` dictionary ```JS partial dictionary PaymentOptions { boolean requestCoupon; } ``` ### `requestCoupon` member Indicates that the merchant allows a coupon to be applied during request for payment. ## Additions to `PaymentDetailsUpdate` dictionary ```JS partial dictionary PaymentDetailsUpdate { DOMString couponCode; boolean couponAccepted; CouponErrors couponErrors; } ``` ### `couponCode` member Serves as a placeholder coupon, which gets pre-populated in the payment sheet. For example: ```JS // fill it in, but don't apply it request.show({ couponCode: "SPRING-SALE" }); // Show it, and apply it! request.show({ couponCode: "SPRING-SALE", couponAccepted: true, }); ``` ### `couponAccepted` member Tells the browser to stop allowing the user to change the coupon code, and signal to the user that the code was accepted. For example: ```JS ev.updateWith({ couponCode: "SPRING-SALE", couponAccepted: true, }); ``` ### `couponErrors` member Allows the merchant to signal errors related to the coupon code. For example: ```JS ev.updateWith({ couponErrors: { code: "Code already used." }, }); ``` ## `CouponErrors` dictionary ```JS dictionary CouponErrors { DOMString code; } ``` ### `code` member The error corresponding to this particular code. See `couponErrors` member for example. ## Additions to `PaymentRequest` interface ```JS partial interface PaymentRequest { attribute EventHandler oncouponchange; readonly attribute DOMString? couponCode; } ``` ### `oncouponchange` attribute Fires when the user changes the coupon. ### `couponCode` attribute Allows merchants to access the updated coupon code during the request for payment. ### Additions to `PaymentResponse` interface ```JS partial interface PaymentResponse { readonly attribute DOMString? couponCode; } ``` ### `couponCode` attribute Allows merchants to access the updated coupon code in the response. ## Example of usage ```JS async function doPaymentRequest() { const options = { requestCoupon: true }; const request = new PaymentRequest(methods, details, options); request.oncouponchange = ev => { const promise = applySweetSweetSavings(request, details, ev); ev.updateWith(promise); }; const response = await request.show(); //... await response.complete("success"); // post it somewhere, including the `couponCode` applied fetch("/invoices", { method: "POST", body: JSON.stringify(response.toJSON()), }); } async function applySweetSweetSavings({ couponCode }, { displayItems }) { const couponErrors = await validateCouponCode(couponCode); if (couponErrors) { return { couponErrors }; } // It's good, update total, add display item, whatever... const { newTotal, additionalDisplayItem } = applySweetSavings(couponCode); return { couponAccepted: true, total: newTotal, displayItems: [...displayItems, additionalDisplayItem].flatten(), }; } ``` Thoughts? -- 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/payment-request/issues/145#issuecomment-386505992
Received on Friday, 4 May 2018 04:59:43 UTC