Dažkārt interneta veikalam ir nepieciešams rādīt konkrētu maksājuma veidu ne visiem pircējiem, bet tikai klientiem no noteiktām valstīm. Piemēram, bankas pārskaitījums var būt ērts vienai valstu grupai, bet nevēlams citai. Šādā gadījumā var izveidot atsevišķu PrestaShop maksājumu moduli, kas darbojas līdzīgi standarta bankas pārskaitījumam, bet papildus pārbauda pircēja valsti pēc IP adreses.
Šis raksts ir paredzēts veikala administratoram ar pamata zināšanām par PrestaShop: moduļu uzstādīšanu, darbu ar vietnes failiem, FTP/SFTP, SSH, kešatmiņas dzēšanu un pamatizpratni par veikala struktūru. Mēs neiesim dziļi PrestaShop kodola arhitektūrā, bet apskatīsim, no kā sastāv šāds modulis, kas jāsagatavo serverī un kādas pārbaudes jāveic pirms palaišanas dzīvajā veikalā.
Moduļa uzdevums ir samērā vienkāršs: pievienot PrestaShop checkout sadaļai jaunu maksājuma veidu, kas darbojas pēc bankas pārskaitījuma principa, bet tiek rādīts tikai pircējiem no atļautajām valstīm.
Praktiski modulim jāveic šādas darbības:
Pirmajā brīdī var šķist, ka vienkāršāk ir izmainīt standarta bankas pārskaitījuma moduli. Tomēr darba veikalam tas nav drošākais risinājums.
Standarta modulis var tikt pārrakstīts PrestaShop vai paša moduļa atjaunināšanas laikā. Turklāt, ja veikalā jau tiek izmantots parastais bankas pārskaitījums, standarta moduļa labošana var sabojāt esošo maksājumu shēmu, vecos pasūtījumus, e-pastus un iestatījumus.
Daudz drošāk ir izveidot atsevišķu moduli, piemēram:
sollerwiregeo
Šādu moduli var ieslēgt, izslēgt, dzēst, pārvietot uz citu veikalu un pilnveidot neatkarīgi no standarta bankas pārskaitījuma moduļa.
Parasti PrestaShop moduļi atrodas mapē:
/modules/
Piemēram, mūsu modulim struktūra varētu būt šāda:
/modules/sollerwiregeo/
Galvenajam moduļa failam parasti ir tāds pats nosaukums kā moduļa mapei:
/modules/sollerwiregeo/sollerwiregeo.php
Minimāla maksājumu moduļa struktūra var izskatīties šādi:
sollerwiregeo/
├── sollerwiregeo.php
├── config.xml
├── index.php
├── logo.png
├── composer.json
├── vendor/
├── controllers/
│ └── front/
│ ├── payment.php
│ └── validation.php
├── views/
│ └── templates/
│ └── hook/
│ └── payment_options.tpl
└── mails/
├── en/
├── lv/
└── ru/
Ne visi faili ir obligāti jau pirmajā etapā, bet normālam maksājumu modulim parasti ir nepieciešami:
composer.json fails, ja tiek izmantotas ārējas PHP bibliotēkas;vendor/ mape ar uzstādītajām atkarībām.Šādam modulim serverim jāspēj normāli darbināt PrestaShop un papildus nolasīt GeoIP datubāzi. Zemāk ir praktisks saraksts ar lietām, kas jāpārbauda pirms izstrādes vai uzstādīšanas.
Vispirms ir nepieciešams uzstādīts un strādājošs PrestaShop veikals. Moduli labāk neizstrādāt uzreiz dzīvajā veikalā. Drošāka shēma:
production shop → test / staging copy
Testa kopijā var droši pārbaudīt uzstādīšanu, dzēšanu, checkout kļūdas, pasūtījumu izveidi un e-pastu nosūtīšanu.
PrestaShop 1.7.8 vidē bieži tiek izmantota šāda kombinācija:
PHP 7.4
MariaDB / MySQL
Apache vai Nginx + Apache
SSH piekļuve
piekļuve vietnes failiem
ieslēgts debug mode testa vietnē
Parasti PrestaShop darbībai jau ir uzstādīti galvenie PHP paplašinājumi:
php-cli
php-curl
php-zip
php-intl
php-mbstring
php-xml
php-gd
php-mysql
Darbam ar GeoIP nav obligāti jāuzstāda atsevišķs sistēmas GeoIP paplašinājums. Ērtāk ir izmantot MaxMind GeoIP2 PHP bibliotēku caur Composer. Šādā gadījumā PHP nolasa .mmdb datubāzes failu ar bibliotēkas palīdzību.
Composer ir nepieciešams ārējo PHP bibliotēku uzstādīšanai. Šajā gadījumā tas tiek izmantots GeoIP2 bibliotēkas uzstādīšanai.
Composer var pārbaudīt ar komandu:
composer --version
Ja Debian vai Ubuntu serverī Composer nav uzstādīts, to var uzstādīt šādi:
apt update
apt install composer -y
Moduļa mapē tiek izveidots fails:
composer.json
Piemērs:
{
"require": {
"geoip2/geoip2": "^2.13"
}
}
Pēc tam moduļa mapē tiek palaista atkarību uzstādīšana:
cd /path/to/prestashop/modules/sollerwiregeo
composer install --no-dev
Pēc tam parādīsies mape:
vendor/
Šī mape jāatstāj modulī, jo tieši tajā atrodas klases GeoIP datubāzes nolasīšanai.
Normālai atkļūdošanai vēlams nodrošināt SSH piekļuvi serverim un iespēju lasīt žurnālus:
/var/log/apache2/
/var/log/nginx/
/var/log/php*/
/path/to/prestashop/var/logs/
Ja vietne darbojas uz shared hosting bez SSH piekļuves, moduli joprojām var izmantot, bet vendor/ mapi labāk sagatavot iepriekš lokālajā datorā vai testa serverī un pēc tam augšupielādēt jau gatavu moduļa arhīvu.
Lai noteiktu pircēja valsti pēc IP adreses, pietiek ar GeoLite2 Country datubāzi. Tā ļauj iegūt valsts ISO kodu, piemēram:
LV
LT
EE
SE
FI
DE
Datubāzes fails parasti saucas:
GeoLite2-Country.mmdb
To labāk glabāt nevis publiskajā vietnes mapē, bet vienu līmeni virs public_html, piemēram:
/home/shop/private/geoip/GeoLite2-Country.mmdb
Struktūras piemērs:
/home/shop/
├── private/
│ └── geoip/
│ └── GeoLite2-Country.mmdb
└── public_html/
└── modules/
└── sollerwiregeo/
Šāda pieeja ir drošāka, jo datubāze nebūs tieši pieejama no pārlūka.
public_html vai citā publiskā mapē. Pat ja fails nesatur paroles, servisa failus labāk glabāt ārpus publiskās vietnes daļas.
Mapes sagatavošanas piemērs:
mkdir -p /home/shop/private/geoip
chown -R shop:shop /home/shop/private/geoip
chmod 750 /home/shop/private/geoip
chmod 640 /home/shop/private/geoip/GeoLite2-Country.mmdb
Moduļa kodā ceļu uz datubāzi var norādīt šādi:
const GEOIP_DB_PATH = _PS_ROOT_DIR_ . '/../private/geoip/GeoLite2-Country.mmdb';
Šeit _PS_ROOT_DIR_ ir PrestaShop saknes mape, parasti public_html. Tāpēc ../private/geoip/ nozīmē mapi virs publiskā kataloga.
Modulim nav vienkārši jāparāda maksājuma poga. Tam korekti jāiziet vairākas pārbaudes. Ja kaut kas nav kārtībā, labāk maksājuma veidu paslēpt, nevis salauzt visu checkout procesu.
Ja modulis ir izslēgts PrestaShop administrācijas panelī, tam nav jāparādās checkout sadaļā.
Ja datubāzes fails neeksistē vai nav nolasāms, modulim nevajadzētu izraisīt fatālu kļūdu.
if (!is_file(self::GEOIP_DB_PATH) || !is_readable(self::GEOIP_DB_PATH)) {
return false;
}
Vienkāršā gadījumā IP adresi var iegūt no standarta servera mainīgā:
$_SERVER['REMOTE_ADDR']
Taču, ja vietne darbojas caur Cloudflare, reverse proxy vai citu CDN, atsevišķi jāņem vērā uzticamie galvenes lauki. Pretējā gadījumā modulis var redzēt nevis pircēja IP adresi, bet proxy servera IP adresi.
X-Forwarded-For nedrīkst akli uzticēties. Tās drīkst izmantot tikai tad, ja serveris tiešām atrodas aiz uzticama proxy un tīmekļa servera konfigurācija ir pareizi iestatīta.
Pēc Composer autoload pieslēgšanas var izmantot GeoIP2 bibliotēku:
require_once __DIR__ . '/vendor/autoload.php';
$reader = new \GeoIp2\Database\Reader(self::GEOIP_DB_PATH);
$record = $reader->country($ip);
$countryIso = $record->country->isoCode;
Rezultātā modulis iegūst valsts ISO kodu, piemēram:
LV
Moduļa iestatījumos var glabāt valstu sarakstu:
LV,LT,EE,SE,FI
Ja pircēja valsts ir šajā sarakstā, maksājuma veids tiek parādīts. Ja nav — tas tiek paslēpts.
PrestaShop maksājumu modulis ne tikai parāda pogu checkout sadaļā. Tam ir korekti jāizveido pasūtījums sistēmā.
Parasti šāds modulis manto klasi:
PaymentModule
Pēc maksājuma apstiprināšanas tiek izsaukta pasūtījuma izveides metode:
$this->module->validateOrder(...);
Bankas pārskaitījumam pasūtījums parasti saņem statusu, kas nozīmē maksājuma gaidīšanu, piemēram:
Awaiting bank wire payment
Vai arī modulis var izveidot savu statusu, piemēram:
Awaiting geo bank transfer payment
Veikala administratoram ir svarīgi saprast: šāds modulis automātiski nenoņem naudu no pircēja kartes vai konta. Tas tikai izveido pasūtījumu un parāda pircējam bankas rekvizītus. Faktiskais maksājuma saņemšanas fakts tiek pārbaudīts manuāli bankas kontā.
Lai administrators varētu pārvaldīt moduli bez PHP koda labošanas, ir vēlams izveidot iestatījumu lapu Back Office sadaļā.
Minimālais iestatījumu komplekts:
Atļauto valstu lauka piemērs:
LV,LT,EE,SE,FI
Noderīgi ir pievienot arī atkļūdošanas režīmu:
Debug mode: Yes / No
Atkļūdošanas režīmā modulis var pierakstīt tehnisko informāciju:
IP: 85.xxx.xxx.xxx
Detected country: LV
Payment visible: yes
PrestaShop 1.7 maksājuma veids tiek parādīts checkout procesā maksājuma izvēles solī.
Pircējam vajadzētu redzēt aptuveni šādu variantu:
Pay by bank transfer
Your order will be processed after payment is received.
Pēc maksājuma veida izvēles un pasūtījuma apstiprināšanas pircējs nonāk apstiprinājuma lapā, kur redz bankas rekvizītus:
Order confirmed
Please transfer the total amount to the following bank account:
IBAN: ...
SWIFT: ...
Bank: ...
Veikala administrators pasūtījumu redz Back Office sadaļā, bet pircējs saņem e-pastu ar maksājuma instrukciju.
Kad modulis ir gatavs, tas jāiepako ZIP arhīvā.
Pareiza arhīva struktūra:
sollerwiregeo.zip
└── sollerwiregeo/
├── sollerwiregeo.php
├── config.xml
├── vendor/
├── controllers/
├── views/
└── mails/
Svarīgi: arhīva iekšpusē jābūt moduļa mapei, nevis tikai failiem bez mapes.
Uzstādīšana caur PrestaShop administrācijas paneli:
Back Office → Modules → Module Manager → Upload a module
Pēc uzstādīšanas nepieciešams:
Minimālais pārbaudes saraksts:
Galvenā faila sintakses pārbaude:
php -l /path/to/prestashop/modules/sollerwiregeo/sollerwiregeo.php
PrestaShop 1.7 kešatmiņas dzēšana:
rm -rf /path/to/prestashop/var/cache/prod/*
rm -rf /path/to/prestashop/var/cache/dev/*
Iespējamie iemesli:
Ja parādās kļūda, kas saistīta ar GeoIp2 vai MaxMind klasēm, tas nozīmē, ka nav uzstādītas atkarības.
Pārbaudīt autoload failu:
ls -la /path/to/prestashop/modules/sollerwiregeo/vendor/autoload.php
Ja faila nav:
cd /path/to/prestashop/modules/sollerwiregeo
composer install --no-dev
Pārbaudīt failu:
ls -lh /home/shop/private/geoip/GeoLite2-Country.mmdb
Pārbaudīt tiesības visā ceļā:
namei -l /home/shop/private/geoip/GeoLite2-Country.mmdb
PHP lietotājam jābūt tiesībām nolasīt datubāzes failu.
Tas var notikt, ja vietne darbojas caur proxy, CDN vai Cloudflare. Šādā gadījumā REMOTE_ADDR var būt starpservera IP adrese, nevis pircēja IP adrese.
Iespējamās galvenes:
HTTP_CF_CONNECTING_IP
X-Forwarded-For
Tās jāizmanto tikai pareizi konfigurēta uzticama proxy gadījumā. Pretējā gadījumā ļaunprātīgs lietotājs var ievietot patvaļīgu IP adresi galvenē.
Šādā gadījumā jāpārbauda:
validation.php;validateOrder() izsaukums;Modulis strādā ar pircēja IP adresi, tāpēc ir svarīgi ievērot vairākus noteikumus:
Droša shēma veikala administratoram izskatās šādi:
/modules/ direktorijā.Pirms jebkādām izmaiņām dzīvajā vietnē vēlams izveidot rezerves kopiju:
cp -a /path/to/prestashop/modules/sollerwiregeo \
/path/to/prestashop/modules/sollerwiregeo.bak.$(date +%F-%H%M%S)
Lai strādātu ar šādu moduli, nav obligāti jābūt profesionālam programmētājam, bet jāzina pamata lietas:
modules mape;Ja veikals darbojas uz VPS, administratoram vēlams nodrošināt piekļuvi:
Maksājumu modulis ar pircēja valsts ierobežojumu ir praktisks risinājums veikaliem, kuriem nepieciešams elastīgi pārvaldīt pieejamos maksājuma veidus. To var izveidot pēc standarta bankas pārskaitījuma loģikas, bet labāk noformēt kā atsevišķu neatkarīgu moduli.
Galvenie šāda risinājuma elementi:
PaymentModule;validateOrder();public_html;Šāda pieeja ļauj nesabojāt standarta bankas pārskaitījuma moduli, neiejaukties PrestaShop kodolā un saglabāt iespēju drošāk atjaunināt veikalu nākotnē.
SOLLER.LV palīdz izveidot un pielāgot PrestaShop moduļus: maksājumu veidus, piegādes integrācijas, preču importu, GeoIP ierobežojumus, checkout loģiku un e-komercijas automatizācijas risinājumus.