vecera / gpwebpay
标准卡支付的门罗支付网关
5.0.3
2021-02-02 11:58 UTC
Requires
- php: >=7.1
- ext-intl: *
- alcohol/iso4217: ^3.1
- granam/float: >=5.0
- granam/integer: >=6.1
- granam/strict-object: >=3.0
- granam/string: >=4.0
- phpgt/dom: *
Requires (Dev)
- ext-curl: *
- granam/exceptions-hierarchy: >=4.0
- granam/tools: >=3.0
- mockery/mockery: ~1.0
- phpunit/phpunit: ^9.4
- roave/security-advisories: dev-master
- symfony/yaml: ^3.2
Suggests
- granam/gpwebpay-flat: Let's check accepted payments via GPWebPay report on daily basis
This package is auto-updated.
Last update: 2024-09-29 05:22:33 UTC
README
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 的视角中无效
- 请确保 URL 存在,并且没有 重定向,例如,从 https://www.github.com 到 https://github.com/(不要相信浏览器地址栏中的眼睛,尾部斜杠通常被隐藏在那里)
- 可能的原因是你在 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。
尽管如此,我对他公开分享这个库表示感激。请有更多这样的人。