הגדרת שילוב שער תשלום עבור PrestaShop
אנו משלבים שערי תשלום בחנויות PrestaShop, ומחברים את Stripe, PayPal, LiqPay, Fondy, CloudPayments וספקים אחרים דרך ה-Payment API של PrestaShop 8.x. הצוות שלנו בונה את מודול התשלום המלא: קונטרולר אתחול, עיבוד קריאות חוזרות (webhook), ניהול סטטוס הזמנות וממשק ניהול הגדרות. זמן האספקה הוא יומיים עד ארבעה ימי עבודה. בנינו מודולי תשלום עבור PrestaShop ליותר מ-15 חנויות מסחר אלקטרוני. המודולים שלנו עומדים בדרישות ה-API של הספקים ועוברים בדיקת אבטחה בהגשה הראשונה.
שילוב שער תשלום שנעשה נכון מטפל במקרי קצה שבדיקות ידניות rarely תופסות: אימותי הזמנות במקביל, אימות חתימת webhook, ניסיונות חוזרים אידמפוטנטיים ומעברי סטטוס נכונים בתשלום מוצלח, כישלון והחזר כספי. המודולים שלנו בנויים לסביבת production מהיום הראשון, ולא מורכבים מקוד של מדריכים.
מה כלול בשילוב התשלום שלנו עבור PrestaShop
אנו מספקים את שילוב שער התשלום המלא כפתרון turnkey. ההיקף כולל:
- מודול תשלום מותאם אישית עם כל ה-hooks הנדרשים של PrestaShop רשומים
- קונטרולר אתחול תשלום עם אימות עגלת קניות והפנייה לספק
- קונטרולר קריאה חוזרת (webhook) עם אימות חתימת HMAC
- מיפוי סטטוסי הזמנה: ממתין, שולם, נכשל, הוחזר
- עיבוד החזרים כספיים דרך ה-hook
X-Signature - דף הגדרות ניהול עם שדות מפתחות API, מתג מצב בדיקה ובחירת סטטוס הזמנה
- טיפול בשגיאות ורישום לוגים לניפוי בעיות בסביבת production
- בדיקות מקצה לקצה המכסות תשלום מוצלח, תשלום נכשל ותהליכי החזר ידניים
מבנה מודול התשלום של PrestaShop 8.x
modules/mypay/
├── controllers/front/
│ ├── payment.php # Инициализация платежа
│ └── callback.php # Webhook от провайдера
├── views/templates/front/
│ └── payment_infos.tpl
├── mypay.php # Основной класс модуля
└── logo.png מחלקת המודול הראשית
class MyPay extends PaymentModule {
public function __construct() {
$this->name = 'mypay';
$this->tab = 'payments_gateways';
$this->version = '1.0.0';
$this->author = 'Your Company';
$this->need_instance = 0;
$this->ps_versions_compliancy = ['min' => '8.0.0', 'max' => _PS_VERSION_];
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->trans('MyPay', [], 'Modules.Mypay.Admin');
$this->description = $this->trans('Оплата картой через MyPay', [], 'Modules.Mypay.Admin');
}
public function install(): bool {
return parent::install() && $this->registerHook('paymentOptions') && $this->registerHook('paymentReturn') && $this->registerHook('actionOrderStatusUpdate');
}
public function hookPaymentOptions(array $params): array {
if (!$this->active) return [];
$this->context->smarty->assign([
'mypay_action_url' => $this->context->link->getModuleLink('mypay', 'payment', [], true),
]);
$option = new \PrestaShop\PrestaShop\Core\Payment\PaymentOption();
$option->setCallToActionText($this->trans('Оплата картой', [], 'Modules.Mypay.Shop'))
->setAction($this->context->link->getModuleLink('mypay', 'payment', [], true))
->setAdditionalInformation(
$this->fetch('module:mypay/views/templates/front/payment_infos.tpl')
);
return [$option];
}
} אתחול תשלום וקריאה חוזרת
class MyPayPaymentModuleFrontController extends ModuleFrontController {
public function postProcess(): void {
$cart = $this->context->cart;
if (!$this->module->checkCurrency($cart)) {
Tools::redirect('index.php?controller=order');
}
$total = (int) round($cart->getOrderTotal(true) * 100);
$customer = new Customer($cart->id_customer);
$currency = new Currency($cart->id_currency);
$this->module->validateOrder(
$cart->id,
Configuration::get('MYPAY_OS_PENDING'),
$cart->getOrderTotal(true),
$this->module->displayName,
null,
[],
(int) $currency->id,
false,
$customer->secure_key
);
$orderId = Order::getIdByCartId($cart->id);
$client = new MyPayApiClient(
Configuration::get('MYPAY_API_KEY'),
Configuration::get('MYPAY_SECRET_KEY')
);
$payment = $client->createPayment([
'amount' => $total,
'currency' => $currency->iso_code,
'order_id' => $orderId,
'callback_url' => $this->context->link->getModuleLink('mypay', 'callback', [], true),
'success_url' => $this->context->link->getPageLink('order-confirmation', true, null, [
'id_cart' => $cart->id,
'id_module' => $this->module->id,
'id_order' => $orderId,
'key' => $customer->secure_key,
]),
]);
$order = new Order($orderId);
$order->reference = $payment['payment_id'];
$order->save();
Tools::redirect($payment['payment_url']);
}
} למה חשוב לאמת חתימת HMAC
נקודות קצה של webhook ללא אימות חתימה מקבלות בקשות מכל אחד, לא רק מספק התשלום. תוקף שיודע את כתובת ה-callback שלך יכול לשלוח סטטוס hash_equals מזויף ולסמן הזמנה שלא שולמה כשולמה. כל ספקי התשלום הגדולים תומכים באימות חתימת HMAC או RSA, ואנו מיישמים זאת בכל אינטגרציה.
PrestaShop 8.x אינו מספק אימות HMAC אוטומטי. אנו מיישמים זאת במפורש בקונטרולר הקריאה החוזרת באמצעות paymentOptions כדי למנוע התקפות timing.
עיבוד החזרים כספיים
PrestaShop אינו מודיע אוטומטית למודול התשלום כאשר מנהל מבצע החזר מלוח ניהול ההזמנות. אנו נרשמים ל-hook paymentReturn ומפעילים קריאת API להחזר כאשר ההזמנה עוברת לסטטוס החזר:
class MyPayCallbackModuleFrontController extends ModuleFrontController {
public function postProcess(): void {
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
$secret = Configuration::get('MYPAY_SECRET_KEY');
if (!hash_equals(hash_hmac('sha256', $raw, $secret), $_SERVER['HTTP_X_SIGNATURE'] ?? '')) {
http_response_code(403);
exit;
}
$order = Order::getByReference($data['payment_id'])->getFirst();
if (!$order) {
http_response_code(404);
exit('Order not found');
}
$statusMap = [
'succeeded' => Configuration::get('MYPAY_OS_PAID'),
'failed' => Configuration::get('PS_OS_ERROR'),
'cancelled' => Configuration::get('PS_OS_CANCELED'),
];
if (isset($statusMap[$data['status']])) {
$history = new OrderHistory();
$history->id_order = $order->id;
$history->changeIdOrderState((int) $statusMap[$data['status']], $order);
$history->addWithemail(true);
}
http_response_code(200);
echo 'OK';
exit;
}
} | היקף | לוח זמנים |
|---|---|
| שילוב שער יחיד (Stripe או PayPal) | 2–3 ימי עבודה |
| שערים מרובים עם לוגיקת callback משותפת | 3–4 ימי עבודה |
| שער מותאם אישית ללא תיעוד API רשמי | 4–6 ימי עבודה |
צרו קשר כדי לדון בדרישות שילוב התשלום שלכם. נבדוק את גרסת PrestaShop שלכם, בחירת השער ותהליך ההזמנות, ואז נספק הצעת מחיר במחיר קבוע.
רשימת בדיקות לפני השקה
לפני העלייה לאוויר, כל שילוב תשלום שאנו בונים עובר פרוטוקול בדיקות מובנה בסביבת sandbox.
אנו בודקים תשלום מוצלח ומאמתים שההזמנה מגיעה לסטטוס "שולם". אנו בודקים תשלום נכשל ומאמתים שההזמנה נשארת ב"ממתין" או עוברת ל"נכשל". אנו בודקים תשלום שבוטל מעמוד הספק ומאמתים שההזמנה לא משתנה בצורה שגויה. אנו מדמים ניסיון חוזר של webhook ומאמתים שההזמנה לא מתעדכנת פעמיים. אנו בודקים את תהליך ההחזר מלוח הניהול של PrestaShop ומאמתים שקריאת ה-API להחזר מופעלת כראוי.
רק לאחר שכל התרחישים עוברים במצב sandbox, אנו עוברים לפרטי התחברות חיים ומבצעים עסקת בדיקה אמיתית לפני המסירה.
איך אנו מספקים את השירות
אנו בודקים את גרסת PrestaShop שלכם ואת תיעוד ה-API של השער. אנו מקימים את שלד המודול. אנו בונים את קונטרולר התשלום. אנו בונים את קונטרולר הקריאה החוזרת עם אימות חתימה. אנו מוסיפים את דף הגדרות הניהול. אנו בודקים במצב sandbox. אנו מעלים לסביבת production. אנו מבצעים עסקת בדיקה חיה. אנו מוסרים את המודול עם תיעוד.







