maikealame/moip-sdk-php

PHP 客户端,用于与 Moip v2 API 的 server-side 集成

v3.1.0 2018-01-29 13:31 UTC

README

MoIP v2 PHP 客户端 SDK [分支]

当前仓库自 2018 年起未维护,您可以在此通过官方文档进行更新贡献

将 Moip 集成到 PHP 应用程序的最简单快捷方式

SDK 当前状态

Scrutinizer Code Quality Code Climate Codacy Badge StyleCI Build Status

统计信息

Total Downloads Monthly Downloads

版本

Latest Stable Version Latest Unstable Version

索引

依赖项

require

  • PHP >= 5.5
  • rmccue/requests >= 1.0

require-dev

  • phpunit/phpunit ~ 4.0

安装

在您的 shell 中执行

composer require moip/moip-sdk-php

配置认证

通过 Basic Auth

require 'vendor/autoload.php';

use Moip\Moip;
use Moip\Auth\BasicAuth;

$token = '01010101010101010101010101010101';
$key = 'ABABABABABABABABABABABABABABABABABABABAB';

$moip = new Moip(new BasicAuth($token, $key), Moip::ENDPOINT_SANDBOX);

通过 OAuth

require 'vendor/autoload.php';

use Moip\Moip;
use Moip\Auth\OAuth;

$access_token = '33031e2aad484051b89030487e59d133_v2';
$moip = new Moip(new OAuth($access_token), Moip::ENDPOINT_SANDBOX);

客户

创建买家

在此示例中,将创建一个包含客户数据的订单 - 包含送货和支付地址。

$customer = $moip->customers()->setOwnId(uniqid())
    ->setFullname('Fulano de Tal')
    ->setEmail('fulano@email.com')
    ->setBirthDate('1988-12-30')
    ->setTaxDocument('22222222222')
    ->setPhone(11, 66778899)
    ->addAddress('BILLING',
        'Rua de teste', 123,
        'Bairro', 'Sao Paulo', 'SP',
        '01234567', 8)
    ->addAddress('SHIPPING',
                'Rua de teste do SHIPPING', 123,
                'Bairro do SHIPPING', 'Sao Paulo', 'SP',
                '01234567', 8)
    ->create();
print_r($customer);

查询买家数据

$customer = $moip->customers()->get('CUS-Q3BL0CAJ2G33');
print_r($customer);

添加信用卡

$customer = $moip->customers()->creditCard()
    ->setExpirationMonth('05')
    ->setExpirationYear(2018)
    ->setNumber('4012001037141112')
    ->setCVC('123')
    ->setFullName('Jose Portador da Silva')
    ->setBirthDate('1988-12-30')
    ->setTaxDocument('CPF', '33333333333')
    ->setPhone('55','11','66778899')
    ->create(CUSTOMER_ID);
print_r($customer);

删除信用卡

$moip->customers()->creditCard()->delete(CREDIT_CARD_ID);

订单

使用我们刚刚创建的买家创建订单

在此示例中包含多个产品,并指定运费、附加费和折扣值。

$order = $moip->orders()->setOwnId(uniqid())
    ->addItem("bicicleta 1",1, "sku1", 10000)
    ->addItem("bicicleta 2",1, "sku2", 11000)
    ->addItem("bicicleta 3",1, "sku3", 12000)
    ->addItem("bicicleta 4",1, "sku4", 13000)
    ->addItem("bicicleta 5",1, "sku5", 14000)
    ->addItem("bicicleta 6",1, "sku6", 15000)
    ->addItem("bicicleta 7",1, "sku7", 16000)
    ->addItem("bicicleta 8",1, "sku8", 17000)
    ->addItem("bicicleta 9",1, "sku9", 18000)
    ->addItem("bicicleta 10",1, "sku10", 19000)
    ->setShippingAmount(3000)->setAddition(1000)->setDiscount(5000)
    ->setCustomer($customer)
    ->create();
print_r($order);

查询订单

特定订单

$order = $moip->orders()->get('ORD-KZCH1S1ORAH23');
print_r($order);

所有订单

无筛选
$orders = $this->moip->orders()->getList();
有筛选
$filters = new Filters();
$filters->greaterThanOrEqual(OrdersList::CREATED_AT, '2017-08-17');
$filters->in(OrdersList::PAYMENT_METHOD, ['BOLETO', 'DEBIT_CARD']);
$filters->lessThan(OrdersList::VALUE, 100000);

