├── .gitattributes ├── 9781484251836.jpg ├── Ch2 ├── errorhandling │ ├── errorhandling.css │ └── errorhandling.js ├── firstcheckout │ ├── firstcheckout.css │ ├── firstcheckout.html │ └── firstcheckout.js └── setup │ └── index.html ├── Ch3 ├── change order │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js ├── currencies │ ├── code - finished version │ │ ├── css │ │ │ └── styles.css │ │ ├── index.html │ │ └── js │ │ │ └── payment.js │ ├── css │ │ └── styles.css │ ├── images │ │ ├── chillis.png │ │ ├── united-kingdom.png │ │ └── united-states.png │ ├── index.html │ └── js │ │ ├── payment - finished version.js │ │ └── payment.js ├── discounts │ ├── code - finished version │ │ ├── css │ │ │ └── styles.css │ │ ├── index.html │ │ └── js │ │ │ └── payment.js │ ├── css │ │ └── styles.css │ ├── images │ │ └── chillis.png │ ├── index.html │ └── js │ │ └── payment.js ├── extra info │ ├── code - finished version │ │ ├── css │ │ │ └── styles.css │ │ ├── index.html │ │ └── js │ │ │ ├── payment.js │ │ │ └── scripts.js │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js ├── iframe │ ├── code - finished version │ │ └── iframe.html │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js ├── next step │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment - finished version.js │ │ └── scripts.js └── options │ ├── css │ └── styles.css │ ├── favicon.png │ ├── images │ ├── background.png │ ├── black.png │ ├── brown.png │ ├── hamburger.png │ ├── purple.png │ ├── recycling-bin.png │ ├── red.png │ ├── shopping-basket.png │ └── yellow.png │ ├── index.html │ └── js │ ├── payment.js │ └── scripts.js ├── Ch4 ├── basic options │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment - completed version.js │ │ ├── payment.js │ │ └── scripts.js ├── expand options │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment - completed version.js │ │ ├── payment.js │ │ └── scripts.js ├── restrictions │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment - completed version.js │ │ ├── payment.js │ │ └── scripts.js ├── spot errors │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js └── update shipping │ ├── css │ └── styles.css │ ├── favicon.png │ ├── images │ ├── background.png │ ├── black.png │ ├── brown.png │ ├── hamburger.png │ ├── purple.png │ ├── recycling-bin.png │ ├── red.png │ ├── shopping-basket.png │ └── yellow.png │ ├── index.html │ └── js │ ├── payment - completed version.js │ ├── payment.js │ └── scripts.js ├── Ch5 ├── bobpay │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── all.js │ │ ├── payment.js │ │ └── scripts.js ├── charges │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js ├── nobob │ ├── css │ │ └── styles.css │ ├── favicon.png │ ├── images │ │ ├── background.png │ │ ├── black.png │ │ ├── bobpay.png │ │ ├── brown.png │ │ ├── hamburger.png │ │ ├── purple.png │ │ ├── recycling-bin.png │ │ ├── red.png │ │ ├── shopping-basket.png │ │ └── yellow.png │ ├── index.html │ └── js │ │ ├── payment.js │ │ └── scripts.js └── stripe │ ├── css │ └── stripe.css │ ├── example index.html │ ├── images │ └── chillis.png │ ├── index.html │ └── js │ ├── all.js │ └── scripts.js ├── Ch6 └── coffee │ ├── css │ ├── dart-sass │ │ ├── dart-sass.bat │ │ ├── sass.bat │ │ └── src │ │ │ ├── DART_LICENSE │ │ │ ├── SASS_LICENSE │ │ │ ├── dart.exe │ │ │ └── sass.dart.snapshot │ ├── styles-BACKUP.css │ ├── styles-sass.scss │ ├── styles.css │ └── styles.css.map │ ├── favicon.png │ ├── images │ ├── black.png │ ├── brown.png │ ├── latte.svg │ ├── long.svg │ ├── purple.png │ ├── recycling-bin.png │ ├── red.png │ ├── shopping-basket.png │ ├── short.svg │ └── yellow.png │ ├── index.html │ └── js │ ├── Examples │ ├── payment - basic.js │ ├── payment - bobpay.js │ ├── payment - charges.js │ ├── payment - errors.js │ └── payment - shipping.js │ ├── payment - completed version.js │ └── scripts.js ├── Ch7 ├── cookies │ ├── css │ │ ├── bootstrap.min.css │ │ └── styles.css │ ├── fonts │ │ └── glyphicons-halflings-regular.woff2 │ ├── images │ │ ├── cbakewell.png │ │ ├── coconut.png │ │ ├── dark-choc.png │ │ ├── double-choc.png │ │ ├── jaffa.png │ │ ├── oatmeal-rasin.png │ │ ├── rasberry-white-choc.png │ │ ├── toffee.png │ │ └── white-choc.png │ ├── index.html │ └── js │ │ ├── bootstrap.min.js │ │ ├── script.js │ │ └── vue.min.js └── geolocate │ ├── css │ ├── bootstrap.min.css │ └── styles.css │ ├── fonts │ └── glyphicons-halflings-regular.woff2 │ ├── images │ ├── cbakewell.png │ ├── coconut.png │ ├── dark-choc.png │ ├── double-choc.png │ ├── jaffa.png │ ├── oatmeal-rasin.png │ ├── rasberry-white-choc.png │ ├── toffee.png │ └── white-choc.png │ ├── index.html │ └── js │ ├── bootstrap.min.js │ ├── jquery.qrcode.min.js │ ├── script.js │ └── vue.min.js ├── Ch8 └── basiccard - completed version │ ├── app.js │ ├── css │ └── style.css │ ├── favicon.ico │ ├── images │ └── coffee.png │ ├── index.html │ ├── installer.js │ ├── manifest.json │ └── testing │ ├── coffee.png │ ├── css │ └── style.css │ ├── favicon.ico │ ├── js │ ├── merchant.js │ └── util.js │ └── test.html ├── Contributing.md ├── LICENSE.txt ├── README.md └── errata.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /9781484251836.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Apress/checking-out-with-the-payment-request-API/5044c1034eeddc12bc79d8b9cb5eacf6b9510bd7/9781484251836.jpg -------------------------------------------------------------------------------- /Ch2/errorhandling/errorhandling.css: -------------------------------------------------------------------------------- 1 | #message { 2 | float: left; 3 | margin-top: 10px; 4 | width: 320px; 5 | display: none; 6 | padding: 10px; 7 | font-weight: bold; 8 | border-radius: 5px; 9 | } 10 | 11 | #message.success { 12 | background-color: #ace1af; 13 | color: #008000; 14 | display: block; 15 | } 16 | 17 | #message.success > span { 18 | float: left; 19 | font-size: 30px; 20 | color: #008000; 21 | padding: 0px 10px; 22 | } 23 | 24 | #message.failure { 25 | background-color: #FFD1DC; 26 | color: #ff0000; 27 | display: block; 28 | } 29 | 30 | #message.failure > span { 31 | float: left; 32 | font-size: 30px; 33 | color: #ff0000; 34 | padding: 0px 10px; 35 | } 36 | 37 | #message.info { 38 | background-color: #FCF75E; 39 | display: block; 40 | color: #000000; 41 | line-height: 20px; 42 | } 43 | 44 | #message.info > span { 45 | float: left; 46 | font-size: 30px; 47 | color: #000000; 48 | padding: 0px 10px; 49 | } 50 | -------------------------------------------------------------------------------- /Ch2/errorhandling/errorhandling.js: -------------------------------------------------------------------------------- 1 | function displaySuccess() { 2 | document.getElementById("message").classList.add("success"); 3 | document.getElementById("message").innerHTML = "\u2714 Payment received - thanks for your order!"; 4 | } 5 | 6 | function displayError() { 7 | document.getElementById("message").classList.add("failure"); 8 | document.getElementById("message").innerHTML = "\u2716 There was a problem with payment"; 9 | } 10 | 11 | function displayCancel() { 12 | document.getElementById("message").classList.add("info"); 13 | document.getElementById("message").innerHTML = "🛈Request has been cancelled"; 14 | } 15 | 16 | function displayMessage(mesg) { 17 | document.getElementById("message").classList.add("info"); 18 | document.getElementById("message").innerHTML = "🛈" + mesg; 19 | } 20 | 21 | // ----------------------------------------------------------------- 22 | 23 | if (request.canMakePayment) { 24 | request.canMakePayment().then(function(result) { 25 | if (result) { 26 | //console.log(request); 27 | request.show().then(function(result) { 28 | result.complete('success').then(function() { 29 | console.log(JSON.stringify(result)); 30 | displaySuccess(); 31 | }); 32 | }).catch(function(err) { 33 | if (err.message == "Request cancelled") { 34 | displayCancel(); 35 | } else { 36 | console.error(err.message); 37 | displayError(); 38 | } 39 | }); 40 | } else { 41 | console.log('Cannot make payment'); 42 | displayMessage("Sorry - no valid payment methods available"); 43 | } 44 | }).catch(function(err) { 45 | console.log(request, err); 46 | }); 47 | } 48 | 49 | // ----------------------------------------------------------------- 50 | 51 | /* time out requests after 20 mins of inactivity */ 52 | var paymentTimeout = window.setTimeout(function() { 53 | window.clearTimeout(paymentTimeout); 54 | request.abort().then(function() { 55 | document.getElementById("message").classList.add("info"); 56 | document.getElementById("message").innerHTML = "🛈 Request has been timed out due to inactivity"; 57 | console.log('Payment timed out after 20 mins.'); 58 | }).catch(function() { 59 | console.log('Unable to abort, because the user is currently in the process of paying.'); 60 | }); 61 | }, 20000 * 60); /* 20 minutes */ 62 | -------------------------------------------------------------------------------- /Ch2/firstcheckout/firstcheckout.css: -------------------------------------------------------------------------------- 1 | body, html { 2 | background-color: #fff; 3 | height: 100%; 4 | width: 335px; 5 | font-family: 'Montserrat', sans-serif; 6 | margin: 0 auto; 7 | } 8 | 9 | img, div { 10 | margin: 0 auto; 11 | display: block; 12 | } 13 | 14 | div { 15 | margin-bottom: 20px; 16 | } 17 | 18 | h1 { 19 | display: block; 20 | border-bottom: 1px solid #c21807; 21 | } 22 | 23 | h3, label { 24 | font-weight: 700; 25 | font-size: 23px; 26 | } 27 | 28 | img { 29 | width: 261px; 30 | } 31 | 32 | input { 33 | width: 50px; 34 | float: right; 35 | } 36 | 37 | span { 38 | float: right; 39 | color: #c21807; 40 | } 41 | 42 | .pay-button { 43 | background-color: white; 44 | border: none; 45 | border-radius: 24px; 46 | cursor: pointer; 47 | font-size: 16px; 48 | padding: 16px 32px; 49 | width: 170px; 50 | background-color: #c21807; 51 | color: #ffffff; 52 | letter-spacing: 2px; 53 | font-weight: 700; 54 | margin: 20px 0 0 170px; 55 | display: block; 56 | } 57 | 58 | .pay-button:hover { 59 | background-color: #f31e09; 60 | } 61 | 62 | .pay-button:focus { 63 | outline: 0; 64 | } 65 | 66 | .currency { 67 | margin-top: -50px; 68 | margin-left: 240px; 69 | position: absolute; 70 | color: #c21807; 71 | } 72 | 73 | #subTotalText { 74 | margin-top: -50px; 75 | float: right; 76 | color: #c21807; 77 | } 78 | 79 | #message { 80 | float: left; 81 | margin-top: 0px; 82 | position: absolute; 83 | display: none; 84 | } -------------------------------------------------------------------------------- /Ch2/firstcheckout/firstcheckout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
22 |
23 | 24 | 25 |Cart is empty | 42 ||||
45 | | Cart Total | 46 |{{Total | formatCurrency}} | 47 |
Have any special requirements? You still have time to let us know:
59 | 60 | 61 |22 |
23 | 24 | 25 |Cart is empty | 42 ||||
45 | | Cart Total | 46 |{{Total | formatCurrency}} | 47 |
Have any special requirements? You still have time to let us know:
59 | 60 | 61 |This is a simple payment handler for "CoffeePay". It does not open a window for user interaction.
17 |Checking whether the payment handler is installed...
18 |The payment handler is installed | Test it out.
20 |N/A
N/A
N/A
N/A
Installing...
34 |Uninstalling...
35 | 36 |The payment handler is not installed | Verify.
38 | 39 |View the source code:
45 |