Re: How to run Node JS Sample Code for MLE

shameem
Visa Employee

How to run Node JS Sample Code for MLE

In this “How-to” guide, we will show you how to test MLE (Message Level Encryption) enabled APIs using Node JS.

 

Important Links:

 

Enable MLE for the API(s) you are interested in.

 

Login to your Visa Developer Dashboard and go to your project, you should see something like this:

 

2020-11-11_09-45-12.png

 

Enable the APIs for which MLE needs to be active in VDP by toggling the API for which MLE needs to be enforced.

 

In this example, we will enable MLE for Funds Transfer API And Query API as below:

 

2020-11-11_09-46-41.png

 

 

How to get credentials

 

You can obtain your project credentials by browsing the left side navigation menu of your project and click on “Credentials”.

 

2020-11-11_11-25-10.png

 

Next step we will create a Key-ID by clicking on the Generate Key-ID button.

 

2020-11-11_11-29-02.png

 

After you have clicked the button, you will get Key-ID. Copy the Key-ID for your reference.

The Key-ID will look like this: 41d9f2a1-xxxx-4xxx-b40c-a0480c2xxxxx

 

2020-11-11_11-30-49.png

 

The next step is to add a CSR (Certificate Signing Request). Click on the link "Add CSR" .   

 

You will be prompt to submit a Certificate Signing Request. 

 

2020-11-11_11-32-46.png

 

We have option to Generate a CSR for me (default) or submit your own. In this example we will use the Generate a CSR for me (default) and Click Confirm button.

 

After submitting the request, you will be prompt to download the Certificate/Copy Private Key. 

 

2020-11-11_11-34-26.png

 

After you have downloaded the private key, check the box "I confirm that I've downloaded my certificate key" and click continue. You will see the Status change to "Active".

 

 

Expand the Key-ID and you will see the Server Encryption Certificate and Client Encryption Certificate.

Download both certificates and save it.

 

2020-11-11_11-36-33.png

To be able to make an API call with MLE, you need to have the following

  • Server Encryption Certificate
  • Key-ID
  • Certificate Private Key

 

How to run Node JS Sample Code for MLE

 

 

Step 1 - Create a new project on WebStorm

 

  • Launch WebStorm, on the WebStorm Welcome Screen, click Create New Project.
  • In the New Project wizard, select Node.js Express App from the list on the left, provide the project Location and click Create.
  • Create a new Javascript file and named it “mle_oct

 

Refer to How to run Node JS Sample Code using the Hello World API and Mutual SSL for how to create a project with WebStorm and testing VISA APIs using Mutual SSL

 

 

Step 2 - Copy the below sample code to the “mle_oct.js” file

 

  • Install all the required dependencies when prompt by WebStorm. Alternatively you can use NPM (Node Package Manager) to download and install the dependencies.
  • Set the below parameters:

 

const username = '<YOUR USER ID>';
const password = '<YOUR PASSWORD>';


const key = '<YOUR PRIVATE KEY PATH>';
const cert = '<YOUR CLIENT CERTIFICATE PATH>';

const mleServerPublicCertificate = '<YOUR MLE SERVER PUBLIC CERTIFICATE PATH>';
const mleClientPrivateKey = '<YOUR MLE CLIENT PRIVATE KEY PATH>';
const keyId = '<YOUR KEY ID>';

 

 

 

 

 

/*
 * (c) Copyright 2018 - 2020 Visa. All Rights Reserved.**
 *
 * NOTICE: The software and accompanying information and documentation (together, the “Software”) remain the property of and are proprietary to Visa and its suppliers and affiliates. The Software remains protected by intellectual property rights and may be covered by U.S. and foreign patents or patent applications. The Software is licensed and not sold.*
 *
 *  By accessing the Software you are agreeing to Visa's terms of use (developer.visa.com/terms) and privacy policy (developer.visa.com/privacy).In addition, all permissible uses of the Software must be in support of Visa products, programs and services provided through the Visa Developer Program (VDP) platform only (developer.visa.com). **THE SOFTWARE AND ANY ASSOCIATED INFORMATION OR DOCUMENTATION IS PROVIDED ON AN “AS IS,” “AS AVAILABLE,” “WITH ALL FAULTS” BASIS WITHOUT WARRANTY OR  CONDITION OF ANY KIND. YOUR USE IS AT YOUR OWN RISK.** All brand names are the property of their respective owners, used for identification purposes only, and do not imply product endorsement or affiliation with Visa. Any links to third party sites are for your information only and equally  do not constitute a Visa endorsement. Visa has no insight into and control over third party content and code and disclaims all liability for any such components, including continued availability and functionality. Benefits depend on implementation details and business factors and coding steps shown are exemplary only and do not reflect all necessary elements for the described capabilities. Capabilities and features are subject to Visa’s terms and conditions and may require development,implementation and resources by you based on your business and operational details. Please refer to the specific API documentation for details on the requirements, eligibility and geographic availability.*
 *
 * This Software includes programs, concepts and details under continuing development by Visa. Any Visa features,functionality, implementation, branding, and schedules may be amended, updated or canceled at Visa’s discretion.The timing of widespread availability of programs and functionality is also subject to a number of factors outside Visa’s control,including but not limited to deployment of necessary infrastructure by issuers, acquirers, merchants and mobile device manufacturers.*
 *
 */

const express = require('express');
const https = require('https');
const request = require('request');
const app = express();
const bodyParser = require('body-parser');
const path = require('path');
const jose = require('node-jose');
const fs = require('fs');

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(express.json());
app.use(bodyParser.urlencoded({extended: true}));

const hostname = 'sandbox.api.visa.com';
const port = 443;
const username = '<YOUR USER ID>';
const password = '<YOUR PASSWORD>';
const key = '<YOUR PRIVATE KEY PATH>';
const cert = '<YOUR CLIENT CERTIFICATE PATH>';


const mleServerPublicCertificate = '<YOUR MLE SERVER PUBLIC CERTIFICATE PATH>';
const mleClientPrivateKey = '<YOUR MLE CLIENT PRIVATE KEY PATH>';
const keyId = '<YOUR KEY ID>';

app.get('/', (req, res) => {

    var options = getOptions();
    options.headers.keyId = keyId;
    options.uri = 'https://sandbox.api.visa.com/visadirect/fundstransfer/v1/pushfundstransactions';
    options.method = 'POST';
    parameters = getParameters();
    jose.JWK.asKey(fs.readFileSync(mleServerPublicCertificate), 'PEM', {
        "kty": "RSA",
        "alg": "RSA-OAEP-256",
        "kid": keyId,
        enc: "A128GCM",
        key_opts: ["wrapKey", "enc"]
    }).then(function (result) {
        console.log(parameters.payload);
        encryptionResult = jose.JWE.createEncrypt({
            format: 'compact',
            contentAlg: 'A128GCM',
            fields: {iat: Date.now()}
        }, result).update(JSON.stringify(parameters.payload)).final()
            .then(function (data) {
                options.body = {"encData": data.toString()};
                request.post(options, (err, response, body) => {
                    if (err) {
                        return console.log(err);
                    }
                    console.log(`Status: ${response.statusCode}`);
                    console.log(`Encrypted Response: ${JSON.stringify(response.body)}`);

                    jose.JWK.asKey(fs.readFileSync(mleClientPrivateKey), 'PEM').then(function (result) {
                        jose.JWE.createDecrypt(result).decrypt(response.body.encData, {
                            contentAlg: 'A128GCM',
                            alg: 'RSA-OAEP-256'
                        }).then(function (decryptedResult) {
                            console.log(String(decryptedResult.plaintext));
                            options.uri = 'https://sandbox.api.visa.com/visadirect/v1/transactionquery?acquiringBIN=408999&transactionIdentifier=' + JSON.parse(decryptedResult.plaintext).transactionIdentifier;
                            request.get(options, (err, response, body) => {
                                if (err) {
                                    console.log(`Errored due to ${err}`);
                                }
                                console.log(`Status: ${response.statusCode}`);
                                console.log(`Encrypted Response: ${JSON.stringify(response.body)}`);
                            });
                            res.send(String(decryptedResult.plaintext));
                        });
                    });
                });
            }).catch(function (reason) {
                console.log('Encryption failed due to ');
                console.log(reason);
            });
    });
});

app.listen(3050, function () {
    console.log('Example app listening on port 3050.');
});