$orders = $this->moip->orders()->getList(null, $filters);
分页
$orders = $this->moip->orders()->getList(new Pagination(10,0));
查询特定值
$orders = $this->moip->orders()->getList(null, null, 'josé silva');

也可以同时使用分页、筛选和查询特定值

$filters = new Filters();
$filters->greaterThanOrEqual(OrdersList::CREATED_AT, '2017-08-17');
$filters->lessThan(OrdersList::VALUE, 100000);

$orders = $this->moip->orders()->getList(new Pagination(10,0), $filters, 'josé silva');

支付

创建

信用卡

创建订单后,只需在该订单中创建支付即可。

插入持卡人数据

当通过信用卡进行支付,使用第三方的信用卡(当客户不是使用的信用卡持卡人)时,需要确保这些数据在每个步骤中都是区分开来并正确地提供。

$holder = $moip->holders()->setFullname('Jose Silva')
    ->setBirthDate("1990-10-10")
    ->setTaxDocument('22222222222', 'CPF')
    ->setPhone(11, 66778899, 55)
    ->setAddress('BILLING', 'Avenida Faria Lima', '2927', 'Itaim', 'Sao Paulo', 'SP', '01234000', 'Apt 101');
带散列

有关使用卡数据生成散列的更多详细信息,请参阅文档。

$hash = 'i1naupwpTLrCSXDnigLLTlOgtm+xBWo6iX54V/hSyfBeFv3rvqa1VyQ8/pqWB2JRQX2GhzfGppXFPCmd/zcmMyDSpdnf1GxHQHmVemxu4AZeNxs+TUAbFWsqEWBa6s95N+O4CsErzemYZHDhsjEgJDe17EX9MqgbN3RFzRmZpJqRvqKXw9abze8hZfEuUJjC6ysnKOYkzDBEyQibvGJjCv3T/0Lz9zFruSrWBw+NxWXNZjXSY0KF8MKmW2Gx1XX1znt7K9bYNfhA/QO+oD+v42hxIeyzneeRcOJ/EXLEmWUsHDokevOkBeyeN4nfnET/BatcDmv8dpGXrTPEoxmmGQ==';
$payment = $order->payments()
    ->setCreditCardHash($hash, $holder)
    ->setInstallmentCount(3)
    ->setStatementDescriptor('teste de pag')
    ->execute();
print_r($payment);
带卡数据

此方法需要 PCI 认证。请参阅文档。

$payment = $order->payments()->setCreditCard(12, 21, '4073020000000002', '123', $holder)
    ->execute();
print_r($payment);

创建带支票的支付

$logo_uri = 'https://cdn.moip.com.br/wp-content/uploads/2016/05/02163352/logo-moip.png';
$expiration_date = new DateTime();
$instruction_lines = ['INSTRUÇÃO 1', 'INSTRUÇÃO 2', 'INSTRUÇÃO 3'];
$payment = $order->payments()  
    ->setBoleto($expiration_date, $logo_uri, $instruction_lines)
    ->execute();
print_r($payment);

创建银行借记支付

在线银行借记支付不收取任何费用,也仅发送3个参数

  • 您希望显示的logo的URL,以下用变量表示:$return_uri;
  • 到期日,用变量 $expiration_date 表示;
  • 银行编号,用变量 $bank_number 表示(目前可能的唯一值是 341,代表巴西伊塔乌银行)。
$bank_number = '341';
$return_uri = 'https://moip.com.br';
$expiration_date = new DateTime();
$payment = $order->payments()                    
    ->setOnlineBankDebit($bank_number, $expiration_date, $return_uri)
    ->execute();
print_r($payment);

查询

$payment = $moip->payments()->get('PAYMENT-ID');
print_r($payment);

捕获预先授权的支付

$captured_payment = $payment->capture();
print_r($captured_payment);

取消预先授权的支付

用于取消预先授权支付的 avoid 方法已被 cancel 方法取代。

$payment = $payment->cancel();
print_r($payment);

退款

要进行退款,需要具有要退款的 Payment 对象或仅传递支付ID。

信用卡

