geniv/nette-comgate

Nette 框架的 Comgate 包装扩展

v1.0.3 2020-11-29 15:17 UTC

This package is auto-updated.

Last update: 2024-08-29 04:20:14 UTC


README

Comgate 支付网关

灵感来自: https://github.com/renat-magadiev/comgate-client , https://github.com/LZaplata/Comgate

comgate 信息 pdf: https://www.comgate.cz/files/informacni-brozura-comgate-payments.pdf

测试支付列表: https://portal.comgate.cz/cs/testovaci-platby

API: https://platebnibrana.comgate.cz/cz/protokol-api

需要在

https://portal.comgate.cz/cs/propojeni-obchodu-detail/id/**XXmerchantIdXX**

  • 支付成功 URL
  • 取消 URL
  • 未处理 URL
  • 支付结果提交 URL
  • 允许的 IP 地址

感谢代码审查: @AdamSmid

生产环境示例 URL

重定向 URL (Comgate 重定向 GET): https://example.cz/summary/result/${id}?refId=${refId}

状态 URL (Comgate POST 检查): https://example.cz/summary/status

安装

$ composer require geniv/nette-comgate

"geniv/nette-comgate": ">=1.0.0"

要求

"php": ">=7.0.0",
"nette/nette": ">=2.4.0",
"renat-magadiev/comgate-client": "^1.0"

包含在应用程序中

neon 配置

# comgate
comgate:
    merchantId: "xxxyyy"
    secret: "******"
    sandbox: true

neon 配置扩展

extensions:
    comgate: Comgate\Bridges\Nette\Extension

创建支付演示

/** @var Comgate @inject */
public $comgate;

创建支付

try {
    // process Comgate
    $payment = $this->comgate->createPayment($values['order_price'] * 100, $values['order_id'], $values['email'], $game['name']);
    $payment->setPrepareOnly(true);

    $response = $this->comgate->sendResponse($payment);
    if ($response->isOk()) {
        // edit checkout_id
        $this->model->editItem($id, ['checkout_id' => $response->getTransId()]);
        $this->redirectUrl($response->getRedirectUrl());
    }
} catch (\Comgate\Exception\InvalidArgumentException $e) {
    Debugger::log($e);
    $this->redirect('error');
} catch (\Comgate\Exception\LabelTooLongException $e) {
    Debugger::log($e);
    $this->redirect('error');
}

支付状态

public function actionStatus()
{
    $this->getHttpResponse()->setContentType('application/javascript');
    $request = $this->getHttpRequest();
    if ($request->isMethod('POST')) {
        $transId = $request->getPost('transId');
        $status = $request->getPost('status');
        if ($transId && $status) {
            $item = $this->model->getByCheckoutId($transId);
            if ($item) {
                if ($this->model->editItem((int) $item['id'], ['status' => $status, 'checkout_date%sql' => 'NOW()', 'active' => ($status == PaymentStatus::PAID)])) {
                    $this->sendResponse(new ComgateResponse('code=0&message=OK'));
                }
                $this->sendResponse(new ComgateResponse('code=1&message=SAVE_ERROR'));
            }
            $this->sendResponse(new ComgateResponse('code=1&message=TRANS_ID_NOT_FOUND'));
        }
        $this->sendResponse(new ComgateResponse('code=1&message=MISSING_PARAMETERS'));
    }
    $this->sendResponse(new ComgateResponse('code=1&message=FAIL'));
}

支付结果

public function actionResult(string $id, string $refId)
{
    $item = $this->model->getByCheckoutId($id);
    if ($item) {
        if ($item['status'] == PaymentStatus::PAID) {
            //success
        } else {
            //danger
        }
    }
    $this->redirect('Homepage:');
}