function getParameters() {
    const parameters = {
        "x-client-transaction-id": "1612321873781263",
        "Accept": "application/json",
        "Content-Type": "application/json"
    };
    parameters.payload = {
        "acquirerCountryCode": "840",
        "acquiringBin": "408999",
        "amount": "124.05",
        "businessApplicationId": "AA",
        "cardAcceptor": {
            "address": {
                "country": "USA",
                "county": "San Mateo",
                "state": "CA",
                "zipCode": "94404"
            },
            "idCode": "CA-IDCode-77765",
            "name": "Visa Inc. USA-Foster City",
            "terminalId": "TID-9999"
        },
        "localTransactionDateTime": Date.now(),
        "merchantCategoryCode": "6012",
        "pointOfServiceData": {
            "motoECIIndicator": "0",
            "panEntryMode": "90",
            "posConditionCode": "00"
        },
        "recipientName": "rohan",
        "recipientPrimaryAccountNumber": "4957030420210462",
        "retrievalReferenceNumber": "412770451018",
        "senderAccountNumber": "4957030420210454",
        "senderAddress": "901 Metro Center Blvd",
        "senderCity": "Foster City",
        "senderCountryCode": "124",
        "senderName": "Mohammed Qasim",
        "senderReference": "",
        "senderStateCode": "CA",
        "sourceOfFundsCode": "05",
        "systemsTraceAuditNumber": "451018",
        "transactionCurrencyCode": "USD",
        "transactionIdentifier": "381228649430015"
    };

    return parameters;
}

function getOptions() {
    const options = {
        hostname: hostname,
        port: port,
        key: fs.readFileSync(key),
        cert: fs.readFileSync(cert),
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Authorization': 'Basic ' + new Buffer(username + ':' + password).toString('base64')
        },

        json: true
    };
    options.agent = new https.Agent(options);
    return options;
}

 

 

 

 

Step 4 - Compile Your Code 

 

 

Want more? Join the Visa Developer Community to get alerts on the latest tutorials, guides and new developer resources. Stay tuned for more in the series. 

10 REPLIES 10
jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi Support, @shameem 

I'm trying to implement a V1 authorization request using the nodejs MLE sample code you've provided.

But I'm facing an issue at the line highlghted below:

ERR_INVALID_ARG_TYPE.png

Nodejs server is returning this error: 
Error: Argument error, options.body.
...
at processImmediate (node:internal/timers:466:21) {
code: 'ERR_INVALID_ARG_TYPE'
Anyone has already faced this issue, please?
Thank you.
shameem
Visa Employee

Re: How to run Node JS Sample Code for MLE

Hi @jowilfrid ,

 

If the error happening before posting the request or while decrypting the response?

  • Could you please check the stacktrace where the error/exception is being thrown. 
  • If there any response after posting and was it logged.

Thank you

 

 

jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi @shameem

I hope you're doing well! and thank you for your quick answer.

I've found out the issue that was causing this error, so this issue is now resolved.

Currently I'm facing another issue about the decryption, below are the log, could you please advise?

----------------------------------

Status: 400
Encrypted Response: {"responseStatus":{"status":400,"code":"9123","severity":"ERROR","message":"Expected input credential was not present","info":""}}
C:\Users\yanso\Documents\PortfolioHtmlSite\monetiq-conseils\node_modules\node-jose\lib\jwe\decrypt.js:84
throw new Error("invalid input");
^

Error: invalid input
at JWEDecrypter.value (C:\Users\yanso\Documents\PortfolioHtmlSite\monetiq-conseils\node_modules\node-jose\lib\jwe\decrypt.js:84:15)
at monetiq-conseils\controllers\authorization.js:141:18
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)

------------------------------------

Below the sample code where I've highlighted the line causing the issue:

DecryptionIssue.png

For information, my sample is using :

  1. The user ID
  2. The password
  3. The MLE key ID
  4. The MLE public and private keys
  5. The SSL public and private keys. The csr and certificate have been generated on Visa platform.

Thank you for your help,

jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi @shameem,

Is there any news, please? This issue is blocker !

Can I share my sample, please?

Can we have a quick call?

Thank you so much!
shameem
Visa Employee

Re: How to run Node JS Sample Code for MLE

Hi @jowilfrid ,


"Expected input credential was not present" error is due to wrong credentials provided. In the Nodes Sample code, we are using two-way ssl with basic authentication.

 

Kindly ensure you are providing the correct username and password which can be found under your project (Credentials -> Two-Way SSL), and the client certificate.

 

For MLE, kindly ensure you are providing your MLE Key ID, and encryption is done using the server public (certificate) while decryption is performed using client private key.

 

Please double check the above and let us know if you're still facing issue.

 

Thank you

jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi @shameem, thank you for your quick answer!
What a pity! I can't load image, there is a message asking to verify if I'm not a robot but I can't see where I have to verify !

I've just checked the credentials in my project (Credentials -> Two-Way SSL).
1. MLE credentials
2. Two way SSL credentials
3. RSA private & public keys
They are all goods !
I'm using the RSA public and private keys generated on Visa plateform.

This is the log, I have on NodeJs:

--------------------------------------------------

Status: 400
Encrypted Response: {"responseStatus":{"status":400,"code":"9123","severity":"ERROR","message":"Expected input credential was not present","info":""}}

JWKBaseKeyObject {
keystore: JWKStore {},
length: 2048,
kty: 'RSA',
kid: '4db6ee73-3912-4471-9cad-63e9c0c19ed6',
use: '',
alg: ''
}

Does the keystore be empty?

This is a snippet code about the credentials settings:

const username = 'N3RCU5YQC2L2AS6IJ72M21ksadOEOtya2V6vJXRorpVa2ucjE'
const password = 'op5qNdJE65izTJctwh0'
const keyId = '6e6604f8-ce02-4456-b639-ce6b3dcb3888'
const RSA_PRIVATE_KEY = fs
.readFileSync(path.resolve(__dirname, '../credentials/privateKey.pem'))
.toString()

const RSA_CERTIFICATE = fs
.readFileSync(path.resolve(__dirname, '../credentials/clientCert.pem'))
.toString()

const options = {
uri: 'https://sandbox.api.visa.com/acs/v3/payments/authorizations',
method: 'POST',
port: 443,
privateKey: RSA_PRIVATE_KEY,
cert: RSA_CERTIFICATE,
json: true,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization:
'Basic ' + Buffer.from(username + ':' + password).toString('base64'),
},
}
Below The error I have:
Server is listening on port 8000...
Status: 400
Encrypted Response: {"responseStatus":{"status":400,"code":"9123","severity":"ERROR","message":"Expected input credential was not present","info":""}}
JWKBaseKeyObject {
keystore: JWKStore {},
length: 2048,
kty: 'RSA',
kid: '4db6ee73-3912-4471-9cad-63e9c0c19ed6',
use: '',
alg: ''
}
Is the keystore be empty?
We can have a quick call if possible?
Thank you for your help!
shameem
Visa Employee

Re: How to run Node JS Sample Code for MLE

Hi @jowilfrid ,

Unfortunately we don't provide call support. As I have mentioned, "Expected input credential was not present" is related to wrong credentials or certificate provided as part of the authentication process.

 

May i request you to try with our sample code provided in this tutorial and ensure to configure the below correctly.

 

//Credentials --> Two-Way SSL --> Username / password

const username = '<User ID>';
const password = '<Password>';

//https://developer.visa.com/portal/app/<APP_ID>
const key = '<PATH>/key_<APP_ID>.pem';

 

//Credentials --> Two-Way SSL --> Download Certificate
const cert = '<PATH>/cert.pem';

 

//MLE Configs.
const mleServerPublicCertificate = '<PATH>/server_cert_<MLE_KEY_ID>.pem';
const mleClientPrivateKey = '<PATH>/key_<MLE_KEY_ID>pem';

 

//This is required to be passed as kid in the JWE Header and in the request header as keyId
const keyId = '<MLE_KEY_ID>';

 

Any sample test data issue, please reach out to developer@visa.com

 

Thank you

 

const express = require('express');
const https = require('https');
const request = require('request');
const app = express();
const bodyParser = require('body-parser');
const path = require('path');
const jose = require('node-jose');
const fs = require('fs');
const uuid = require('uuid');

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(express.json());
app.use(bodyParser.urlencoded({extended: true}));

const hostname = 'sandbox.api.visa.com';
const port = 443;
const username = '<YOUR USER ID>';
const password = '<YOUR PASSWORD>';
const key = '<YOUR PRIVATE KEY PATH>';
const cert = '<YOUR CLIENT CERTIFICATE PATH>';

const mleServerPublicCertificate = '<YOUR MLE SERVER PUBLIC CERTIFICATE PATH>';
const mleClientPrivateKey = '<YOUR MLE CLIENT PRIVATE KEY PATH>';
const keyId = '<YOUR KEY ID>';