总金额

使用对象
$refund = $payment->refunds()->creditCardFull();
print_r($refund);

部分金额

使用对象
$refund = $payment->refunds()->creditCardPartial(30000);
print_r($refund);

银行账户

总金额

使用对象
$type = 'CHECKING';
$bank_number = '001';
$agency_number = 4444444;
$agency_check_number = 2;
$account_number = 1234;
$account_check_number = 4;
$refund = $payment->refunds()
    ->bankAccountFull(
        $type,
        $bank_number,
        $agency_number,
        $agency_check_number,
        $account_number,
        $account_check_number,
        $customer
    );
print_r($refund);

部分金额

使用对象
$amount = 30000;
$type = 'SAVING';
$bank_number = '001';
$agency_number = 4444444;
$agency_check_number = 2;
$account_number = 1234;
$account_check_number = 4;
$refund = $payment->refunds()
    ->bankAccountPartial(
        $amount,
        $type,
        $bank_number,
        $agency_number,
        $agency_check_number,
        $account_number,
        $account_check_number,
        $customer
    );
print_r($refund);

查询退款

$refund = $payment->refunds()->get($refund_id);

OAuth (Moip Connect)

请求用户访问权限

为了请求权限,您需要调用 getAuthUrl 方法(该方法构建URL)并将用户重定向到生成的URL。用户需要授予权限,然后将被重定向到您的App指定的URL,并将其作为属性传递给Connect对象。

作为属性的URL必须与创建APP时注册的URL完全相同,如果存在任何差异,用户将无法正确重定向。

一旦授予权限,您将收到一个 code,这将允许您生成用于认证的 accessToken 并处理涉及其他用户的需求。

$redirect_uri = 'http://seusite.com.br/callback.php';
$client_id = 'APP-18JTHC3LOMT9';
$scope = true;
$connect = new Connect($redirect_uri, $client_id, $scope, Connect::ENDPOINT_SANDBOX);
$connect->setScope(Connect::RECEIVE_FUNDS)
    ->setScope(Connect::REFUND)
    ->setScope(Connect::MANAGE_ACCOUNT_INFO)
    ->setScope(Connect::RETRIEVE_FINANCIAL_INFO);
header('Location: '.$connect->getAuthUrl());

生成 OAuth 访问令牌

下面我们将使用 authorize 方法生成 OAuth access token。请注意,必须实例化 Connect 对象并按以下示例传递参数。

我们使用变量 $code 发送通过用户权限收到的 code 并使用 setCode 方法将其插入对象中。

作为属性的URL必须与创建APP时注册的URL完全相同,如果存在任何差异,则无法恢复 accessToken。

$redirect_uri = 'http://seusite.com.br/callback.php';
$client_id = 'APP-18JTHC3LOMT9';
$scope = true;
$connect = new Connect($redirect_uri, $client_id, $scope, Connect::ENDPOINT_SANDBOX);
$client_secret = '20f76456f6ec4874a1f38082d3139326';
$connect->setClientSecret($client_secret);
$code = 'f9053ca6e9853dd73f0bc4f332a5ce337b0bb0da';
$connect->setCode($code);
$auth = $connect->authorize();
print_r($auth);

多订单

创建多订单

$order = $moip->orders()->setOwnId(uniqid())
    ->addItem("bicicleta 1",1, "sku1", 10000)
    ->addItem("bicicleta 2",1, "sku2", 11000)
    ->addItem("bicicleta 3",1, "sku3", 12000)
    ->addItem("bicicleta 4",1, "sku4", 13000)
    ->setShippingAmount(3000)
    ->setAddition(1000)
    ->setDiscount(5000)
    ->setCustomer($customer)
    ->addReceiver('MPA-VB5OGTVPCI52', 'PRIMARY', NULL);
$order2 = $moip->orders()->setOwnId(uniqid())
    ->addItem("bicicleta 1",1, "sku1", 10000)
    ->addItem("bicicleta 2",1, "sku2", 11000)
    ->addItem("bicicleta 3",1, "sku3", 12000)
    ->setShippingAmount(3000)
    ->setAddition(1000)
    ->setDiscount(5000)
    ->setCustomer($customer)
    ->addReceiver('MPA-IFYRB1HBL73Z', 'PRIMARY', NULL);

