vecera / gpwebpay

标准卡支付的门罗支付网关

5.0.3 2021-02-02 11:58 UTC

README

Build Status Test Coverage Latest Stable Version License

GPWebPay 是一个通过 GPWebPay 服务 进行在线支付的 PHP 库

如果你正在使用 Nette 框架,你可能希望使用 Pixidos/GPWebPay Nette 扩展。

快速入门

设置与使用

<?php
namespace Foo\Bar;

use Granam\GpWebPay\Settings;
use Granam\GpWebPay\DigestSigner;
use Granam\GpWebPay\CardPayResponse;
use Granam\GpWebPay\Codes\CurrencyCodes;
use Alcohol\ISO4217 as IsoCurrencies;
use Granam\GpWebPay\CardPayRequestValues;
use Granam\GpWebPay\CardPayRequest;
use Granam\GpWebPay\Exceptions\GpWebPayErrorByCustomerResponse;
use Granam\GpWebPay\Exceptions\GpWebPayErrorResponse;
use Granam\GpWebPay\Exceptions\ResponseDigestCanNotBeVerified;
use Granam\GpWebPay\Exceptions\Exception as GpWebPayException;

// SET UP
$settings = Settings::createForProduction(
    __DIR__ . '/foo/bar/your_private_key_downloaded_from_gp_web_pay.pem',
    'TopSecretPasswordForPrivateKey',
    __DIR__ . '/foo/bar/gp_web_pay_server_public_key_also_downloaded_from_gp_web_pay.pem',
    '123456789' // your 'merchant number' given to you by GP WebPay
    // without explicit URL for response the current will be used - INCLUDING query string
);
$digestSigner = new DigestSigner($settings);

// RESPONSE
if (count($_POST) > 0) {
    try {
        $response = CardPayResponse::createFromArray($_POST, $settings, $digestSigner);
    } catch(GpWebPayErrorByCustomerResponse $gpWebPayErrorByCustomerResponse) {
        // some pretty error box for customer information about HIS mistake like invalid card number
        /**
         * WARNING: do not rely blindly on this detection - for example if YOU (developer) are sending
         * card number in a hidden field, because the customer provided it to its account before and
         * does not need to enter it again, but the card number has been refused by GP WebPay,
         * you will show to the customer confusing message about an invalid card number,
         * although he does not enter it.
         * For full list of auto-detected customer
         * mistakes @see GpWebPayErrorByCustomerResponse::isErrorCausedByCustomer
         */
        echo $gpWebPayErrorByCustomerResponse->getLocalizedMessage();
    } catch(GpWebPayErrorResponse $gpWebPayErrorResponse) {
        /* GP WebPay refuses request by OUR (developer) mistake like duplicate order number
         * - show an apology to the customer and log this, solve this */
    } catch(ResponseDigestCanNotBeVerified $responseDigestCanNotBeVerified) {
        /* values in response have been changed(!),
         * show an apology (or a warning?) to the customer and probably log this for evidence */
    } catch(GpWebPayException $gpWebPayException) { // EVERY exception share this interface
        /* some generic error like processing error on GP WebPay server,
         * show an apology to the customer and log this, solve this */
    }
    /**
     * its OK, lets process $response->getParametersForDigest();
     * @see \Granam\GpWebPay\CardPayResponse::getParametersForDigest
     */
} else { // REQUEST
    $currencyCodes = new CurrencyCodes(new IsoCurrencies());
    try {
        $cardPayRequestValues = CardPayRequestValues::createFromArray($_POST, $currencyCodes);
        $cardPayRequest = new CardPayRequest($cardPayRequestValues, $settings, $digestSigner);
    } catch (GpWebPayException $exception) {
        /* show an apology to the customer
         * like "we are sorry, our payment gateway is temporarily unavailable" and log it, solve it */
        exit();
    } ?>
    <html>
    <body>
        <!-- some pretty recapitulation of the order -->
        <form method="post" action="<?= $cardPayRequest->getRequestUrl() ?>">
            <?php foreach ($cardPayRequest as $name => $value) {
                ?><input type="hidden" name="<?= $name ?>" value="<?= $value ?>"
            <?php } ?>
            <input type="submit" value="Confirm order">
       </form>
    </body>
    </html>
<?php } ?>

故障排除

几乎所有可能的错误情况都通过许多异常进行了清晰的覆盖,但也有一些是如此讨厌以至于不能

  • 在向 GP WebPay 发送请求后,你只看到一个标志,HTTP 响应代码是 401
    • 可能的原因是你在 URL 参数中提供给 GP WebPay 的 URL 在 GP WebPay 的视角中无效

对于针对 测试支付网关 的测试,你可以使用支付卡

  • 卡号:4056070000000008
  • 卡有效期:12/2020
  • CVC2:200
  • 3D Secure 密码:password

安装

composer require granam/gpwebpay

(需要 PHP 7.0+)

致谢

这个库源于 Pixidos/GPWebPay 库,它具有相同的功能,但只能作为 Nette 框架 扩展使用。所有荣誉归功于 Pixidos 的作者 Ondra Votava。

尽管如此,我对他公开分享这个库表示感激。请有更多这样的人。