app.get('/', (req, res) => {

  var options = getOptions();
  options.headers.keyId = keyId;
  options.uri = 'https://sandbox.api.visa.com/acs/v3/payments/authorizations';
  options.method = 'POST';
  parameters = getParameters();
  jose.JWK.asKey(fs.readFileSync(mleServerPublicCertificate), 'PEM', {
    "kty": "RSA",
    "alg": "RSA-OAEP-256",
    "kid": keyId,
    enc: "A128GCM",
    key_opts: ["wrapKey", "enc"]
  }).then(function (result) {
    console.log(JSON.stringify(parameters.payload));
    encryptionResult = jose.JWE.createEncrypt({
      format: 'compact',
      contentAlg: 'A128GCM',
      fields: {iat: Date.now()}
    }, result).update(JSON.stringify(parameters.payload)).final()
      .then(function (data) {
        options.body = {"encData": data.toString()};
        request.post(options, (err, response, body) => {
          console.log(`headers: ${response.headers['x-correlation-id']}`);
          if (err) {
            return console.log(err);
          }
          console.log(`Status: ${response.statusCode}`);
          console.log(`Encrypted Response: ${JSON.stringify(response.body)}`);

          jose.JWK.asKey(fs.readFileSync(mleClientPrivateKey), 'PEM').then(function (result) {
            jose.JWE.createDecrypt(result).decrypt(response.body.encData, {
              contentAlg: 'A128GCM',
              alg: 'RSA-OAEP-256'
            }).then(function (decryptedResult) {
              if (err) {
                console.log(`Errored due to ${err}`);
              }
              console.log(`Status: ${response.statusCode}`);
              console.log(`Decrypted Response: ${JSON.stringify(String(decryptedResult.plaintext))}`);
              res.send(String(decryptedResult.plaintext));
            });
          });
        });
      }).catch(function (reason) {
        console.log('Encryption failed due to ');
        console.log(reason);
      });
  });
});

app.listen(3050, function () {
  console.log('Example app listening on port 3050.');
});

function getParameters() {
  const uuidStr = uuid.v4();
  console.log(uuidStr)
  const parameters = {
    "x-client-transaction-id": uuidStr,
    "Accept": "application/json",
    "Content-Type": "application/json"
  };
  parameters.payload = {
    "msgIdentfctn": {
      "clientId": "1VISAGCT000001",
      "correlatnId": "Gg6yTAyWkmhyq0jPKHziafe"
    },
    "Body": {
      "Tx": {
        "TxAttr": [
          "INST"
        ],
        "TxDesc": "transactiondescription",
        "TxId": {
          "LclDtTm": "2016-11-25T01:02:03"
        },
        "AddtlData": {
          "Val": "freeformdata",
          "Tp": "FreeFormDescData"
        },
        "TxAmts": {
          "AmtQlfr": "ESTM",
          "TxAmt": {
            "Ccy": "008",
            "Amt": "123.45"
          }
        }
      },
      "Envt": {
        "Accptr": {
          "PaymentFacltId": "52014057",
          "CstmrSvc": "1 4155552235",
          "ShrtNm": "ABC Supplies",
          "Id": "999999999999999",
          "FrgnRtlrInd": true,
          "Adr": {
            "PstlCd": "78463",
            "CtrySubDvsnMjr": "03",
            "Ctry": "US",
            "CtrySubDvsnMnr": "011"
          }
        },
        "Termnl": {
          "TermnlId": {
            "Id": "99999999"
          }
        },
        "Wllt": {
          "Prvdr": {
            "Id": "VCIND"
          }
        },
        "Card": {
          "XpryDt": "2312",
          "PAN": "4000220177656623"
        }
      },
      "Cntxt": {
        "Vrfctn": [
          {
            "VrfctnInf": {
              "Val": {
                "HexBinryVal": "099010618111100000000788400707000000000"
              },
              "Tp": "authenticationValue"
            },
            "Tp": "THDS"
          },
          {
            "VrfctnInf": {
              "Val": {
                "TxtVal": "321"
              }
            },
            "Tp": "CSCV"
          },
          {
            "VrfctnInf": {
              "Val": {
                "TxtVal": "PO Box 12345"
              }
            },
            "Tp": "ADDB"
          },
          {
            "VrfctnInf": {
              "Val": {
                "TxtVal": "12345"
              }
            },
            "Tp": "PCDV"
          }
        ],
        "TxCntxt": {
          "MrchntCtgyCd": "3501",
          "MrchntCtgySpcfcData": "B",
          "AuthntcnOutgInd": true
        },
        "PtOfSvcCntxt": {
          "CardDataNtryMd": "CDFL"
        },
        "SaleCntxt": {
          "GoodsAndSvcsTp": "ELEC",
          "GoodsAndSvcsSubTp": "CRCU"
        }
      },
      "SplmtryData": [
        {
          "Envlp": {
            "StrngCstmrAuthntcn": {
              "Xmptn": [
                {
                  "Val": "CLAI",
                  "Tp": "TMBE"
                },
                {
                  "Val": "NCLA",
                  "Tp": "LOWA"
                }
              ],
              "DlgtdAuthrty": "CLAI"
            }
          },
          "PlcAndNm": "EUPSD2SCADataSD1V01"
        }
      ],
      "AdddmData": {
        "AddtlData": {
          "Val": "1234567890",
          "Tp": "PlanRegSysId"
        },
        "Instlmt": {
          "PmtSeqNb": "12",
          "Plan": [
            {
              "DfrrdInstlmtInd": true,
              "PrdUnit": "WEEK",
              "SbsqntAmt": "9999.99",
              "TtlNbOfPmts": 24,
              "InstlmtCcy": 840,
              "NbOfPrds": "2",
              "PlanOwnr": "ISSR",
              "GrdTtlAmt": "234.56"
            }
          ]
        }
      }
    }
  };

  return parameters;
}

