cardpay / php-sdk
CardPay PHP SDK
Requires
- php: >=5.6
Requires (Dev)
- fzaninotto/faker: ^1.6
- phpunit/phpunit: ^5.7
This package is not auto-updated.
Last update: 2020-01-28 11:22:31 UTC
README
请使用Cardpay API v3的PHP SDK代替。
CardPay API的PHP SDK
API文档
先决条件
安装
使用composer
composer require cardpay/php-sdk:@stable
用法
目录
1. 配置
~$ vim config.php
<?php use \CardPay\Core\CardPayConfig; return (new CardPayConfig(CardPayMode::TEST)) ->setWalletId(1234) ->setSecretKey('YourSecretWord') ->setClientLogin("YourLoginForPaymentManager") ->setClientPasswordSHA256("YourPasswordForPaymentManagerEncodedWithSHA256") ->setRestApiLogin("YourLoginForUsingRestApi") ->setRestApiPassword("YourPasswordForUsingRestApi") ->setLogFilepath(__DIR__.'/cardpay.log');
2. 支付页面模式
支付页面模式用于商家选择使用我们的支付页面时。客户将从商家的网站重定向到我们的支付页面输入卡信息。客户在我们支付页面上输入的数据受到CardPay的保护和管理,并符合PCI DSS标准。所有客户数据都通过安全连接发送。
2.1. 简单支付
<?php use \CardPay\Core\CardPayPaymentPageMode; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayPaymentPageMode = new CardPayPaymentPageMode(); $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ->setDescription("Payment description") ->setCurrency("USD") ->setAmount(100) ->setEmail("payment@your-domain.com") ->setCustomerId('John Doe') ->setIsTwoPhase(false) ->setLocale("en") ->setNote("Payment note") ->setReturnUrl("https://www.your-domain.com/return_page.php"); echo $cardPayPaymentPageMode->getSimpleForm(); exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
2.2. 授权支付
第一步
金额不会被扣款,只会被冻结。
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... ->setIsTwoPhase(true); echo $cardPayPaymentPageMode->getSimpleForm(); ...
第二步
使用更改订单状态
2.3. 周期性支付
您可以通过发送具有“recurring_begin”属性且值为“true”的常规订单来开始循环支付,然后无需让持卡人再次输入卡信息,即可重复使用同一张卡进行支付。为此,您需要从支付结果XML中获取“recurring_id”属性的值,或者在支付管理器的“循环计费”部分中找到它。当您使用“recurring_id”继续循环支付时,因为使用的卡与开始循环时相同,所以不会显示支付页面。
第一步
可以使用响应中的recurring_id稍后重复支付。
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... ->setRecurringBegin(true); echo $cardPayPaymentPageMode->getSimpleForm(); ...
第二步
之前已发送的重复支付。
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... ->setRecurringId(12345); echo $cardPayPaymentPageMode->getSimpleForm(); ...
2.4. 使用令牌支付
卡令牌功能几乎与循环支付相同,但不同之处在于在这种情况下,每次支付都是在持卡人到场的情况下进行的,并且如果可用,则需要CVV2/CVC2和3-D Secure。您可以通过发送具有“generate_card_token”属性且值为“true”的常规订单来获取卡令牌。生成的卡令牌仅在回调中发送,并且仅在支付成功的情况下发送。每次请求令牌时,即使是对同一张卡,也会生成新的令牌。要使用卡令牌,您可以在“card_token”属性中发送它,这样客户就无需再次输入卡信息,只需CVV2/CVC2,如果需要,则通过3-D Secure。
第一步
卡令牌将在响应或通知XML中生成并返回。
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... ->setGenerateCardToken(true); echo $cardPayPaymentPageMode->getSimpleForm(); ...
第二步
使用卡令牌代替卡信息。
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... ->setCardToken(123456789); echo $cardPayPaymentPageMode->getSimpleForm(); ...
2.5. 获取orderXML和SHA512
... $cardPayPaymentPageMode ->setConfig($config) ->setOrderId("1234567890") ... $base64Encode = true; echo $cardPayPaymentPageMode->getOrderXML($base64Encode); echo $cardPayPaymentPageMode->getSHA512(); ...
2.6. 添加收货地址
... $cardPayAddress = new CardPayAddress(); $cardPayAddress ->setCountry("USA") ->setState("NY") ->setZip("1234") ->setCity("New York") ->setStreet("Central Park, Big tree, Second branch") ->setPhone("+11123455678"); $cardPayPaymentPageMode->setShipping($cardPayAddress); ...
2.7. 添加购物车商品
... $cardPayItemOne = new CardPayItem(); $cardPayItemOne ->setName("Product 1") ->setDescription("Best product 1") ->setCount(2) ->setPrice("10.11"); $cardPayItemTwo = new CardPayItem(); $cardPayItemTwo ->setName("Product 2") ->setDescription("Best product 2") ->setCount(3) ->setPrice("20.11"); $cardPayItemThree = new CardPayItem(); $cardPayItemThree ->setName("Product 3") ->setDescription("Best product 3") ->setCount(1) ->setPrice("30.11"); $cardPayPaymentPageMode->setItems([ $cardPayItemOne, $cardPayItemTwo, $cardPayItemThree, ]); ...
示例
vim .sample/paymentPageMode.php
3. 网关模式
在网关模式下,客户在商户网站上输入信用卡数据,订单从商户发送到CardPay服务器。在这种情况下,商户必须在网站上收集持卡人数据,并且该网站必须通过PCI DSS认证,然后将它作为POST请求发送到CardPay支付端点。
作为对商户请求的响应,CardPay服务器会发送客户应该被重定向到的URL。当支付完成后,客户将被重定向回商店的预定义URL之一。此外,还将发送回调和/或电子邮件通知。
3.1. 简单支付
<?php use CardPay\Core\CardPayCard; use CardPay\Core\CardPayGatewayMode; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayGatewayMode = new CardPayGatewayMode(); $cardPayGatewayMode ->setConfig($config); ->setOrderId("1234567890") ->setDescription("Payment description") ->setCurrency("USD") ->setAmount(100) ->setEmail("payment@your-domain.com") ->setCustomerId("John Doe") ->setIsTwoPhase(false) ->setNote("Payment note") ->setReturnUrl("https://www.your-domain.com/return_page.php"); $cardPayCard = new CardPayCard(); $cardPayCard ->setCardNumber("4000000000000077") ->setCardholderName("John Doe") ->setExpirationDate( "2025", "12") ->setCvc("123"); $cardPayGatewayMode->setCard($cardPayCard); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
3.2. 授权支付
第一步
金额不会被扣款,只会被冻结。
... $cardPayGatewayMode ->setOrderId("1234567890") ... ->setIsTwoPhase(true); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); ...
第二步
使用更改订单状态
3.3. 循环支付
您可以通过发送带有“recurring_begin”属性且值为“true”的常规订单来开始周期性支付,然后无需让持卡人再次输入卡信息,即可使用同一张卡重复付款。为此,您需要从支付结果XML中获取“recurring_id”属性的值,或者在支付管理器的“周期性账单”部分中找到它。当您使用“recurring_id”继续周期性支付时,可以省略orderXML中的“order/card”标签,因为使用的卡与开始周期性支付时相同。此外,在周期性支付中,不再使用重定向XML,而是将支付结果XML作为响应发送。
第1步
可以使用响应中的recurring_id稍后重复支付。
... $cardPayGatewayMode ->setOrderId("1234567890") ... ->setRecurringBegin(true); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); ...
第2步
之前已发送的重复支付。
... $cardPayGatewayMode ->setOrderId("1234567890") ... ->setRecurringId(12345); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); ...
3.4. 使用令牌支付
卡令牌功能几乎与周期性支付相同,但不同之处在于在这种情况下,每次付款都要求持卡人现场进行,如果可用,则需要CVV2/CVC2和3-D Secure。您可以通过发送带有“generate_card_token”属性且值为“true”的常规订单来获取卡令牌。生成的卡令牌仅在回调中发送,并且仅在支付成功的情况下发送。每次请求令牌时,即使是同一张卡,也会生成一个新的令牌。要使用卡令牌,您可以在“card_token”属性中发送它,在这种情况下,“order/card”标签必须只包含“cvv”字段。
第1步
卡令牌将在响应或通知XML中生成并返回。
... $cardPayGatewayMode ->setOrderId("1234567890") ... ->setGenerateCardToken(true); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); ...
第2步
使用卡令牌代替卡信息。
... $cardPayGatewayMode ->setOrderId("1234567890") ... ->setCardToken(123456789); $cardPayGatewayMode ->sendRequest() ->parseResponse(); header("Location: " . $cardPayGatewayMode->getRedirectUrl()); ...
3.5. 获取orderXML和SHA512
... $cardPayGatewayMode ->setOrderId("1234567890") ... $base64Encode = true; echo $cardPayGatewayMode->getOrderXML($base64Encode); echo $cardPayGatewayMode->getSHA512(); ...
3.6. 添加收货地址
... $cardPayAddress = new CardPayAddress(); $cardPayAddress ->setCountry("USA") ->setState("NY") ->setZip("1234") ->setCity("New York") ->setStreet("Central Park, Big tree, Second branch") ->setPhone("+11123455678"); $cardPayGatewayMode->setShipping($cardPayAddress); ...
3.7. 添加账单地址
... $cardPayAddress = new CardPayAddress(); $cardPayAddress ->setCountry("USA") ->setState("NY") ->setZip("1234") ->setCity("New York") ->setStreet("Central Park, Big tree, Second branch") ->setPhone("+11123455678"); $cardPayGatewayMode->setBilling($cardPayAddress); ...
3.8. 添加购物车商品
... $cardPayItemOne = new CardPayItem(); $cardPayItemOne ->setName("Product 1") ->setDescription("Best product 1") ->setCount(2) ->setPrice("10.11"); $cardPayItemTwo = new CardPayItem(); $cardPayItemTwo ->setName("Product 2") ->setDescription("Best product 2") ->setCount(3) ->setPrice("20.11"); $cardPayItemThree = new CardPayItem(); $cardPayItemThree ->setName("Product 3") ->setDescription("Best product 3") ->setCount(1) ->setPrice("30.11"); $cardPayGatewayMode->setItems([ $cardPayItemOne, $cardPayItemTwo, $cardPayItemThree, ]); ...
示例
~$ vim /sample/gatewayMode.php
4. 回调
交易处理完成后,支付结果XML将发送到商家提供的回调URL。只有CardPay经理可以设置或更改回调URL。
回调URL可能包含类似于返回URL的URL占位符,但请注意,设置到这些占位符的值未经摘要签名,不应用于做出决策,仅供优化使用。要更改订单状态,您需要在sha512摘要验证后从orderXML中获取状态、ID和其他字段。
回调总是在收到订单并更改状态后发送。如果未交付,则回调将重复。如果收到成功代码(200),则回调将被标记为已送达。您还可以在响应中打印一些固定文本(例如:“OK”),然后通知CardPay经理,只有当收到成功代码(200)和预期文本时,回调才被标记为已送达。
<?php use \CardPay\Core\CardPayCallback; use \CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayCallback = new CardPayCallback(); $cardPayCallback ->setConfig($config) ->setRequest($_REQUEST) ->parseRequest(); switch (true) { case $cardPayCallback->isApproved(): ... break; case $cardPayCallback->isPending(): ... break; case $cardPayCallback->isDeclined(): case $cardPayCallback->isVoided(): case $cardPayCallback->isRefunded(): case $cardPayCallback->isChargeback(): case $cardPayCallback->isChargebackResolved(): ... break; } header("HTTP/1.1 200 OK"); echo "OK"; } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); header($_SERVER["SERVER_PROTOCOL"] . " 500 Internal Server Error", true, 500); } exit;
示例
~$ vim /sample/callback.php
5. 更改订单状态
此方法允许您更改订单状态。它允许捕捉两阶段交易、在可能的情况下取消交易或部分或全额退款。
认证
使用此服务,您需要支付管理员的用户登录和SHA-256十六进制编码的密码摘要。此服务仅影响此用户可修改的订单。
注意:强烈建议存储您的密码摘要。请不要为每次请求重新计算密码摘要!
5.1. 捕获授权支付
<?php use CardPay\Core\CardPayChangeOrderStatus; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayChangeOrderStatus = new CardPayChangeOrderStatus($config); $cardPayChangeOrderStatus ->setConfig($config) ->setOrderId("756013") ->setCaptureStatus(); $cardPayChangeOrderStatus ->sendRequest() ->parseResponse(); if ($cardPayChangeOrderStatus->isExecuted()) { ... } else { ... echo $cardPayChangeOrderStatus->getDetails(); } exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
示例
~$ vim /sample/changeOrderStatusCapture.php
5.2. 取消授权支付
... $cardPayChangeOrderStatus ->setConfig($config) ->setOrderId("756013") ->setVoidStatus(); $cardPayChangeOrderStatus ->sendRequest() ->parseResponse(); if ($cardPayChangeOrderStatus->isExecuted()) { ... } else { ... echo $cardPayChangeOrderStatus->getDetails(); } ...
示例
~$ vim /sample/changeOrderStatusVoid.php
5.3. 退款支付
... $cardPayChangeOrderStatus ->setConfig($config) ->setOrderId("756529") ->setRefundStatus() ->setRefundReason("Out of stock"); $cardPayChangeOrderStatus ->sendRequest() ->parseResponse(); if ($cardPayChangeOrderStatus->isExecuted()) { ... } else { ... echo $cardPayChangeOrderStatus->getDetails(); } ...
示例
~$ vim /sample/changeOrderStatusRefund.php
6. 支付报告
6.1. 获取支付列表
获取一段时间内的支付列表。此服务将仅返回此用户可查看的支付信息。
<?php use CardPay\Core\CardPayPaymentsReport; use CardPay\Core\CardPayTransaction; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayPaymentsReport = new CardPayPaymentsReport(); $cardPayPaymentsReport ->setConfig($config) ->setStartTimestampMilliseconds(strtotime("-7 days") . "000") ->setEndTimestampMilliseconds(time() . "000") //->setOrderId(123456789) ->setMaxCount(10000); $cardPayPaymentsReport ->sendRequest() ->parseResponse(); $transactions = $cardPayPaymentsReport->getTransactions(); /** @var CardPayTransaction $transaction */ foreach ($transactions as $transaction) { switch (true) { case $transaction->isApproved(): ... break; case $transaction->isInProgress(): case $transaction->isPending(): ... break; case $transaction->isDeclined(): case $transaction->isVoided(): case $transaction->isRefunded(): case $transaction->isChargeback(): case $transaction->isChargebackResolved(): ... break; } } exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
示例
~$ vim /sample/paymentsReport.php
6.2. 支付状态
使用此调用通过其ID获取支付状态。
<?php use CardPay\Core\CardPayPaymentReport; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayPaymentReport = new CardPayPaymentReport(); $cardPayPaymentReport ->setConfig($config) ->setTransactionId(123456); $cardPayPaymentReport ->sendRequest() ->parseResponse(); $transaction = $cardPayPaymentReport->getTransaction(); switch (true) { case $transaction->isApproved(): ... break; case $transaction->isInProgress(): case $transaction->isPending(): ... break; case $transaction->isDeclined(): case $transaction->isVoided(): case $transaction->isRefunded(): case $transaction->isChargeback(): case $transaction->isChargebackResolved(): ... break; } exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
示例
~$ vim /sample/paymentReport.php
7. 退款报告
7.1. 获取退款列表
获取一段时间内的退款列表。此服务将仅返回此用户可查看的退款信息。
<?php use CardPay\Core\CardPayRefundsReport; use CardPay\Core\CardPayTransaction; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayRefundsReport = new CardPayRefundsReport(); $cardPayRefundsReport ->setConfig($config) ->setStartTimestampMilliseconds(strtotime("-7 days") . "000") ->setEndTimestampMilliseconds(time() . "000") //->setOrderId(1489398769) ->setMaxCount(10000); $cardPayRefundsReport ->sendRequest() ->parseResponse(); $transactions = $cardPayRefundsReport->getTransactions(); foreach ($transactions as $transaction) { switch (true) { case $transaction->isApproved(): ... break; case $transaction->isInProgress(): ... break; case $transaction->isDeclined(): case $transaction->isVoided(): ... break; } } exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
示例
~$ vim /sample/refundsReport.php
7.2. 退款状态
使用此调用通过其ID获取退款状态。
<?php use CardPay\Core\CardPayRefundReport; use CardPay\Exception\CardPayLoggerException; use CardPay\Log\CardPayLogger; try { $config = require_once(__DIR__ . "/config.php"); $cardPayPaymentReport = new CardPayRefundReport(); $cardPayPaymentReport ->setConfig($config) ->setTransactionId(123456); $cardPayPaymentReport ->sendRequest() ->parseResponse(); $transaction = $cardPayPaymentReport->getTransaction(); switch (true) { case $transaction->isApproved(): ... break; case $transaction->isInProgress(): ... break; case $transaction->isDeclined(): case $transaction->isVoided(): ... break; } exit; } catch (CardPayLoggerException $e) { exit("{$e->getMessage()} in {$e->getTraceAsString()}"); } catch (\Exception $e) { CardPayLogger::log($e->getMessage(), $e->getTraceAsString()); }
示例
~$ vim /sample/refundReport.php
单元测试
~$ composer update ~$ php ./vendor/bin/phpunit