Client Verification Integration Guide

Learn how to integrate external verification via the OKPAY service to meet Know Your Cus­tomer (KYC) requirements: how to place a link to verify your site, how to handle IPN events related to verification, how to manage clients through API and view their status via a web interface, etc.

Table of contents:

§1. General Description

Forward your clients to complete their account verification at OKPAY and get the data on confirmed users as a result. OKPAY verification requirements comply with all of the up-to-date Know Your Customer (KYC) and Anti-Money Laundering (AML) policies.

Please visit OKPAY Client Verification Service Overview for more information.

Figure 1. OKPAY client verification diagram.

Verification Diagram



Step-by-Step Process Description

  • Step 1: Partner generates and places a special URL link, "Verify with OKPAY", on their website.

  • Step 2: Client clicks on the link and is forwarded to the OKPAY account login page.

  • Step 3: After login, client is redirected to the verification authorization page and confirms that personal information will be transferred to the Partner.

  • Step 4: Upon confirming access authorization, client is redirected back to the Partner's website.

  • Step 5: At the same time, Partner receives an IPN message with the client's information. Now Partner can use OKPAY API to obtain verification data on the client. Furthermore, various IPN messages are sent in cases where the client's personal information has been updated (e.g. verification or account status updated, new verification documents uploaded, etc.).

The steps above will be further described in greater detail.

In order to provide your clients with an “OKPAY” verification option you need to create a special URL link and place it on your website.

Link format:

https://www.okpay.eu/en/account/login.html?verification=WalletID&reference=ReferenceNumber&return_url=ReturnURL

  • WalletID - Parnter's Wallet ID in OKPAY.
  • ReferenceNumber - A unique client identifier in the Partner's database. This parameter will be sent in the variable ok_v_reference with each IPN message in case any modifications of a client's account status or personal data occurs.
  • ReturnURL - The URL where client is redirected after confirming the intention to verify an account via OKPAY.

Verification link example:

https://www.okpay.eu/en/account/login.html?verification=OK99999999&reference=12345&return_url=http%3A%2F%2Fwww.service.com%2Fverification.html

The link above represents Partner's authorization request (Partner's wallet ID OK99999999) to access client verification data. The unique client ID in the Partner's system is 12345. Afterwards, the client will be redirected to the following URL: http://www.service.com/verification.html.

Figure 2: Verification authorization page for the client.

Verification authorization page for the client

Upon confirming access authorization, client is redirected back to the Partner's website (specified by the variable ReturnURL in the verification link). Additionaly, the AccountID and Reference parameters are added to the ReturnURL, which, respectively, are a unique 9-digit account identifier for the corresponding client in OKPAY and a reference ID for the client in your database.

Link sample:

www.service.com/verification.html?id=987654321&reference=12345

Here the id parameter contains an Account ID for the client (987654321) in OKPAY who has autorized access to his/her verification data. On this page you can tell your customer that you have received his/her verification request, etc.

§3. Handling IPN Messages

Event handling of IPN messages for client verification allows you to fully automate interactions with clients, thus minimizing routine. Receive instant IPN ​​messages upon the events of a new authorization, authorization termination, new verification document, change of status, personal data received from client, etc.

§3.1. IPN Handler Setup

The OKPAY Client Verification feature uses a standard Instant Payment Notification (IPN) mechanism to alert Partner of such events.

