Skip to content

Cards Guide

This cards guide assumes that you have already completed the TheM>Getting Started>Quick Start guide and are familiar with TheM class, TheM submodule initialization, and creating/listening for custom events. This guide also assumes that you have already installed the amplifi_mobile_sdk package into your project and placed the following minified libraries in the /lib folder of your project: axios.min.js (Optional - fetch will be used if axios is not present), crypto-js.min.js, lz-string.min.js, moment.min.js, and In addition, you should have completed the Onboarding Guide tutorial in order to create and onboard a user which can be logged into your ampliFi instance.

1. In the src folder of your project (from the Quick Start guide of the TheM Getting Started section), create a new file called cards.js with the following code.


import ClassTheM from "../node_modules/@PayGearsCorp/amplifi_mobile_sdk/TheM/them.mjs";

import { thisDevice } from "./android-demo-device.js"; //android device emulator for testing

const AMPLIFI_BASE_URL = "PUT_YOUR_INSTANCE_URL_HERE"; //Speak to a PayGears representative to be issued a sandbox instance URL
const DEVICE_TAG = "PUT_YOUR_DEVICE_TAG_HERE"; //Use deviceTag obtained from onboarding tutorial for this device

const subClassesToInit = [

export const cardsTutorial = async (subClasses = "") => {
    TheM = new ClassTheM({
        config: {
            AFiInstanceId: "test",
            modulesFolder: "",
            modulesFolderOnboarding: "",
            webworkerFolder: "../TheM/",
            baseLibURL: "../demo/lib/",
            backEndURL: AMPLIFI_CORE_URL,
            socketURL: AMPLIFI_BASE_URL,
        libs: {

    //Emulate user device before initializing TheM submodules
    TheM.thisDevice = {
        deviceTag: DEVICE_TAG,

    //Initialize desired submodules
    //Some modules depend on others so must be initialized together
    //For instance, most submodules require the "common" subclass to be initialized
    await TheM.doInit(subClasses);

    //cards workflow to try
    //Uncomment to run the whole workflow or follow the instructions in the browser
    //Prepare for logging in
    //Log in using the instructions in the browser or use the doAuthenticate method from the device emulator we created during onboarding
    await TheM.thisDevice.doAuthenticate(DEVICE_TAG);

    //Pull cards and accounts data from the server if it is not fresh enough
    await TheM.accounts.doUpdate();

    console.log(`The list of all open, not-hidden cards, ${JSON.stringify(}`)

    console.log(`The list of all open cards for which the current user is the primary account user, ${JSON.stringify(}`)

    console.log(`A filtered list of all cards which match the given properties,{isActive: false, isHidden: false}): ${JSON.stringify({ isActive: false, isHidden: false }))}`)

    console.log(`The account(s) associated with the first card in the cards array,[0].account: ${JSON.stringify([0].account)}`)

    //Activate the card

    //Toggle the card off

    //Toggle the card on

    //Change the card PIN
    await[0].doChangePIN({ pin: "1234" });

    //Logout when finished
    await TheM.user.doLogout();

await cardsTutorial(subClassesToInit.join(" "));
  1. The cards module expects the user to be using some type of device so make sure the android-demo-device.js file used during onboarding is still in your /src folder.

  2. Create a new file in the /demo folder of your project called cards.html with the following code.


<!DOCTYPE html>

    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />


        var TheM;
        var TheM_config;

    <script src="../lib/"></script>
    <script src="../lib/lz-string.min.js"></script>
    <script src="../lib/moment.min.js"></script>
    <script src="../lib/axios.min.js"></script>
    <script src="../lib/crypto-js.min.js"></script>
    <script type="module" src="/../src/cards.js"></script>

        html {
            color: white;
            background-color: black;

        Hit F12 to open the browser console.
        Start working with TheM by typing "TheM" into the browser console.
    <br />
    <br />
        1. In order to log a user in, we will need to prepare the user credentials using the encryptedServerSecret
        stored locally during onboarding. Type the following to retrieve the encryptedServerSecret. (Or skip steps 1-5
        by using the doAuthenticate method in the device emulator like so, `await
        <br /><br />
        <code>let { encryptedServerSecret } = await TheM.thisDevice.retrieveLocally("encryptedServerSecret", true);</code>
        <br /><br />
        Type <code>encryptedServerSecret</code> into the browser console and hit enter to view the encryptedServerSecret
        <br /><br />
        2. Since we are using an emulated android device to log in, we need to get the cryptotext value like so.
        <br /><br />
            let _SUPER_SECRET = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";<br />
            let _dtsValueString = (new Date()).valueOf().toString();<br />
            let serverSecret = CryptoJS.AES.decrypt(encryptedServerSecret, _SUPER_SECRET).toString(CryptoJS.enc.Utf8);<br />
            let cryptotext = CryptoJS.AES.encrypt((TheM.thisDevice.deviceTag) + _dtsValueString, serverSecret).toString(); 
        <br /><br />
        3. Set a socket connection for bidirectional communication.
        <br /><br />
        <pre><code>TheM.thisDevice.halfRef = TheM.common.GetRandomSTR(40);<br />let manager = new + "?halfRef=" + TheM.thisDevice.halfRef, {<br />  autoConnect: false<br />});<br />let socket = manager.socket("/");</code></pre>
        <br />
        4. Open the socket connection.
        <br /><br />
        <pre><code>manager.connect(function (data) {<br />  console.log("established real-time comm channel for onboarding");<br />  TheM.thisDevice.isRealTimeCommAvailable = true;<br />});</code></pre>
        <br />
        5. Log the user in using the deviceTag obtained during onboarding and the newly created cryptotext.
        <br /><br />
        <pre><code>const credentials = {<br />  "dtsValueString": _dtsValueString,<br />  "deviceTag": "PUT_DEVICE_TAG_HERE",<br />  "deviceData":,<br />  "channel": TheM.thisDevice.platform,<br />  "dynamicScreensVersion": TheM.thisDevice.dynamicScreensVersion,<br />  "socket": {<br />    halfRef: TheM.thisDevice.halfRef<br />  },<br />  "pushMessToken": TheM.thisDevice.pushMessToken,<br />  "cryptotext": cryptotext<br />};<br />await TheM.user.doLogin(credentials);</code></pre>
        <br />
        6. After authentication, the locally stored data should be automatically loaded. You can check to see if the
        cards submodule is fully ready like so.
        <br /><br />
        <br /><br />
        7. Pull accounts and cards data from the server if it is not fresh enough.
        <br /><br />
        <pre><code>await TheM.accounts.doUpdate();<br />await;</code></pre>
        <br />
        8. You can list all open, not-hidden cards using
        <br /><br />
        <br /><br />
        9. Or you can use and pass in the desired key: value pairs by which to filter.
        <br /><br />
        <code>{isActive: false, isHidden: false})</code>
        <br /><br />
        10. You can retrieve the account associated with the first card in the cards array like so.
        <br /><br />
        <br /><br />
        11. You can also retrieve the account associated with a specific card in the cards array using the CFiCardId.
        <br /><br />
        <br /><br />
        12. Keep exploring properties and methods and log out when finished. Example methods to explore:
        <br /><br />
        //Activate the card<br />
        await[0].doActivate();<br />
        <br />
        //Toggle the card off<br />
        await[0].doOnOff("off");<br />
        <br />
        //Toggle the card on<br />
        await[0].doOnOff("on");<br />
        <br />
        //Change the card PIN<br />
        await[0].doChangePIN({ pin: "1234" });<br />
        <br />
            await TheM.user.doLogout();
        <br /><br />


6. Start a server in the root folder of your project.

py -m http.server 8000

7. Open a browser and enter the following URL: http://localhost:8000/demo/

8. Click on the link for "cards.html" and follow the instructions to log in, update and list cards, complete specified card actions, and log out.