Funds Transfer Guide
This fundsTransfer 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 socket.io.min.js. 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 fundsTransfer.js
with the following code.
fundsTransfer.js
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 support representative to be issued a sandbox instance URL
const AMPLIFI_CORE_URL = `${AMPLIFI_BASE_URL}core/`;
const DEVICE_TAG = "PUT_YOUR_DEVICE_TAG_HERE"; //Use deviceTag obtained from onboarding tutorial for this device
const subClassesToInit = [
"accounts",
//"beneficiaries",
"cards",
//"cheques",
"common",
//"externalAccounts",
//"fdrs",
"fundstransfer",
//"fxrates",
//"genericRequests",
//"ious",
//"onboarding",
//"payees",
//"remittance",
//"restrictions",
//"statics",
"user"
];
export const fundsTransferTutorial = 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 = {
...thisDevice,
TheM,
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);
//fundsTransfer 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);
//Make sure accounts is updated and ready so that we can assign the source and destination accounts for the funds transfer
await TheM.accounts.doUpdate(true);
console.log(`TheM.accounts.isReady: ${JSON.stringify(TheM.accounts.isReady)}`)
//Check to see if the fundsTransfer submodule is ready
console.log(`TheM.fundsTransfer.isReady: ${JSON.stringify(TheM.fundsTransfer.isReady)}`)
//Assign the source and destination accounts. Both accounts must belong to the current user and must not be the same account.
TheM.fundsTransfer.sourceAccount = TheM.accounts[1];
TheM.fundsTransfer.destinationAccount = TheM.accounts[0];
//Assign the remaining fundsTransfer properties
TheM.fundsTransfer.amount = 1.01;
TheM.fundsTransfer.currency = "USD";
TheM.fundsTransfer.comment = "Transfer between user's accounts";
TheM.fundsTransfer.narrativeSource = "Transfer from my Checking account";
TheM.fundsTransfer.narrativeDestination = "Transfer to my Savings account";
//Check to see if the fundsTransfer is valid as is
let isValid = await TheM.fundsTransfer.isValid;
console.log(`await TheM.fundsTransfer.isValid: ${JSON.stringify(isValid)}`)
//If the fundsTransfer is not valid, check the validation message to see what is missing or invalid
if (!isValid) {
console.log(`TheM.fundsTransfer.validationMessage: ${JSON.stringify(TheM.fundsTransfer.validationMessage)}`)
}
//If valid, do the transfer. TheM.accounts will automatically be updated if the transfer is successful.
if (isValid) {
await TheM.fundsTransfer.doAcc2Acc();
}
//Logout when finished
//await TheM.user.doLogout();
*/
};
await fundsTransferTutorial(subClassesToInit.join(" "));
2. The fundsTransfer 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.
3. Create a new file in the /demo folder of your project called fundsTransfer.html with the following code.
fundsTransfer.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<title>ampliFi</title>
<script>
var TheM;
var TheM_config;
</script>
<script src="../lib/socket.io.min.js"></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/fundsTransfer.js"></script>
<style>
html {
color: white;
background-color: black;
}
</style>
</head>
<body>
<div>
Hit F12 to open the browser console.
Start working with TheM by typing "TheM" into the browser console.
</div>
<br />
<br />
<div>
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
TheM.thisDevice.doAuthenticate(DEVICE_TAG);`.)
<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
value.
<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 />
<code>
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();
</code>
<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 TheM.io.Manager(TheM.config.socketURL + "?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": TheM.thisDevice.data,<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. Make sure accounts is updated
and ready so that we can assign the source and destination accounts for the funds transfer.
<br /><br />
<code>await TheM.accounts.doUpdate(true);<br />TheM.accounts.isReady;</code>
<br /><br />
7. Check to see if the fundsTransfer submodule is ready.
<br /><br />
<code>TheM.fundsTransfer.isReady;</code>
<br /><br />
8. Assign the source and destination accounts. Both accounts must belong to the current user and must not be the
same account.
<br /><br />
<code>TheM.fundsTransfer.sourceAccount = TheM.accounts[1];<br />TheM.fundsTransfer.destinationAccount = TheM.accounts[0];</code>
<br /><br />
9. Assign the remaining fundsTransfer properties.
<br /><br />
<code>TheM.fundsTransfer.amount = 1.01;<br />TheM.fundsTransfer.currency = "USD";<br />TheM.fundsTransfer.comment = "Transfer between user's accounts";<br />TheM.fundsTransfer.narrativeSource = "Transfer from my Checking account";<br />TheM.fundsTransfer.narrativeDestination = "Transfer to my Savings account";</code>
<br /><br />
10. Check to see if the fundsTransfer is valid.
<br /><br />
<code>await TheM.fundsTransfer.isValid;</code>
<br /><br />
11. If the fundsTransfer is not valid, check the validation message to see what is missing or invalid.
<br /><br />
<code>TheM.fundsTransfer.validationMessage;</code>
<br /><br />
12. If valid, do the transfer. TheM.accounts will automatically be updated if the transfer is successful.
<br /><br />
<code>await TheM.fundsTransfer.doAcc2Acc();</code>
<br /><br />
13. Keep exploring TheM.fundsTransfer properties and methods and log out when finished.
<br /><br />
<code>
await TheM.user.doLogout();
</code>
<br /><br />
</div>
</body>
</html>
4. Start a server in the root folder of your project.
5. Open a browser and enter the following URL: http://localhost:8000/demo/
6. Click on the link for "fundsTransfer.html" and follow the instructions to log in, assign the fundsTransfer properties, do an account to account fundsTransfer between user's accounts, and log out.