Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Paycom integration template

Changed repositorie

This is not a complete implementation of the Marchant API, instead a basic template. One MUST implement all the todo: entries found in the source files according his/her own requirements.

Table of Content

Prerequisites

  • PHP 5.4 or greater
  • MySQL or MariaDB latest stable version
  • PDO extension
  • Composer dependency manager

Installation

Copy the sample config file as paycom.config.php and adjust the settings according to your needs:

$ cp paycom.config.sample.php paycom.config.php

Edit paycom.config.php and set your settings there:

  • Set merchant_id;
  • Do not change the login, it is always Paycom;
  • Set a path to the password file in the keyFile;
  • Adjust connection settings in the db key to your mysql database.

Following is an example paycom.config.php configuration file content:

<?phpreturn [
'merchant_id' => '69240ea9058e46ea7a1b806a',
'login' => 'Paycom',
'keyFile' => 'password.paycom',
'db' => [
'host' => 'localhost',
'database' => 'db_shop',
'username' => 'db_shop_admin',
'password' => 'bh6U8M8tR5sQGsfLVHdB'
],
];

and an example password.paycom file content:

fkWW6UNrzvzyV6DhrdHJ6aEhr3dRcvJYkaGx

If you need to adjust other database settings, such as character set, you can do that in the Paycom/Database.php file.

Transactions table

This template requires transactions table at least with the following structure:

CREATETABLE `transactions` (
`id`INT(11) NOT NULL AUTO_INCREMENT,
`paycom_transaction_id`VARCHAR(25) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time`VARCHAR(13) NOT NULL COLLATE 'utf8_unicode_ci',
`paycom_time_datetime` DATETIME NOT NULL,
`create_time` DATETIME NOT NULL,
`perform_time` DATETIME NULL DEFAULT NULL,
`cancel_time` DATETIME NULL DEFAULT NULL,
`amount`INT(11) NOT NULL,
`state`TINYINT(2) NOT NULL,
`reason`TINYINT(2) NULL DEFAULT NULL,
`receivers`VARCHAR(500) NULL DEFAULT NULL COMMENT 'JSON array of receivers' COLLATE 'utf8_unicode_ci',
`order_id`INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Orders table

You also need a table to store info about orders. Here is a sample table definition:

CREATETABLEorders
(
id INT AUTO_INCREMENT PRIMARY KEY,
amount DECIMAL(18, 2) NOT NULL,
state TINYINT(1) NOT NULL,
user_id INTNOT NULL,
phone VARCHAR(15) NOT NULL
) ENGINE = InnoDB;

Additional fields can be added into this table or above data types and sizes can be adjusted.

Additional resources

Endpoint

In the merchant cabinet on the cashbox settings point the endpoint to your Merchant API implementation. Assuming your domain is https://example.com, and your Merchant API implementation is located under api/ folder or a URL rewriting is configured to access API by https://example.com/api/, then endpoint should be set as https://example.com/api/index.php.

File Structure

Following is the brief description of the files:

File/FolderDescription
index.phpAn entry script, that loads configuration, initializes and runs an application instances.
paycom.config.sample.phpSample configuration file with fake values.
paycom.config.phpConfiguration file with actual values. Initially isn't present. Should be copied from paycom.config.sample.php
paycom.passwordDefault file to set the KEY obtained from the Merchant Cabinet. Set in the config file via keyFile. Remove any whitespaces and EOL characters before save.
functions.phpContains additional functions. Right now it has only one function to retrieve headers from $_SERVER superglobal variable on Apache and Nginx.
Paycom/A folder, that contains all required and helper classes.
Application.phpA main class to instantiate the new application and handle all requests.
Database.phpA class to setup the new connections to the underlying database.
Request.phpA helper class to parse request's payload.
Response.phpA helper class to send responses to the requester.
Format.phpA utility class to format data.
Transaction.phpA class to handle transaction related tasks. Contains todo: items that must be implemented.
Merchant.phpA helper class to authorize requesters of the API.
PaycomException.phpA custom exception class to send error responses.
Order.phpA class to handle order/service related tasks.
vendor/Auto generated with Composer folder that contains autoloader.
DockerfileDockerfile to build an image with PHP v7, Apache v2.4, Composer.
docker-compose.ymlCompose file to easily setup & run Merchant API implementation on the docker containers.
.gitignoreGit ignore file.
composer.jsonConfig file to handle dependencies and autoloader. Read more here
README.mdDescription and documentation of this template.

Set Up and Run Merchant API implementation on Docker Containers

In cases that there is no PHP/Apache/Nginx/MySQL on your production platforms you can easily and quickly setup and run the Merchant API implementation using docker containers.

Here we will build docker images for Paycom Merchant API and optionally for MySQL.

Dockerfile contains statements to build an image for Merchant API. This image is based on PHP v7 and Apache 2.4, but also includes PDO and PDO_MYSQL extensions. There are also statements to install the latest version of Composer.

By editing docker-compose.yml file you can adjust exposed ports, volumes.

If you need more info about base images and docker commands look at the following links:

Build the images:

docker-compose build

Run the containers:

docker-compose up -d

Show the logs:

docker-compose logs -f

Stop the containers:

docker-compose stop

Stop and remove the containers:

docker-compose down

Test the endpoint via cURL command:

curl -X POST \
http://localhost:8888/ \
-H 'Authorization: Basic UGF5Y29tOktleUZyb21NZXJjaGFudENhYmluZXQ=' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{	"id": 1, "method" : "CheckPerformTransaction", "params" : { "amount" : 50000, "account" : { "phone" : "901304050" } }}'

Authorization header contains Base64 decoded Paycom:KEY_FROM_CABINET login and password.

For testing purposes you can quickly Base64 decode the login & password with this online tool.

You should get something like the following response (below the response is formatted, but you will get raw responses):

{
"id": 1,
"result": null,
"error": {
"code": -31050,
"message": {
"ru": "Неверный код заказа.",
"uz": "Harid kodida xatolik.",
"en": "Incorrect order code."
},
"data": "order_id"
}
}

Contributing

PRs are welcome. GL&HF!

About

Payme, php

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages