How to Integrate

Quickstart from Dashboard

You should have your organization registered at the VGS Dashboard. Sandbox vault will be pre-created for you. You should use your to start collecting data. Follow integration guide below.

Integrate VGS Collect SDK into Your Android Project

To use the SDK in your project you just need to add the following line of dependency in your module build.gradle file and then rebuild project.

Follow our latest releases .

dependencies {
    //...
    implementation 'com.verygoodsecurity:vgscollect:<latest-version>'
    //...
}

Include additional configurations

In case you have minifyEnabled enabled don't forget to add next line to your project R8 configuration.

//...
-keep public class com.google.android.material**  { *; }
//...

Configure Your App

To initialize VGSCollect you have to set your vault id and Environment type. You can find more information at the following section.

import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
    }
    override fun onDestroy() {
        super.onDestroy()
    }
}
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;\n
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
        vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

Configuring UI Elements

Add input field to R.layout.activity_main layout file:

You must set up fieldName to the VGSCardNumberEditText in other way input field will be ignored by VGSCollect.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <com.verygoodsecurity.vgscollect.widget.VGSTextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:hintEnabled="true"
        app:hint="Card number"
        app:boxCornerRadius="4dp"
        app:boxBackgroundModes="outline">

        <com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
            android:id="@+id/cardNumberField"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:fieldName="card_number"
            app:numberDivider="-"
            app:cardBrandIconGravity="end"/>

    </com.verygoodsecurity.vgscollect.widget.VGSTextInputLayout>

    <Button
        android:id="@+id/submitBtn"
        android:text="Submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Collecting Sensitive Data on Android

Once you have added the input field to your layout , find the object, attach it to VGSCollect for the data to be sent securely:

import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }\n
    override fun onDestroy() {
        super.onDestroy()
    }
}
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
        Button submitBtn = findViewById(R.id.submitBtn);
        VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
        vgsForm.bindView(myTextView);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

Submit Information

Call asyncSubmit to execute and send data on VGS Server

Do not use submit on the UI thread as this will crash.

import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        submitBtn?.setOnClickListener {
            submitData()
        }
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }
    private fun submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST)
    }
    override fun onDestroy() {
        super.onDestroy()
    }
}
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>);
       Button submitBtn = findViewById(R.id.submitBtn);
       submitBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               submitData();
           }
       });
       VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
       vgsForm.bindView(myTextView);
    }
    private void submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

End Session

Finish work with VGSCollect by calling onDestroy inside android onDestroy callback:

import com.verygoodsecurity.vgscollect.core.Environment
import com.verygoodsecurity.vgscollect.core.VGSCollect
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText
class MainActivity : AppCompatActivity() {
    private lateinit var vgsForm:VGSCollect
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)
        val submitBtn = findViewById<Button>(R.id.submitBtn)
        submitBtn?.setOnClickListener {
            submitData()
        }
        val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
        vgsForm.bindView(cardNumberField)
    }
    private fun submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST)
    }
    override fun onDestroy() {
        vgsForm.onDestroy()
        super.onDestroy()
    }
}
import com.verygoodsecurity.vgscollect.core.Environment;
import com.verygoodsecurity.vgscollect.core.VGSCollect;
import com.verygoodsecurity.vgscollect.widget.VGSCardNumberEditText;\n
public class MainActivity extends Activity {
    private VGSCollect vgsForm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);\n
       vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>);\n
       Button submitBtn = findViewById(R.id.submitBtn);
       submitBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               submitData();
           }
       });
       VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
       vgsForm.bindView(myTextView);
    }
    private void submitData() {
        vgsForm.asyncSubmit("/post", HTTPMethod.POST);
    }
    @Override
    protected void onDestroy() {
        vgsForm.onDestroy();
        super.onDestroy();
    }
}

Handling Responses

To read response or track different errors you need to implement VgsCollectResponseListener:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)\n
    vgsForm = VGSCollect(this, "<VAULT_ID>", Environment.<SANDBOX>)\n
    val submitBtn = findViewById<Button>(R.id.submitBtn)
    submitBtn?.setOnClickListener {
        submitData()
    }
    val cardNumberField = findViewById<VGSCardNumberEditText>(R.id.cardNumberField)
    vgsForm.bindView(cardNumberField)
    vgsForm.addOnResponseListeners(object : VgsCollectResponseListener {
        override fun onResponse(response: VGSResponse?) {
            val code = response.code
            val body = response.body
        }
    })
}
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   vgsForm = new VGSCollect( this, "<VAULT_ID>", Environment.<SANDBOX>);
   Button submitBtn = findViewById(R.id.submitBtn);
   submitBtn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           submitData();
       }
   });
   VGSCardNumberEditText myTextView = findViewById(R.id.cardNumberField);
   vgsForm.bindView(myTextView);
   vgsForm.addOnResponseListeners(new VgsCollectResponseListener() {
       @Override
       public void onResponse(VGSResponse response) {
           int code = response.getCode();
           String body = response.getBody();
       }
   });
}

More Information

In addition, there is some documentation you might want to read next about tracking changes or sending additional information.

See also:

Last updated