From cd6163abbe24dfe74e3f755188f8556e79af93ec Mon Sep 17 00:00:00 2001 From: grekinsky Date: Tue, 19 Feb 2019 12:24:21 -0600 Subject: [PATCH 1/4] Use latest Token sdk API and fix destination --- app/src/main/resources/script.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/resources/script.js b/app/src/main/resources/script.js index 25f2ef3..73d393c 100644 --- a/app/src/main/resources/script.js +++ b/app/src/main/resources/script.js @@ -47,14 +47,17 @@ function createPopupButton() { // clean up instances clean(); + var Token = new window.Token({ + env: 'sandbox', + }); // create TokenPopupController to handle Popup messages - tokenController = window.Token.createPopupController(); + tokenController = Token.createPopupController(); // get button placeholder element var element = document.getElementById(elementId); // create the button - button = window.Token.createTokenButton(element, { + button = Token.createTokenButton(element, { label: "Popup Token Quick Checkout", }); @@ -98,9 +101,9 @@ function getTokenRequestUrl(done) { var data = $.param({ merchantId: 'Merchant 123', amount: 4.99, - currency: 'EUR', + currency: 'GBP', description: 'Book Purchase', - destination: '{"sepa":{"iban":"DE16700222000072880129"}}' + destination: '{"fasterPayments":{"sortCode":"123456","accountNumber":"12345678"}}' }); // Define what happens on successful data submission From 0ffbb8c0cce6b2facd8201d11ad695df1eb007df Mon Sep 17 00:00:00 2001 From: grekinsky Date: Tue, 19 Feb 2019 16:01:32 -0600 Subject: [PATCH 2/4] Change redirect to response body --- app/src/main/java/io/token/sample/Application.java | 9 +++++---- app/src/main/resources/script.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/token/sample/Application.java b/app/src/main/java/io/token/sample/Application.java index 4658b88..d2bab55 100644 --- a/app/src/main/java/io/token/sample/Application.java +++ b/app/src/main/java/io/token/sample/Application.java @@ -89,10 +89,11 @@ public static void main(String[] args) throws IOException { //generate Token Request URL to redirect to String tokenRequestUrl = tokenIO.generateTokenRequestUrl(requestId); - //send a 302 Redirect - res.status(302); - res.redirect(tokenRequestUrl); - return null; + + //send a 200 with tokenRequestUrl body + res.status(200); + res.type("text/plain"); + return tokenRequestUrl; }); Spark.get("/redeem", (req, res) -> { diff --git a/app/src/main/resources/script.js b/app/src/main/resources/script.js index 73d393c..4985fda 100644 --- a/app/src/main/resources/script.js +++ b/app/src/main/resources/script.js @@ -110,7 +110,7 @@ function getTokenRequestUrl(done) { XHR.addEventListener("load", function(event) { // execute callback once response is received if (event.target.status === 200) { - done(event.target.responseURL); + done(event.target.responseText); } }); From 0447849d95d901d99984226d044a0fd9f4c0f37b Mon Sep 17 00:00:00 2001 From: grekinsky Date: Wed, 27 Feb 2019 18:28:38 -0600 Subject: [PATCH 3/4] Add parseTokenRequestCallbackUrl --- .../main/java/io/token/sample/Application.java | 18 ++++++++++++++++-- app/src/main/resources/script.js | 16 ++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/token/sample/Application.java b/app/src/main/java/io/token/sample/Application.java index d2bab55..64167c5 100644 --- a/app/src/main/java/io/token/sample/Application.java +++ b/app/src/main/java/io/token/sample/Application.java @@ -12,6 +12,7 @@ import io.token.Member; import io.token.TokenIO; import io.token.TokenRequest; +import io.token.TokenRequestCallback; import io.token.TransferTokenBuilder; import io.token.proto.ProtoJson; import io.token.proto.common.account.AccountProtos.BankAccount; @@ -66,6 +67,10 @@ public static void main(String[] args) throws IOException { Spark.post("/transfer", (req, res) -> { Map formData = parseFormData(req.body()); + // Generate Nonce and store it in cookie session + String nonce = generateNonce(); + res.cookie("session.nonce", nonce, 24 * 60 * 60 * 1000); // 24h + BankAccount destination = ProtoJson.fromJson( formData.get("destination"), BankAccount.newBuilder()); @@ -88,7 +93,8 @@ public static void main(String[] args) throws IOException { String requestId = merchantMember.storeTokenRequest(request); //generate Token Request URL to redirect to - String tokenRequestUrl = tokenIO.generateTokenRequestUrl(requestId); + String tokenRequestUrl = + tokenIO.generateTokenRequestUrl(requestId, "", nonce); //send a 200 with tokenRequestUrl body res.status(200); @@ -97,7 +103,15 @@ public static void main(String[] args) throws IOException { }); Spark.get("/redeem", (req, res) -> { - String tokenId = req.queryMap("tokenId").value(); + // Get Nonce from cookie session + String nonce = req.cookie("session.nonce"); + + String callbackUrl = req.scheme() + "://" + req.host() + req.uri() + "?" + req.raw().getQueryString(); + + TokenRequestCallback callback = tokenIO.parseTokenRequestCallbackUrl(callbackUrl, nonce); + + String tokenId = callback.getTokenId(); + //get the token and check its validity Token token = merchantMember.getToken(tokenId); diff --git a/app/src/main/resources/script.js b/app/src/main/resources/script.js index 4985fda..258d7ff 100644 --- a/app/src/main/resources/script.js +++ b/app/src/main/resources/script.js @@ -4,6 +4,11 @@ var elementId = "tokenPayBtn"; var tokenController; var button; +// Client side Token object for creating the Token button, handling the popup, etc +var Token = new window.Token({ + env: 'sandbox', +}); + function clean() { if (button) { button.destroy(); @@ -21,13 +26,13 @@ function createRedirectButton() { clean(); // create TokenPopupController to handle Popup messages - tokenController = window.Token.createRedirectController(); + tokenController = Token.createRedirectController(); // get button placeholder element var element = document.getElementById(elementId); // create the button - button = window.Token.createTokenButton(element, { + button = Token.createTokenButton(element, { label: "Redirect Token Quick Checkout", }); @@ -47,9 +52,6 @@ function createPopupButton() { // clean up instances clean(); - var Token = new window.Token({ - env: 'sandbox', - }); // create TokenPopupController to handle Popup messages tokenController = Token.createPopupController(); @@ -79,7 +81,9 @@ function createPopupButton() { tokenController.onSuccess(function(data) { // Success Callback // build success URL var successURL = "/redeem" - + "?tokenId=" + window.encodeURIComponent(data.tokenId); + + "?signature=" + window.encodeURIComponent(data.signature) + + "&state=" + window.encodeURIComponent(data.state) + + "&tokenId=" + window.encodeURIComponent(data.tokenId); // navigate to success URL window.location.assign(successURL); }); From 2dae7010f755ea4d5653fd84319d6a4f8dac8dda Mon Sep 17 00:00:00 2001 From: grekinsky Date: Tue, 5 Mar 2019 12:34:18 -0600 Subject: [PATCH 4/4] Revert "Add parseTokenRequestCallbackUrl" This reverts commit 0447849d95d901d99984226d044a0fd9f4c0f37b. --- .../main/java/io/token/sample/Application.java | 18 ++---------------- app/src/main/resources/script.js | 16 ++++++---------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/io/token/sample/Application.java b/app/src/main/java/io/token/sample/Application.java index 64167c5..d2bab55 100644 --- a/app/src/main/java/io/token/sample/Application.java +++ b/app/src/main/java/io/token/sample/Application.java @@ -12,7 +12,6 @@ import io.token.Member; import io.token.TokenIO; import io.token.TokenRequest; -import io.token.TokenRequestCallback; import io.token.TransferTokenBuilder; import io.token.proto.ProtoJson; import io.token.proto.common.account.AccountProtos.BankAccount; @@ -67,10 +66,6 @@ public static void main(String[] args) throws IOException { Spark.post("/transfer", (req, res) -> { Map formData = parseFormData(req.body()); - // Generate Nonce and store it in cookie session - String nonce = generateNonce(); - res.cookie("session.nonce", nonce, 24 * 60 * 60 * 1000); // 24h - BankAccount destination = ProtoJson.fromJson( formData.get("destination"), BankAccount.newBuilder()); @@ -93,8 +88,7 @@ public static void main(String[] args) throws IOException { String requestId = merchantMember.storeTokenRequest(request); //generate Token Request URL to redirect to - String tokenRequestUrl = - tokenIO.generateTokenRequestUrl(requestId, "", nonce); + String tokenRequestUrl = tokenIO.generateTokenRequestUrl(requestId); //send a 200 with tokenRequestUrl body res.status(200); @@ -103,15 +97,7 @@ public static void main(String[] args) throws IOException { }); Spark.get("/redeem", (req, res) -> { - // Get Nonce from cookie session - String nonce = req.cookie("session.nonce"); - - String callbackUrl = req.scheme() + "://" + req.host() + req.uri() + "?" + req.raw().getQueryString(); - - TokenRequestCallback callback = tokenIO.parseTokenRequestCallbackUrl(callbackUrl, nonce); - - String tokenId = callback.getTokenId(); - + String tokenId = req.queryMap("tokenId").value(); //get the token and check its validity Token token = merchantMember.getToken(tokenId); diff --git a/app/src/main/resources/script.js b/app/src/main/resources/script.js index 258d7ff..4985fda 100644 --- a/app/src/main/resources/script.js +++ b/app/src/main/resources/script.js @@ -4,11 +4,6 @@ var elementId = "tokenPayBtn"; var tokenController; var button; -// Client side Token object for creating the Token button, handling the popup, etc -var Token = new window.Token({ - env: 'sandbox', -}); - function clean() { if (button) { button.destroy(); @@ -26,13 +21,13 @@ function createRedirectButton() { clean(); // create TokenPopupController to handle Popup messages - tokenController = Token.createRedirectController(); + tokenController = window.Token.createRedirectController(); // get button placeholder element var element = document.getElementById(elementId); // create the button - button = Token.createTokenButton(element, { + button = window.Token.createTokenButton(element, { label: "Redirect Token Quick Checkout", }); @@ -52,6 +47,9 @@ function createPopupButton() { // clean up instances clean(); + var Token = new window.Token({ + env: 'sandbox', + }); // create TokenPopupController to handle Popup messages tokenController = Token.createPopupController(); @@ -81,9 +79,7 @@ function createPopupButton() { tokenController.onSuccess(function(data) { // Success Callback // build success URL var successURL = "/redeem" - + "?signature=" + window.encodeURIComponent(data.signature) - + "&state=" + window.encodeURIComponent(data.state) - + "&tokenId=" + window.encodeURIComponent(data.tokenId); + + "?tokenId=" + window.encodeURIComponent(data.tokenId); // navigate to success URL window.location.assign(successURL); });