function getOptions() {
  const options = {
    hostname: hostname,
    port: port,
    key: fs.readFileSync(key),
    cert: fs.readFileSync(cert),
    proxy: 'http://userproxy.visa.com:80',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Basic ' + new Buffer(username + ':' + password).toString('base64')
    },

    json: true
  };
  options.agent = new https.Agent(options);
  return options;
}
jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi @shameem ,

Thank you for your feedback; I've appreciated it!

I've tried testing again based on your recommendation.

This the error I'm currently having:

Status: 404
Decrypted Response: "{\"errorResponse\":{\"details\":{\"message\":\"Error in processing request, Please Contact Visa Inc.\"},\"status\":404 NOT_FOUND}}"

Hereafter the logs for more details:

Status: 404
Encrypted Response: {"encData":"eyJjdHkiOiJhcHBsaWNhdGlvblwvanNvbjtjaGFyc2V0PVVURi04IiwiZW5jIjoiQTEyOEdDTSIsImlhdCI6MTY2MzE0NTAwMDIzNywiYWxnIjoiUlNBLU9BRVAtMjU2In0.LYm952McsYydrh7RK3R9PchbFKGNgi__Bicy8fy7eVvpmheSiF-_a-JHOW1_LMc03wcvqEWhlSl_-0ldvAk86rPwZY6Z0NqpG5912TQ6rQOTDjPJUZfdUxHSP1dstJmgjG2xYq8h3gNqH_2e1YOY73OT4fw677FjmoiNZWQDT1nZt7rfQzmi93-uH07VZdFEbg4j-aCU4kEX04vOo1dIv1dL6s8nw9h8cspQqBqWTZevDDlJl2FXBcNvx9jWRs81cmUfyy6wjNgW0t3RdQnrA5Hni97oVY0W5NzNSB1HdsbL4CGaFk8Et6UDIj3xOyIVPfItkRpR-cSVF_j1YOLL0g.2k1dwFPV9Vy8f6yv.V-viYr5TV-51S008fjxbqVOvXNLKaRtKvtxKj_gYOBy-GRkyGFng2iCSN_F0R8A9qM_4rfOOexMge-t3RqOnQChhXMZgboQKZ6tTM19bw4fmPluqK8HLE8rv1Hj6xzTfHOSypVkEM1Z95jGeR1VExjYe1wgcQFH1.562yBGVzzyWddkpW3keFWQ"}
########### JWKBaseKeyObject {
  keystore: JWKStore {},
  length: 2048,
  kty: 'RSA',
  kid: 'AIwzm6plKRSlqIM15KUG67CxEE_pGwd_0Ld_cuPMMUw',
  use: '',
  alg: ''
}

There is an issue about decryption, Is it coming from Visa side, please?

Thank you,

 

jowilfrid
Helper

Re: How to run Node JS Sample Code for MLE

Hi @shameem ,
I've forgotten to provide the header, maybe it could help investigating:
uuid: 8ccb849f-f04e-48b7-a0a3-a69be22c52d7
headers: 1663145000_162_1113341120_-756b6656t2_VDP_WS
Thank you