$multiorder = $this->moip->multiorders()
    ->setOwnId(uniqid())
    ->addOrder($order)
    ->addOrder($order2)
    ->create();
print_r($multiorder);

查询多订单

$multiorder_id = 'ORD-KZCH1S1ORAH25';
$multiorder = $moip->multiorders()->get($multiorder_id);
print_r($multiorder);

多支付

创建多支付

$hash = 'i1naupwpTLrCSXDnigLLTlOgtm+xBWo6iX54V/hSyfBeFv3rvqa1VyQ8/pqWB2JRQX2GhzfGppXFPCmd/zcmMyDSpdnf1GxHQHmVemxu4AZeNxs+TUAbFWsqEWBa6s95N+O4CsErzemYZHDhsjEgJDe17EX9MqgbN3RFzRmZpJqRvqKXw9abze8hZfEuUJjC6ysnKOYkzDBEyQibvGJjCv3T/0Lz9zFruSrWBw+NxWXNZjXSY0KF8MKmW2Gx1XX1znt7K9bYNfhA/QO+oD+v42hxIeyzneeRcOJ/EXLEmWUsHDokevOkBeyeN4nfnET/BatcDmv8dpGXrTPEoxmmGQ==';
$payment = $multiorder->multipayments()
    ->setCreditCardHash($hash, $customer)
    ->setInstallmentCount(3)
    ->setStatementDescriptor('teste de pag')
    ->execute();
print_r($payment);

查询

$payment = $moip->payments()->get('MULTIPAYMENT-ID');
print_r($payment);

Moip 账户

创建

$street = 'Rua de teste';
$number = 123;
$district = 'Bairro';
$city = 'Sao Paulo';
$state = 'SP';
$zip = '01234567';
$complement = 'Apt. 23';
$country = 'BRA';
$area_code = 11;
$phone_number = 66778899;
$country_code = 55;
$identity_document = '4737283560';
$issuer = 'SSP';
$issue_date = '2015-06-23';
$account = $moip->accounts()
    ->setName('Fulano')
    ->setLastName('De Tal')
    ->setEmail('fulano@email2.com')
    ->setIdentityDocument($identity_document, $issuer, $issue_date)
    ->setBirthDate('1988-12-30')
    ->setTaxDocument('16262131000')
    ->setType('MERCHANT')
    ->setPhone($area_code, $phone_number, $country_code)
    ->addAlternativePhone(11, 66448899, 55)
    ->addAddress($street, $number, $district, $city, $state, $zip, $complement, $country)        
    ->setCompanyName('Empresa Teste', 'Teste Empresa ME')
    ->setCompanyOpeningDate('2011-01-01')
    ->setCompanyPhone(11, 66558899, 55)
    ->setCompanyTaxDocument('69086878000198')
    ->setCompanyAddress('Rua de teste 2', 123, 'Bairro Teste', 'Sao Paulo', 'SP', '01234567', 'Apt. 23', 'BRA')
    ->setCompanyMainActivity('82.91-1/00', 'Atividades de cobranças e informações cadastrais')
    ->create();
print_r($account);

查询

$account = $moip->accounts()->get(ACCOUNT_ID);
print_r($account);

检查用户是否已有 Moip 账户

// retorna verdadeiro se já possui e falso caso não possuir conta Moip
$moip->accounts()->checkAccountExists(CPF);

获取 Moip 账户的公钥

$keys = $moip->keys()->get();
print_r($keys);

Moip 余额

余额是特定 Moip 账户的当前可用金额、不可用(已锁定)金额和未来金额的总和。

此API是2.1版本,包含 header Accept,值为 application/json;version=2.1

查询余额

$balances = $moip->balances()->get();

需要 OAuth 认证。

银行账户

银行账户是特定 Moip 账户的银行地址。此API允许创建、查询和修改银行账户数据。

创建银行账户

$bank_account = $moip->bankaccount()
    ->setBankNumber('237')
    ->setAgencyNumber('12345')
    ->setAgencyCheckNumber('0')
    ->setAccountNumber('12345678')
    ->setAccountCheckNumber('7')
    ->setType('CHECKING')
    ->setHolder('Demo Moip', '622.134.533-22', 'CPF')
    ->create($moip_account_id);