First, you need to specify the IPN handler script location on your server:

  • In wallet preferences (Profile - Merchant - Wallets and Currencies - (select edit settings) - Integration tab, and in the “Payment notification (IPN)” section enter the address of your IPN handler.

If you need more information on IPN, for example, if you are looking for basic code writing rules, testing, IPN messages history, etc., refer to the Instant Payment Notification (IPN) section of the manual. Aditional information on how to setup an IPN handler address can be found in Identifying Your IPN Listener to OKPAY.

§3.2. Writing Handler Code

General code writing rules for the IPN handler can be found in Implementing a Generic IPN Listener section of the Comprehensive Manual.

To identify an incoming IPN as a client verification message you need to lookup the ok_txn_kind variable, which should be equal to verification. Then you need to examine the ok_v_event variable in order to determine the event type, which should be handled accordingly:

  • access_granted - client authorized verification;
  • access_denied - client declined authorization from the account profile menu;
  • image_uploaded - a new verification document has been uploaded by the client;
  • client_updated - personal information on the client has been updated; or
  • client_status_updated - client's status has been updated.

§3.2.1. Handling an Access Authorization Event (access_granted)

As soon as the client authorizes access to personal information, the Partner receives an IPN message stating, ok_v_event=access_granted. Additionally, upon authorization the client is redirected to the return_url page specified by the Partner with the addition of an ID parameter to that URL, for example: www.services.com/verify.html?id=123456789.

Complete IPN message content example:

ok_charset=utf-8
ok_txn_kind=verification
ok_v_event=access_granted
ok_receiver_id=987654321
ok_receiver_wallet=OK123456789
ok_v_client_id=123456789
ok_v_client_email=user@client.com
ok_v_datetime=2013-09-20 07:08:47
ok_v_reference=33333
ok_ipn_id=1764405

It is now possible to request personal information on the client via the Client Verification API by using the received Client ID, ok_v_client_id=123456789, the Reference variable value, ok_v_reference=33333, or the e-mail, ok_v_client_email=user@client.com.

Attention: Access authorization does not necessarily mean that the client is active and verified. You can always check for that afterwards in your IPN handler code.

§3.2.2. Handling an Access Decline Event (access_denied)

When the client cancels access to personal information, the Partner receives an IPN message with ok_v_event=access_denied. You can use the Client ID contained in ok_v_client_id or use the ok_v_reference variable to identify the client. In such cases you must take the proper action for the сlient, for example, by reducing his verification level in your system.

§3.2.3. Handling a New Verification Document Event (image_uploaded)

An IPN message with ok_v_event=image_uploaded variable is sent every time a client uploads new verification documents to his/her OKPAY profile. Additionally, the ok_v_image_id parameter, containing the new image ID is transferred over. The function Image_Get can be used to download the image.

§3.2.4. Handling a Personal Information Update Event (client_updated)

The Partner automatically receives an IPN message with the following content when a client updates any personal information:

ok_charset=utf-8
ok_txn_kind=verification
ok_v_event=client_updated
ok_receiver_id=987654321
ok_receiver_wallet=OK123456789
ok_v_client_id=123456789
ok_v_client_email=user@client.com
ok_v_datetime=2013-09-24 07:20:37
ok_v_reference=33333
ok_ipn_id=1764607

Call the API function Client_Get to receive and update any client data stored in your system.

§3.2.5. Handling a Client Status Update Event (client_status_updated)

The OKPAY system automatically sends an IPN message with the ok_v_event=client_status_updated variable to the Partner if a client verification status is changed. Please handle such an event appropriately. Start with the API function Сlient_Get to obtain client data. As soon as the data is received, the Verification property containing information on the verification status should be checked with the follow-up actions in your system.

The paragraph Code Samples in Various Programming Languages contains detailed samples of the correct IPN handler for client verification. You can use the sample as the basis for creating your own handler.

§3.3. Tips to Safely Handle IPN Messages

As in other cases, for proper and safe processing of Client Verification IPNs, first of all, verify that the received IPN is genuine, sent by an OKPAY server, and wasn't handled before (check the ok_ipn_id). Details for the checkup process can be found in Implementing a Generic IPN Listener, subsection of Comprehensive Manual.

We recommend that you start writing code for your handler based on the sample in Code Samples in Various Programming Languages.

§3.4. Testing Your IPN Handler

OKPAY contains an IPN simulator to test the message handling ability of your scripts. This functionality is described in the IPN Testing article of the Manual.

The IPN payments simulator can be used to initially test your source code. For a more thorough, real world testing of your business logic, please refer to Final Testing of the Client Verification.

§4. Managing Clients via API

The OKPAY system allows full business process automatization of client verification for your organization. API functions and IPN are parts of the single automation system.

The verification API contains the following functions:

(to get additional information click on the function name)

The general principle of the API usage is that you must call the appropriate functions in response to any received IPN verification messages. By calling these functions, you get new data on the client, and when necessary, you can update your internal database and generate new events within the information systems of your organization.

We also want to mention the Client_AbuseReport function, which you can call without regard to any event received via IPN ​​from OKPAY. You can embed it in your application and automatically inform OKPAY of any violations made by the client (i.e. you can file a complaint for inappropriate actions).

A detailed example of API function calls in response to respective IPN messages can be found in Code Samples in Various Programming Languages.

§5. Managing Clients via Web Interface

To display a list of your customers in OKPAY who have authorized access to verification data, refer to the Client Verification Panel page (Profile - Merchant - Client Verification).

Figure 3: List of clients.

List of clients

In this section of your profile you can view the list of clients who have authorized access to their personal data via API - see the "Access" column. A green circle is displayed next to such a client. A red circle is displayed accordingly next to a client who has declined authorization.

You should be aware that access authorization does not mean that the customer has been verified in OKPAY. The "Status" column displays a client's status:

  • Unverified - client is unverified (e.g. required verification documents haven't been provided yet) or verification status has been downgraded for a certain reason;
  • Verified formal - client provided verification documents in electronic form;
  • Verified - client provided verification documents in notarized form.

Keep in mind that the web interface provides only the most basic information. To receive personal information on a client, you should use the API in response to appropriate IPN messages.

§5.1. Statistics, Search, and Filtering Options

For your convenience, the top of the page contains general statistical data on your clients:

  • the total number of clients;
  • the number of clients who has authorized access or declined access authorization;
  • the number of verified, unverified, and blocked clients.

Beneath the statistics, you can find the available sorting options, which can be used to find specific clients according to the following criteria:

  • Access to the client's personal data (authorized or declined);
  • The Status of the client's account (verified, unverified, blocked).
  • Authorization time: you can choose any desired date range.
  • The e-mail address, phone number, account ID, or wallet ID of the client.

§5.2. Reporting Client Abuse

The OKPAY system provides the opportunity to file a complaint against a client (a similar effect can be made by calling the API Client_AbuseReport - see Managing Clients via API).

Figure 4: Calling the complaint dialog window.

Calling the complaint dialog window

Figure 5: Client abuse report window.

Client abuse report window

Use this functionality to inform OKPAY of any violation commited by the client.

§6. Final Testing of the Client Verification

As has been explained in Testing Your IPN Handler, you can check the basic operation of your handler by using the offered IPN simulation service.

In addition, for a final and more complete testing of your code as well as business-logic operation you may need additional real world testing with real clients and OKPAY system replies.

Hint: We recommend you create a test account (under the name of one of the developers), which can be used to perform all verification actions.

If you have any questions or problems during the writing process, feel free to contact OKPAY Support Service. Our technicians are happy to assist you.

§7. Code Samples in Various Programming Languages

In the code samples below we have prepared the Client Verification API Wrapper Class and Sample IPN Handler; for your convenience they are provided in several popular programming languages. You can use these samples as the basis for creating your own code.

Sample in PHP
 <?php
 /*
     Verification OKPAY API class
 */
 class OKPAY_Verification {
     private $WalletID      = 'OK245432415';               // Wallet ID of service owner
     private $SecurityToken = 'Ce6o3R4MjHc2n8SAd59Zpg7GT'; // API password
     private $ClientAccount = '';                          // Client account to verify (used for extended partners API)
     private $Key           = '';                          // Security key
     public  $LogFilename   = 'IPNtest.txt';               // Log file name
     public  $debug         = false;                       // Is debug mode on?
     private $client        = false;                       // SOAP client for verification API
 
     // Pre-defined variables
     public function __construct() {
         if(isset($_GET['id']) && !empty($_GET['id'])){
             $this->ClientAccount = $_GET['id'];
         }
         $this->Key = strtoupper(hash("sha256", $this->SecurityToken.":".gmdate("Ymd:H")));
         $this->client = new SoapClient("https://api.okpay.com/2.0/VerificationAPI.asmx?wsdl");
     }
 
     // IPN verification function
     public function VerifyIPN() {
         $Request = 'ok_verify=true';
         foreach ($_POST as $key => $value) {
             $value = urlencode(stripslashes($value));
             $Request .= "&$key=$value";
         }
 
         $header = "POST /ipn-verify HTTP/1.0\r\n";
         $header .= "Host: checkout.okpay.eu\r\n";
         $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
         $header .= "Content-Length: " . strlen($Request) . "\r\n\r\n";
         $fp = fsockopen ('checkout.okpay.eu', 80, $errno, $errstr, 30);
 
         if (!$fp) {
             $this->log('Cannot connect to OKPAY');
             return false;
         } else {
             fputs ($fp, $header . $Request);
             while (!feof($fp)) {
                 $res = fgets ($fp, 1024);
                 if (strcmp ($res, "VERIFIED") == 0) {
                     // IPN verified
                     $this->log('IPN verified');
                     $this->log('Request - '.$Request);
                     return true;
                 } elseif (strcmp ($res, "INVALID") == 0) {
                     // IPN invalid
                     $this->log('IPN INVALID');
                     $this->log('Request - '.$Request);
                     return false;
                 } elseif (strcmp ($res, "TEST")== 0) {
                     // Test IPN
                     $this->log('IPN TEST');
                     $this->log('Request - '.$Request);
                     return true;
                 }
             }
             fclose ($fp);
         }
     }
 
     // Get client information
     public function ClientGet($ClientAccount = '') {
         try {
             $obj = new stdClass();
             $obj->WalletID = $this->WalletID;
             $obj->SecurityToken = $this->Key;
             $obj->ClientAccount = $ClientAccount;
             $webService = $this->client->Client_Get($obj);
             return $webService->Client_GetResult;
         } catch (Exception $e) {
             $this->log("Caught exception: ".  $e->getMessage());
             return false;
         }
     }
 
     // Get uploaded images list
     public function ImagesGetList($ClientAccount = '') {
         try {
             $obj = new stdClass();
             $obj->WalletID = $this->WalletID;
             $obj->SecurityToken = $this->Key;
             $obj->ClientAccount = $ClientAccount;
             $webService = $this->client->Images_GetList($obj);
             return $webService->Images_GetListResult;
         } catch (Exception $e) {
             $this->log("Caught exception: ".  $e->getMessage());
             return false;
         }
     }
 
     // Get uploaded image information
     public function ImageGet($ImageID = 0) {
         try {
             $obj = new stdClass();
             $obj->WalletID = $this->WalletID;
             $obj->SecurityToken = $this->Key;
             $obj->ImageID = $ImageID;
             $webService = $this->client->Image_Get($obj);
             return $webService->Image_GetResult;
         } catch (Exception $e) {
             $this->log("Caught exception: ".  $e->getMessage());
             return false;
         }
     }
 
     // Report client violation
     public function ClientReport($ClientAccount = "", $Message = "") {
         try {
             $obj = new stdClass();
             $obj->WalletID = $this->WalletID;
             $obj->SecurityToken = $this->Key;
             $obj->ClientAccount = $ClientAccount;
             $obj->Message = $Message;
             $webService = $this->client->Client_Report($obj);
             return $webService->Client_ReportResult;
         } catch (Exception $e) {
             $this->log("Caught exception: ".  $e->getMessage());
             return false;
         }
     }
 
     private function log($message) {
         if($this->debug == true) {
             file_put_contents($this->LogFilename, date("d.m.Y H:i:s").': '.$message."\r\n", FILE_APPEND);
         }
     }
 }
 ?>
 
 <?php
 /*
 * HOW TO USE
 */
 $API = new OKPAY_Verification();                 // Initialize
 $API->debug = true;                              // Enable debug mode
 $API->LogFilename = '../verification_debug.txt'; // Change debug filename
 
 if($_SERVER['REQUEST_METHOD'] === 'POST') {                 // POST method - possibly IPN request
     if($API->VerifyIPN()) {                                 // If IPN verified
         if($_POST['ok_txn_kind'] == 'verification') {       // This is verification IPN request
             $ClientID = (integer)$_POST['ok_v_client_id'];
             $User = $API->ClientGet($ClientID);             // Get client data
             switch($_POST['ok_v_event']) {
                 case 'access_granted': // Access to the client's information is granted
                     /*
                         Here we receive an access to client information
                         We need to store some client data to DB
                         You can use following data structures:
                         $User->ID
                         $User->Status
                         $User->Verification
                         $User->PersonalInfo
                         $User->DocumentInfo
                         $User->Phones
                         $User->Addresses
                         $User->Emails
                         $User->IPs
                         For more information visit:
                         https://www.okpay.com/en/developers/clients-verification/interfaces/client-get.html
                     */
 
                     break;
                 case 'access_denied': // Access to the client's information is denied
                     /*
                         Client change access permissions
                         You cannot get any more client data
                     */
 
                     break;
                 case 'image_uploaded': // Client uploaded a new document in to the profile
                     /*
                         Client upload new image
                         You can store it in DB if needed
                     */
                     $ImageID = (integer)$_POST['ok_v_image_id'];
                     $Image = $API->ImageGet($ImageID);
                     /*
                         You can use following image information:
                         $Image->ID
                         $Image->Name
                         $Image->Data
                         For more information visit:
                         https://www.okpay.com/en/developers/clients-verification/interfaces/image-get.html
                     */
 
                     break;
                 case 'client_updated': // Client's personal information has been modified
                     /*
                         Client change personal information
                         We need to update client data in DB
                         See also: `access_granted` status
                     */
 
                     break;
                 case 'client_status_updated': // Client's status / verification level has been modified
                     /*
                         Client status changed
                         We need to update client data in DB
                         See also: `access_granted` status
                     */
 
                     break;
                 default:
                     break;
             }
         }
     }
 }
 ?>
Sample in C#
 using System;using Web.Common.Translation;using Web.Common;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace Developers.OKPAY.COM
 {
 
 	///Add Service Reference to your C# project (https://api.okpay.com/2.0/VerificationAPI.asmx)
 
     /// <summary>
     /// Verification OKPAY API class
     /// </summary>
     public class OKPAY_Verification
     {
         /// <summary>
         ///  Wallet ID of service owner
         /// </summary>
         private string WalletID = "OK123456789";
 
         /// <summary>
         /// API password
         /// </summary>
         private string APIAccessPassword = "Your API Password";
 
         /// <summary>
         /// Get client information
         /// </summary>
         public VerificationAPI.Client ClientGet(string clientAccount)
         {
             string securityToken = this.SecurityToken;
             using (var proxy = new VerificationAPI.VerificationSoapClient())
             {
                 try
                 {
                     var client = proxy.Client_Get(WalletID, securityToken, clientAccount);
                     return client;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.ToString());
                     throw ex;
                 }
             }
         }
 
 
         /// <summary>
         ///  Report client violation
         /// </summary>
         public string Client_AbuseReport(string clientAccount, string reportMessage)
         {
             string securityToken = this.SecurityToken;
             using (var proxy = new VerificationAPI.VerificationSoapClient())
             {
                 try
                 {
                     var requestNumber = proxy.Client_AbuseReport(WalletID, securityToken, clientAccount, reportMessage);
                     return requestNumber;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.ToString());
                     throw ex;
                 }
             }
         }
 
 
 
         /// <summary>
         /// Get uploaded image information
         /// </summary>
         public VerificationAPI.Image Image_Get(long imageID)
         {
             string securityToken = this.SecurityToken;
             using (var proxy = new VerificationAPI.VerificationSoapClient())
             {
                 try
                 {
                     var img = proxy.Image_Get(WalletID, securityToken, imageID);
                     return img;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.ToString());
                     throw ex;
                 }
             }
         }
 
         /// <summary>
         /// Get uploaded images list
         /// </summary>
         public VerificationAPI.Image[] ImagesGetList(string clientAccount)
         {
             string securityToken = this.SecurityToken;
             using (var proxy = new VerificationAPI.VerificationSoapClient())
             {
                 try
                 {
                     var list = proxy.Images_GetList(WalletID, securityToken, clientAccount);
                     return list;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.ToString());
                     throw ex;
                 }
             }
         }
 
 
         public bool VerifyIPN(byte[] parameters)
         {
             var req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://checkout.okpay.eu/ipn-verify");
 
             //Set values for the request back
             req.Method = "POST";
             req.ContentType = "application/x-www-form-urlencoded";
             string strRequest = Encoding.UTF8.GetString(parameters);
             strRequest += "&ok_verify=true";
             req.ContentLength = Encoding.UTF8.GetByteCount(strRequest);
 
             //Send the request to OKPAY and get the response
             using (var streamOut = new System.IO.StreamWriter(req.GetRequestStream()))
             {
                 streamOut.Write(strRequest);
                 streamOut.Close();
                 using (var streamIn = new System.IO.StreamReader(req.GetResponse().GetResponseStream()))
                 {
                     string strResponse = streamIn.ReadToEnd();
                     streamIn.Close();
 
                     if (strResponse == "VERIFIED")
                     {
                         return true;
                     }
                     else if (strResponse == "INVALID")
                     {
                         return false;
                     }
                     else if (strResponse == "TEST")
                     {
                         return true;
                     }
                     else
                     {
                         return false;
                     }
                 }
             }
 
         }
 
         private string SecurityToken
         {
             get
             {
                return HashStringSHA256(this.APIAccessPassword + DateTime.UtcNow.ToString(":yyyyMMdd:HH"));
             }
         }
 
         private string HashStringSHA256(string Value)
         {
             using (System.Security.Cryptography.SHA256CryptoServiceProvider x = new System.Security.Cryptography.SHA256CryptoServiceProvider())
             {
                 byte[] data = System.Text.Encoding.ASCII.GetBytes(Value);
                 data = x.ComputeHash(data);
                 return BitConverter.ToString(data).Replace("-", "");
             }
         }
     }
 
 
     /// <summary>
     /// Sample IPN handler
     /// </summary>
     public class IPN_Handler
     {
         OKPAY_Verification api = new OKPAY_Verification();
 
         public void ProcessRequest(System.Web.HttpContext context)
         {
             Dictionary<string, string> parameters = new Dictionary<string, string>();
             foreach (var item in context.Request.Form)
             {
                 parameters[item.ToString()] = System.Web.HttpUtility.HtmlDecode(context.Request.Form[item.ToString()]);
             }
 
             byte[] param = context.Request.BinaryRead(context.Request.ContentLength);
             var ipnTestResult = api.VerifyIPN(param);
             if (ipnTestResult)                                    // If IPN message is valid
             {
                 if (parameters["ok_txn_kind"] == "verification")  //This is verification IPN request
                 {
                     string ok_v_client_id = parameters["ok_v_client_id"];
                     switch (parameters["ok_v_event"])
                     {
                         case "access_granted":
                             //Here we receive access to client information
                             var client_granted = api.ClientGet(ok_v_client_id);
 
                             /*
                              Store information in DB
                             */
 
                             if (client_granted.Status == VerificationAPI.Statuses.Active
                                 &&
                                 (client_granted.Verification == VerificationAPI.VerificationStatuses.Formal
                                     ||
                                 client_granted.Verification == VerificationAPI.VerificationStatuses.Verified))
                             {
                                 /*
                                     If client is active and verified
                                     Do something...
                                 */
                             }
                             break;
 
                         case "access_denied":
                             /*
                                 Client change access permissions
                                 You cannot get client data any more
                                 You need to block user with ID = $_POST['ok_v_client_id']
                             */
                             break;
 
                         case "image_uploaded":
                             /*
                                 Client uploaded new image
                             */
                             var imageID = long.Parse(parameters["ok_v_image_id"]);
                             var image = api.Image_Get(imageID);
                             /*
                                 You can store it in DB if needed
                             */
                             break;
 
                         case "client_updated":
                             /*
                                 Client personal information has been changed
                             */
                             var client_updated = api.ClientGet(ok_v_client_id);
                             /*
                                 Update information in DB
                             */
                             break;
 
 
                         case "client_status_updated":
                             /*
                                 Client status changed
                             */
                             var client_changed = api.ClientGet(ok_v_client_id);
                             if (client_changed.Status == VerificationAPI.Statuses.Active
                                 &&
                                 (client_changed.Verification == VerificationAPI.VerificationStatuses.Formal
                                     ||
                                 client_changed.Verification == VerificationAPI.VerificationStatuses.Verified))
                             {
                                 /*
                                     If client is active and verified
                                     Do something...
                                 */
                             }
                             else if (client_changed.Status != VerificationAPI.Statuses.Active)
                             {
                                 /*
                                     Client status changed to `Blocked` or `Deleted`
                                     Do something...
                                 */
                             }
                             break;
                         default:
                             break;
                     }
                 }
 
             }
         }
     }
 }
OKPAY RSS
OKPAY Forum
OKPAY on Facebook
OKPAY on Livejournal
OKPAY on Twitter
OKPAY on VK
OKPAY on Linkedin
OKPAY on Youtube