查询银行账户

$bank_account = $moip->bankaccount()->get($bank_account_id);

列出银行账户

$bank_accounts = $moip->bankaccount()->getList($account_id)->getBankAccounts();

更新银行账户

$bank_account = $moip->bankaccount()
    ->setAccountCheckNumber('8')
    ->update($bank_account_id);

删除银行账户

$moip->bankaccount()->delete($bank_account_id);

通知偏好

创建

$notification = $moip->notifications()->addEvent('ORDER.*')
    ->addEvent('PAYMENT.AUTHORIZED')
    ->setTarget('http://requestb.in/1dhjesw1')
    ->create();
print_r($notification);

查询

$notification = $this->moip->notifications()->get('NPR-N6QZE3223P98');
print_r($notification);

删除

$notification = $moip->notifications()->delete('NOTIFICATION-ID');
print_r($notification);

列表

$notifications = $moip->notifications()->getList();
print_r($notifications);

Webhooks

默认情况下,PHP 只能接收一些类型的 content-typeapplication/x-www-form-urlencodedmultipart/form-data)。然而,Moip 平台发送的数据格式为 JSON,而语言默认情况下无法接收。为了接收和访问 Moip 发送的数据,您需要将以下代码添加到接收 webhooks 的文件中

// Pega o RAW data da requisição
$json = file_get_contents('php://input');
// Converte os dados recebidos
$response = json_decode($json, true);

查询

无分页或按资源/事件过滤

$moip->webhooks()->get();

带分页和按资源/事件过滤

$moip->webhooks()->get(new Pagination(10, 0), 'ORD-ID', 'ORDER.PAID');

转账

转账是将资金从一个 Moip 账户转移到另一个支付账户(可以是银行账户或特定的 Moip 账户)的移动。

创建/执行转账

通过银行账户

$amount = 500;
$bank_number = '001';
$agency_number = '1111';
$agency_check_number = '2';
$account_number = '9999';
$account_check_number = '8';
$holder_name = 'Nome do Portador';
$tax_document = '22222222222';

$transfer = $moip->transfers()
    ->setTransfers($amount, $bank_number, $agency_number, $agency_check_number, $account_number, $account_check_number)
    ->setHolder($holder_name, $tax_document)
    ->execute();

print_r($transfer);

要使用已注册的银行账户进行转账

$transfer = $moip->transfers()
    ->setTransfersToBankAccount($amount, $bank_account_id)
    ->execute();

查询转账

$transfer_id = 'TRA-28HRLYNLMUFH';
$transfer = $moip->transfers()->get($transfer_id);

print_r($transfer);

列出转账

无分页

$transfers = $moip->transfers()->getList();

带分页

$transfers = $moip->transfers()->getList(new Pagination(10,0));

撤销转账

$transfer_id = 'TRA-28HRLYNLMUFH';

$transfer = $moip->transfers()->revert($transfer_id);

异常处理

当API发生错误时,将抛出 UnexpectedException 以处理意外错误,UnautorizedException 以处理认证错误,以及 ValidationException 以处理验证错误。

try {
    $moip->customers()->setOwnId(uniqid())
        ->setFullname('Fulano de Tal')
        ->setEmail('fulano@email.com')
        //...
        ->create();
} catch (\Moip\Exceptions\UnautorizedException $e) {
    //StatusCode 401
    echo $e->getMessage();
} catch (\Moip\Exceptions\ValidationException $e) {
    //StatusCode entre 400 e 499 (exceto 401)
    printf($e->__toString());
} catch (\Moip\Exceptions\UnexpectedException $e) {
    //StatusCode >= 500
    echo $e->getMessage();
}

文档

官方文档

测试

默认情况下,测试不向 Moip API 发送任何请求。可以运行测试以针对 Sandbox 环境,为此只需设置环境变量即可。

  • MOIP_ACCESS_TOKEN Moip应用程序的认证令牌。

如何注册您的Moip应用程序

要注册您的Moip应用程序,您需要使用访问密钥。 如何获取访问密钥

示例

export MOIP_ACCESS_TOKEN=76926cb0305243c8adc79aad54321ec1_v2
vendor/bin/phpunit -c .

许可

MIT许可证

Slack社区 Slack

有疑问?在我们的Slack上与我们联系!