mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Remove support for Balanced payments
Summary: See <https://www.balancedpayments.com/stripe>. Just get rid of support since Phortune is a prototype anyway. Test Plan: `grep`, poked around Phortune. Reviewers: btrahan, chad Reviewed By: chad Subscribers: aurelijus, epriestley Differential Revision: https://secure.phabricator.com/D12074
This commit is contained in:
parent
446e92e5c3
commit
7d69d8ae6a
42 changed files with 2 additions and 4122 deletions
14
externals/balanced-php/.gitignore
vendored
14
externals/balanced-php/.gitignore
vendored
|
@ -1,14 +0,0 @@
|
||||||
# composer
|
|
||||||
.buildpath
|
|
||||||
composer.lock
|
|
||||||
composer.phar
|
|
||||||
vendor
|
|
||||||
*~
|
|
||||||
*#
|
|
||||||
# phar
|
|
||||||
*.phar
|
|
||||||
|
|
||||||
# eclipse-pdt
|
|
||||||
.settings
|
|
||||||
.project
|
|
||||||
*.iml
|
|
8
externals/balanced-php/.travis.yml
vendored
8
externals/balanced-php/.travis.yml
vendored
|
@ -1,8 +0,0 @@
|
||||||
language: php
|
|
||||||
before_script:
|
|
||||||
- curl -s http://getcomposer.org/installer | php
|
|
||||||
- php composer.phar install
|
|
||||||
script: phpunit --bootstrap vendor/autoload.php --exclude-group suite tests/
|
|
||||||
php:
|
|
||||||
- 5.3
|
|
||||||
- 5.4
|
|
22
externals/balanced-php/LICENSE
vendored
22
externals/balanced-php/LICENSE
vendored
|
@ -1,22 +0,0 @@
|
||||||
Copyright (c) 2012 Balanced
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
156
externals/balanced-php/README.md
vendored
156
externals/balanced-php/README.md
vendored
|
@ -1,156 +0,0 @@
|
||||||
# Balanced
|
|
||||||
|
|
||||||
Online Marketplace Payments
|
|
||||||
|
|
||||||
[![Build Status](https://secure.travis-ci.org/balanced/balanced-php.png)](http://travis-ci.org/balanced/balanced-php)
|
|
||||||
|
|
||||||
The design of this library was heavily influenced by [Httpful](https://github.com/nategood/httpful).
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- [PHP](http://www.php.net) >= 5.3 **with** [cURL](http://www.php.net/manual/en/curl.installation.php)
|
|
||||||
- [RESTful](https://github.com/bninja/restful) >= 0.1
|
|
||||||
- [Httpful](https://github.com/nategood/httpful) >= 0.1
|
|
||||||
|
|
||||||
## Issues
|
|
||||||
|
|
||||||
Please use appropriately tagged github [issues](https://github.com/balanced/balanced-php/issues) to request features or report bugs.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
You can install using [composer](#composer), a [phar](#phar) package or from [source](#source). Note that Balanced is [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) compliant:
|
|
||||||
|
|
||||||
### Composer
|
|
||||||
|
|
||||||
If you don't have Composer [install](http://getcomposer.org/doc/00-intro.md#installation) it:
|
|
||||||
|
|
||||||
$ curl -s https://getcomposer.org/installer | php
|
|
||||||
|
|
||||||
Add this to your `composer.json`:
|
|
||||||
|
|
||||||
{
|
|
||||||
"require": {
|
|
||||||
"balanced/balanced": "*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Refresh your dependencies:
|
|
||||||
|
|
||||||
$ php composer.phar update
|
|
||||||
|
|
||||||
|
|
||||||
Then make sure to `require` the autoloader and initialize all:
|
|
||||||
|
|
||||||
<?php
|
|
||||||
require(__DIR__ . '/vendor/autoload.php');
|
|
||||||
|
|
||||||
\Httpful\Bootstrap::init();
|
|
||||||
\RESTful\Bootstrap::init();
|
|
||||||
\Balanced\Bootstrap::init();
|
|
||||||
...
|
|
||||||
|
|
||||||
### Phar
|
|
||||||
|
|
||||||
Download an Httpful [phar](http://php.net/manual/en/book.phar.php) file, which are all [here](https://github.com/nategood/httpful/downloads):
|
|
||||||
|
|
||||||
$ curl -s -L -o httpful.phar https://github.com/downloads/nategood/httpful/httpful.phar
|
|
||||||
|
|
||||||
Download a RESTful [phar](http://php.net/manual/en/book.phar.php) file, which are all [here](https://github.com/bninja/restful/downloads):
|
|
||||||
|
|
||||||
$ curl -s -L -o restful.phar https://github.com/bninja/restful/downloads/restful.phar
|
|
||||||
|
|
||||||
Download a Balanced [phar](http://php.net/manual/en/book.phar.php) file, which are all [here](https://github.com/balanced/balanced-php/downloads):
|
|
||||||
|
|
||||||
$ curl -s -L -o balanced.phar https://github.com/balanced/balanced-php/downloads/balanced-{VERSION}.phar
|
|
||||||
|
|
||||||
And then `include` all:
|
|
||||||
|
|
||||||
<?php
|
|
||||||
include(__DIR__ . '/httpful.phar');
|
|
||||||
include(__DIR__ . '/restful.phar');
|
|
||||||
include(__DIR__ . '/balanced.phar');
|
|
||||||
...
|
|
||||||
|
|
||||||
### Source
|
|
||||||
|
|
||||||
Download [Httpful](https://github.com/nategood/httpful) source:
|
|
||||||
|
|
||||||
$ curl -s -L -o httpful.zip https://github.com/nategood/httpful/zipball/master;
|
|
||||||
$ unzip httpful.zip; mv nategood-httpful* httpful; rm httpful.zip
|
|
||||||
|
|
||||||
Download [RESTful](https://github.com/bninja/restful) source:
|
|
||||||
|
|
||||||
$ curl -s -L -o restful.zip https://github.com/bninja/restful/zipball/master;
|
|
||||||
$ unzip restful.zip; mv bninja-restful* restful; rm restful.zips
|
|
||||||
|
|
||||||
Download the Balanced source:
|
|
||||||
|
|
||||||
$ curl -s -L -o balanced.zip https://github.com/balanced/balanced-php/zipball/master
|
|
||||||
$ unzip balanced.zip; mv balanced-balanced-php-* balanced; rm balanced.zip
|
|
||||||
|
|
||||||
And then `require` all bootstrap files:
|
|
||||||
|
|
||||||
<?php
|
|
||||||
require(__DIR__ . "/httpful/bootstrap.php")
|
|
||||||
require(__DIR__ . "/restful/bootstrap.php")
|
|
||||||
require(__DIR__ . "/balanced/bootstrap.php")
|
|
||||||
...
|
|
||||||
|
|
||||||
## Quickstart
|
|
||||||
|
|
||||||
curl -s http://getcomposer.org/installer | php
|
|
||||||
|
|
||||||
echo '{
|
|
||||||
"require": {
|
|
||||||
"balanced/balanced": "*"
|
|
||||||
}
|
|
||||||
}' > composer.json
|
|
||||||
|
|
||||||
php composer.phar install
|
|
||||||
|
|
||||||
curl https://raw.github.com/balanced/balanced-php/master/example/example.php > example.php
|
|
||||||
|
|
||||||
php example.php
|
|
||||||
|
|
||||||
curl https://raw.github.com/balanced/balanced-php/master/example/buyer-example.php > buyer-example.php
|
|
||||||
|
|
||||||
php -S 127.0.0.1:9321 buyer-example.php
|
|
||||||
# now open a browser and go to http://127.0.0.1:9321/ to view how to tokenize cards and add to a buyer
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
See https://www.balancedpayments.com/docs/overview?language=php for tutorials and documentation.
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
$ phpunit --bootstrap vendor/autoload.php tests/
|
|
||||||
|
|
||||||
Or if you'd like to skip network calls:
|
|
||||||
|
|
||||||
$ phpunit --exclude-group suite --bootstrap vendor/autoload.php tests/
|
|
||||||
|
|
||||||
## Publishing
|
|
||||||
|
|
||||||
1. Ensure that **all** [tests](#testing) pass
|
|
||||||
2. Increment minor `VERSION` in `src/Balanced/Settings` and `composer.json` (`git commit -am 'v{VERSION} release'`)
|
|
||||||
3. Tag it (`git tag -a v{VERSION} -m 'v{VERSION} release'`)
|
|
||||||
4. Push the tag (`git push --tag`)
|
|
||||||
5. [Packagist](http://packagist.org/packages/balanced/balanced) will see the new tag and take it from there
|
|
||||||
6. Build (`build-phar`) and upload a [phar](http://php.net/manual/en/book.phar.php) file
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
1. Fork it
|
|
||||||
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
||||||
3. Write your code **and [tests](#testing)**
|
|
||||||
4. Ensure all tests still pass (`phpunit --bootstrap vendor/autoload.php tests/`)
|
|
||||||
5. Commit your changes (`git commit -am 'Add some feature'`)
|
|
||||||
6. Push to the branch (`git push origin my-new-feature`)
|
|
||||||
7. Create new pull request
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Jacob Rus](https://github.com/jrus)
|
|
||||||
* [Leon Smith](https://github.com/leonsmith)
|
|
||||||
* [Matt Drollette](https://github.com/MDrollette)
|
|
||||||
* [You](https://github.com/balanced/balanced-php/issues)!
|
|
4
externals/balanced-php/bootstrap.php
vendored
4
externals/balanced-php/bootstrap.php
vendored
|
@ -1,4 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
require(__DIR__ . '/src/Balanced/Bootstrap.php');
|
|
||||||
\Balanced\Bootstrap::init();
|
|
36
externals/balanced-php/build-phar
vendored
36
externals/balanced-php/build-phar
vendored
|
@ -1,36 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
include('src/Balanced/Settings.php');
|
|
||||||
|
|
||||||
function exit_unless($condition, $msg = null) {
|
|
||||||
if ($condition)
|
|
||||||
return;
|
|
||||||
echo "[FAIL] $msg";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Building Phar... ";
|
|
||||||
$base_dir = dirname(__FILE__);
|
|
||||||
$source_dir = $base_dir . '/src/Balanced/';
|
|
||||||
$phar_name = 'balanced.phar';
|
|
||||||
$phar_path = $base_dir . '/' . $phar_name;
|
|
||||||
$phar = new Phar($phar_path, 0, $phar_name);
|
|
||||||
$stub = <<<HEREDOC
|
|
||||||
<?php
|
|
||||||
// Phar Stub File
|
|
||||||
Phar::mapPhar('balanced.phar');
|
|
||||||
include('phar://balanced.phar/Balanced/Bootstrap.php');
|
|
||||||
\Balanced\Bootstrap::pharInit();
|
|
||||||
|
|
||||||
__HALT_COMPILER();
|
|
||||||
HEREDOC;
|
|
||||||
$phar->setStub($stub);
|
|
||||||
exit_unless($phar, "Unable to create a phar. Make sure you have phar.readonly=0 set in your ini file.");
|
|
||||||
$phar->buildFromDirectory(dirname($source_dir));
|
|
||||||
echo "[ OK ]\n";
|
|
||||||
|
|
||||||
echo "Renaming Phar... ";
|
|
||||||
$phar_versioned_name = 'balanced-' . \Balanced\Settings::VERSION . '.phar';
|
|
||||||
$phar_versioned_path = $base_dir . '/' . $phar_versioned_name;
|
|
||||||
rename($phar_path, $phar_versioned_path);
|
|
||||||
echo "[ OK ]\n";
|
|
24
externals/balanced-php/composer.json
vendored
24
externals/balanced-php/composer.json
vendored
|
@ -1,24 +0,0 @@
|
||||||
{
|
|
||||||
"name": "balanced/balanced",
|
|
||||||
"description": "Client for Balanced API",
|
|
||||||
"homepage": "http://github.com/balanced/balanced-php",
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": ["payments", "api"],
|
|
||||||
"version": "0.7.1",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Balanced",
|
|
||||||
"email": "dev@balancedpayments.com",
|
|
||||||
"homepage": "http://www.balancedpayments.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"require": {
|
|
||||||
"nategood/httpful": "*",
|
|
||||||
"bninja/restful": "*"
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-0": {
|
|
||||||
"Balanced": "src/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
<?php
|
|
||||||
//
|
|
||||||
// Learn how to authenticate a bank account so you can debit with it.
|
|
||||||
//
|
|
||||||
|
|
||||||
require(__DIR__ . '/vendor/autoload.php');
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
// create a new marketplace
|
|
||||||
$key = new Balanced\APIKey();
|
|
||||||
$key->save();
|
|
||||||
Balanced\Settings::$api_key = $key->secret;
|
|
||||||
$marketplace = new Balanced\Marketplace();
|
|
||||||
$marketplace->save();
|
|
||||||
|
|
||||||
// create a bank account
|
|
||||||
$bank_account = $marketplace->createBankAccount("Jack Q Merchant",
|
|
||||||
"123123123",
|
|
||||||
"123123123"
|
|
||||||
);
|
|
||||||
$buyer = $marketplace->createAccount("buyer@example.org");
|
|
||||||
$buyer->addBankAccount($bank_account);
|
|
||||||
|
|
||||||
print("you can't debit from a bank account until you verify it\n");
|
|
||||||
try {
|
|
||||||
$buyer->debit(100);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
printf("Debit failed, %s\n", $e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
// authenticate
|
|
||||||
$verification = $bank_account->verify();
|
|
||||||
|
|
||||||
try {
|
|
||||||
$verification->confirm(1, 2);
|
|
||||||
} catch (Balanced\Errors\BankAccountVerificationFailure $e) {
|
|
||||||
printf('Authentication error , %s\n', $e->getMessage());
|
|
||||||
print("PROTIP: for TEST bank accounts the valid amount is always 1 and 1\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$verification->confirm(1, 1);
|
|
||||||
|
|
||||||
$debit = $buyer->debit(100);
|
|
||||||
printf("debited the bank account %s for %d cents\n",
|
|
||||||
$debit->source->uri,
|
|
||||||
$debit->amount
|
|
||||||
);
|
|
||||||
print("and there you have it");
|
|
||||||
|
|
||||||
?>
|
|
157
externals/balanced-php/example/buyer-example.php
vendored
157
externals/balanced-php/example/buyer-example.php
vendored
|
@ -1,157 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
require(__DIR__ . '/vendor/autoload.php');
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
$API_KEY_SECRET = '5f4db668a5ec11e1b908026ba7e239a9';
|
|
||||||
$page = $_SERVER['REQUEST_URI'];
|
|
||||||
Balanced\Settings::$api_key = $API_KEY_SECRET;
|
|
||||||
$marketplace = Balanced\Marketplace::mine();
|
|
||||||
|
|
||||||
if ($page == '/') {
|
|
||||||
// do nothing
|
|
||||||
} elseif ($page == '/buyer') {
|
|
||||||
if (isset($_POST['uri']) and isset($_POST['email_address'])) {
|
|
||||||
// create in balanced
|
|
||||||
$email_address = $_POST['email_address'];
|
|
||||||
$card_uri = $_POST['uri'];
|
|
||||||
try {
|
|
||||||
echo create_buyer($email_address, $card_uri)->uri;
|
|
||||||
return;
|
|
||||||
} catch (Balanced\Errors\Error $e) {
|
|
||||||
echo $e->getMessage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_buyer($email_address, $card_uri) {
|
|
||||||
$marketplace = Balanced\Marketplace::mine();
|
|
||||||
try {
|
|
||||||
# new buyer
|
|
||||||
$buyer = $marketplace->createBuyer(
|
|
||||||
$email_address,
|
|
||||||
$card_uri);
|
|
||||||
}
|
|
||||||
catch (Balanced\Errors\DuplicateAccountEmailAddress $e) {
|
|
||||||
# oops, account for $email_address already exists so just add the card
|
|
||||||
$buyer = Balanced\Account::get($e->extras->account_uri);
|
|
||||||
$buyer->addCard($card_uri);
|
|
||||||
}
|
|
||||||
return $buyer;
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css" type="text/css">
|
|
||||||
<style type="text/css">
|
|
||||||
[name="marketplace_eid"] {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
[name^="expiration"] {
|
|
||||||
width: 50px;
|
|
||||||
}
|
|
||||||
[name="security_code"] {
|
|
||||||
width: 50px;
|
|
||||||
}
|
|
||||||
code { display: block; }
|
|
||||||
pre { color: green; }
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Balanced Sample - Collect Credit Card Information</h1>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span6">
|
|
||||||
<form id="payment">
|
|
||||||
<div>
|
|
||||||
<label>Email Address</label>
|
|
||||||
<input name="email_address" value="bob@example.com">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Card Number</label>
|
|
||||||
<input name="card_number" value="4111111111111111" autocomplete="off">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Expiration</label>
|
|
||||||
<input name="expiration_month" value="1"> / <input name="expiration_year" value="2020">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Security Code</label>
|
|
||||||
<input name="security_code" value="123" autocomplete="off">
|
|
||||||
</div>
|
|
||||||
<button>Submit Payment Data</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="result"></div>
|
|
||||||
<script type="text/javascript" src="https://js.balancedpayments.com/v1/balanced.js"></script>
|
|
||||||
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
var marketplaceUri = '<?php echo $marketplace->uri; ?>';
|
|
||||||
|
|
||||||
var debug = function (tag, content) {
|
|
||||||
$('<' + tag + '>' + content + '</' + tag + '>').appendTo('#result');
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
balanced.init(marketplaceUri);
|
|
||||||
} catch (e) {
|
|
||||||
debug('code', 'You need to set the marketplaceUri variable');
|
|
||||||
}
|
|
||||||
|
|
||||||
function accountCreated(response) {
|
|
||||||
debug('code', 'account create result: ' + response);
|
|
||||||
}
|
|
||||||
|
|
||||||
function balancedCallback(response) {
|
|
||||||
var tag = (response.status < 300) ? 'pre' : 'code';
|
|
||||||
debug(tag, JSON.stringify(response));
|
|
||||||
switch (response.status) {
|
|
||||||
case 201:
|
|
||||||
// response.data.uri == uri of the card resource, submit to your server
|
|
||||||
$.post('/buyer', {
|
|
||||||
uri: response.data.uri,
|
|
||||||
email_address: $('[name="email_address"]').val()
|
|
||||||
}, accountCreated);
|
|
||||||
case 400:
|
|
||||||
case 403:
|
|
||||||
// missing/malformed data - check response.error for details
|
|
||||||
break;
|
|
||||||
case 402:
|
|
||||||
// we couldn't authorize the buyer's credit card - check response.error for details
|
|
||||||
break;
|
|
||||||
case 404:
|
|
||||||
// your marketplace URI is incorrect
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// we did something unexpected - check response.error for details
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var tokenizeCard = function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
var $form = $('form#payment');
|
|
||||||
var cardData = {
|
|
||||||
card_number: $form.find('[name="card_number"]').val(),
|
|
||||||
expiration_month: $form.find('[name="expiration_month"]').val(),
|
|
||||||
expiration_year: $form.find('[name="expiration_year"]').val(),
|
|
||||||
security_code: $form.find('[name="security_code"]').val()
|
|
||||||
};
|
|
||||||
|
|
||||||
balanced.card.create(cardData, balancedCallback);
|
|
||||||
};
|
|
||||||
|
|
||||||
$('#payment').submit(tokenizeCard);
|
|
||||||
|
|
||||||
if (window.location.protocol === 'file:') {
|
|
||||||
alert("balanced.js does not work when included in pages served over file:// URLs. Try serving this page over a webserver. Contact support@balancedpayments.com if you need assistance.");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
5
externals/balanced-php/example/composer.json
vendored
5
externals/balanced-php/example/composer.json
vendored
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"require": {
|
|
||||||
"balanced/balanced": "*"
|
|
||||||
}
|
|
||||||
}
|
|
42
externals/balanced-php/example/debit-example.php
vendored
42
externals/balanced-php/example/debit-example.php
vendored
|
@ -1,42 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
require('vendor/autoload.php');
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
$API_KEY_SECRET = '5f4db668a5ec11e1b908026ba7e239a9';
|
|
||||||
Balanced\Settings::$api_key = $API_KEY_SECRET;
|
|
||||||
$marketplace = Balanced\Marketplace::mine();
|
|
||||||
|
|
||||||
print "create a card\n";
|
|
||||||
$card = $marketplace->cards->create(array(
|
|
||||||
"card_number" => "5105105105105100",
|
|
||||||
"expiration_month" => "12",
|
|
||||||
"expiration_year" => "2015"
|
|
||||||
));
|
|
||||||
print "our card: " . $card->uri . "\n";
|
|
||||||
|
|
||||||
print "create a **buyer** account with that card\n";
|
|
||||||
$buyer = $marketplace->createBuyer(null, $card->uri);
|
|
||||||
print "our buyer account: " . $buyer->uri . "\n";
|
|
||||||
|
|
||||||
print "debit our buyer, let's say $15\n";
|
|
||||||
try {
|
|
||||||
$debit = $buyer->debit(1500);
|
|
||||||
print "our buyer debit: " . $debit->uri . "\n";
|
|
||||||
}
|
|
||||||
catch (Balanced\Errors\Declined $e) {
|
|
||||||
print "oh no, the processor declined the debit!\n";
|
|
||||||
}
|
|
||||||
catch (Balanced\Errors\NoFundingSource $e) {
|
|
||||||
print "oh no, the buyer has not active funding sources!\n";
|
|
||||||
}
|
|
||||||
catch (Balanced\Errors\CannotDebit $e) {
|
|
||||||
print "oh no, the buyer has no debitable funding sources!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print "and there you have it 8)\n";
|
|
||||||
|
|
||||||
?>
|
|
|
@ -1,59 +0,0 @@
|
||||||
<?php
|
|
||||||
/*
|
|
||||||
* Welcome weary traveller. Sick of polling for state changes? Well today have
|
|
||||||
* I got good news for you. Run this example below to see how to get yourself
|
|
||||||
* some callback goodness and to understand how events work.
|
|
||||||
*/
|
|
||||||
require(__DIR__ . "/vendor/autoload.php");
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
// create a new marketplace
|
|
||||||
$key = new Balanced\APIKey();
|
|
||||||
$key->save();
|
|
||||||
Balanced\Settings::$api_key = $key->secret;
|
|
||||||
$marketplace = new Balanced\Marketplace();
|
|
||||||
$marketplace->save();
|
|
||||||
|
|
||||||
// let"s create a requestb.in
|
|
||||||
$ch = curl_init("http://requestb.in/api/v1/bins");
|
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
|
||||||
'Content-Type: application/json',
|
|
||||||
'Content-Length: ' . 0)
|
|
||||||
);
|
|
||||||
$result = json_decode(curl_exec($ch));
|
|
||||||
$bin_name = $result->name;
|
|
||||||
$callback_url = "http://requestb.in/" . $bin_name;
|
|
||||||
$requests_url = "http://requestb.in/api/v1/bins/" . $bin_name . "/requests";
|
|
||||||
|
|
||||||
printf("let's create a callback\n");
|
|
||||||
$marketplace->createCallback($callback_url);
|
|
||||||
|
|
||||||
printf("let's create a card and associate it with a new account\n");
|
|
||||||
$card = $marketplace->cards->create(array(
|
|
||||||
"card_number" => "5105105105105100",
|
|
||||||
"expiration_month" => "12",
|
|
||||||
"expiration_year" => "2015"
|
|
||||||
));
|
|
||||||
$buyer = $marketplace->createBuyer("buyer@example.org", $card->uri);
|
|
||||||
|
|
||||||
printf("generate a debit (which implicitly creates and captures a hold)\n");
|
|
||||||
$buyer->debit(100);
|
|
||||||
|
|
||||||
foreach ($marketplace->events as $event) {
|
|
||||||
printf("this was a %s event, it occurred at %s\n",
|
|
||||||
$event->type,
|
|
||||||
$event->occurred_at
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("ok, let's check with requestb.in to see if our callbacks fired at %s\n", $callback_url);
|
|
||||||
printf("we received callbacks, you can view them at http://requestb.in/%s?inspect\n",
|
|
||||||
$bin_name
|
|
||||||
);
|
|
||||||
|
|
||||||
?>
|
|
120
externals/balanced-php/example/example.php
vendored
120
externals/balanced-php/example/example.php
vendored
|
@ -1,120 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
require('vendor/autoload.php');
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
print "create our new api key\n";
|
|
||||||
$key = new Balanced\APIKey();
|
|
||||||
$key->save();
|
|
||||||
print "Our secret is " . $key->secret . "\n";
|
|
||||||
|
|
||||||
print "configure with our secret " . $key->secret . "\n";
|
|
||||||
Balanced\Settings::$api_key = $key->secret;
|
|
||||||
|
|
||||||
print "create our marketplace";
|
|
||||||
$marketplace = new Balanced\Marketplace();
|
|
||||||
$marketplace->save();
|
|
||||||
|
|
||||||
if (Balanced\Merchant::me() == null) {
|
|
||||||
throw new Exception("Balanced\Merchant::me() should not be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
print "What's my merchant? Easy: Balanced\Merchant::me(): " . Balanced\Merchant::me()->uri . "\n";
|
|
||||||
|
|
||||||
if (Balanced\Marketplace::mine() == null) {
|
|
||||||
throw new Exception("Balanced\Marketplace::mine() should never be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
print "What's my marketplace? Easy: Balanced\Marketplace::mine(): " .Balanced\Marketplace::mine()->uri . "\n";
|
|
||||||
|
|
||||||
print "My marketplace's name is " . $marketplace->name . "\n";
|
|
||||||
print "Changing it to TestFooey\n";
|
|
||||||
$marketplace->name = "TestFooey";
|
|
||||||
$marketplace->save();
|
|
||||||
print "My marketplace name is now " . $marketplace->name . "\n";
|
|
||||||
|
|
||||||
if ($marketplace->name != "TestFooey") {
|
|
||||||
throw new Exception("Marketplace name is NOT TestFooey");
|
|
||||||
}
|
|
||||||
|
|
||||||
print "Cool, let's create a card\n";
|
|
||||||
$card = $marketplace->cards->create(array(
|
|
||||||
"card_number" => "5105105105105100",
|
|
||||||
"expiration_month" => "12",
|
|
||||||
"expiration_year" => "2015"
|
|
||||||
));
|
|
||||||
|
|
||||||
print "Our card: " . $card->uri . "\n";
|
|
||||||
|
|
||||||
print "Create out **buyer** account\n";
|
|
||||||
$buyer = $marketplace->createBuyer("buyer@example.org", $card->uri);
|
|
||||||
print "our buyer account: " . $buyer->uri . "\n";
|
|
||||||
|
|
||||||
print "hold some amount of funds on the buyer, let's say $15\n";
|
|
||||||
$the_hold = $buyer->hold(1500);
|
|
||||||
|
|
||||||
print "ok, no more holds! let's capture it (for the full amount)\n";
|
|
||||||
$debit = $the_hold->capture();
|
|
||||||
|
|
||||||
print "hmm, ho much money do i have in escrow? it should equal the debit amount\n";
|
|
||||||
$marketplace = Balanced\Marketplace::mine();
|
|
||||||
if ($marketplace->in_escrow != 1500) {
|
|
||||||
throw new Exception("1500 is not in escrow! This is wrong");
|
|
||||||
}
|
|
||||||
print "I have " . $marketplace->in_escrow . " in escrow!\n";
|
|
||||||
|
|
||||||
print "Cool. now let me refund the full amount";
|
|
||||||
$refund = $debit->refund();
|
|
||||||
|
|
||||||
print "ok, we have a merchant that's signing up, let's create an account for them first, let's create their bank account\n";
|
|
||||||
|
|
||||||
$bank_account = $marketplace->createBankAccount("Jack Q Merchant",
|
|
||||||
"123123123", /* account_number */
|
|
||||||
"123123123" /* bank_code (routing number is USA)*/
|
|
||||||
);
|
|
||||||
|
|
||||||
$identity = array(
|
|
||||||
"type" => "person",
|
|
||||||
"name" => "Billy Jones",
|
|
||||||
"street_address" => "801 High St",
|
|
||||||
"postal_code" => "94301",
|
|
||||||
"country" => "USA",
|
|
||||||
"dob" => "1979-02",
|
|
||||||
"phone_number" => "+16505551234"
|
|
||||||
);
|
|
||||||
|
|
||||||
$merchant = $marketplace->createMerchant('merchant@example.org',
|
|
||||||
$identity,
|
|
||||||
$bank_account->uri
|
|
||||||
);
|
|
||||||
|
|
||||||
print "our buyer is interested in buying something for $130\n";
|
|
||||||
$another_debit = $buyer->debit(13000, "MARKETPLACE.COM");
|
|
||||||
|
|
||||||
print "let's credit our merchant $110\n";
|
|
||||||
$credit = $merchant->credit(11000, "Buyer purchase something on Marketplace.com");
|
|
||||||
|
|
||||||
print "let's assume the marketplace charges 15%, so it earned $20\n";
|
|
||||||
$mp_credit = $marketplace->owner_account->credit(2000,
|
|
||||||
"Commission from MARKETPLACE.COM");
|
|
||||||
|
|
||||||
print "ok, let's invalidate the card used so it cannot be used again\n";
|
|
||||||
$card->is_valid = false;
|
|
||||||
$card->save();
|
|
||||||
|
|
||||||
print "how do we look up an existing object from the URI?\n";
|
|
||||||
$the_buyer = Balanced\Account::get($buyer->uri);
|
|
||||||
print "we got the buyer " . $the_buyer->email_address . "\n";
|
|
||||||
|
|
||||||
$the_debit = Balanced\Debit::get($debit->uri);
|
|
||||||
print "we got the debit: " . $the_debit->uri . "\n";
|
|
||||||
|
|
||||||
$the_credit = Balanced\Credit::get($credit->uri);
|
|
||||||
print "we got the credit: " . $the_credit->uri . "\n";
|
|
||||||
|
|
||||||
print "and there you have it :)\n";
|
|
||||||
|
|
||||||
?>
|
|
|
@ -1,71 +0,0 @@
|
||||||
<?
|
|
||||||
require('vendor/autoload.php');
|
|
||||||
|
|
||||||
Httpful\Bootstrap::init();
|
|
||||||
RESTful\Bootstrap::init();
|
|
||||||
Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
$key = new Balanced\APIKey();
|
|
||||||
$key->save();
|
|
||||||
Balanced\Settings::$api_key = $key->secret;
|
|
||||||
$marketplace = new Balanced\Marketplace();
|
|
||||||
$marketplace->save();
|
|
||||||
|
|
||||||
$card = $marketplace->cards->create(array(
|
|
||||||
"card_number" => "5105105105105100",
|
|
||||||
"expiration_month" => "12",
|
|
||||||
"expiration_year" => "2015"
|
|
||||||
));
|
|
||||||
|
|
||||||
$buyer = $marketplace->createBuyer("buyer@example.com", $card->uri);
|
|
||||||
|
|
||||||
$debit = $buyer->debit(1500);
|
|
||||||
$debit->refund(100);
|
|
||||||
$debit->refund(100);
|
|
||||||
$debit->refund(100);
|
|
||||||
|
|
||||||
echo $debit->refunds->total() . " refunds" . "\n";
|
|
||||||
|
|
||||||
$total = 0;
|
|
||||||
|
|
||||||
foreach ($debit->refunds as $r) {
|
|
||||||
$total += $r->amount;
|
|
||||||
print "refund = " . $r->amount . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print $total . "\n";
|
|
||||||
|
|
||||||
# bigger pagination example
|
|
||||||
|
|
||||||
print "Create 60 **buyer** with cards accounts\n";
|
|
||||||
|
|
||||||
for ($i = 0; $i < 60; $i++) {
|
|
||||||
$card = $marketplace->cards->create(array(
|
|
||||||
"card_number" => "5105105105105100",
|
|
||||||
"expiration_month" => "12",
|
|
||||||
"expiration_year" => "2015"
|
|
||||||
));
|
|
||||||
$buyer = $marketplace->createBuyer("buyer" . $i . "@example.org", $card->uri);
|
|
||||||
print '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
print "\n";
|
|
||||||
|
|
||||||
$cards = $marketplace->cards;
|
|
||||||
|
|
||||||
print $cards->total() . " cards in Marketplace\n";
|
|
||||||
|
|
||||||
foreach ($cards as $c) {
|
|
||||||
print "card " . $c->uri . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
# let's iterate through cards for just a single account
|
|
||||||
|
|
||||||
foreach ($buyer->cards as $c) {
|
|
||||||
print "buyer's card " . $c->uri . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print "and there you have it :)\n";
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
14
externals/balanced-php/example/test-composer.php
vendored
14
externals/balanced-php/example/test-composer.php
vendored
|
@ -1,14 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// run this file to test your composer install of Balanced
|
|
||||||
|
|
||||||
require(__DIR__ . '/vendor/autoload.php');
|
|
||||||
|
|
||||||
\Httpful\Bootstrap::init();
|
|
||||||
\RESTful\Bootstrap::init();
|
|
||||||
\Balanced\Bootstrap::init();
|
|
||||||
|
|
||||||
echo "[ OK ]\n";
|
|
||||||
echo "balanced version -- " . \Balanced\Settings::VERSION . " \n";
|
|
||||||
echo "restful version -- " . \RESTful\Settings::VERSION . " \n";
|
|
||||||
echo "httpful version -- " . \Httpful\Httpful::VERSION . " \n";
|
|
12
externals/balanced-php/example/test-phar.php
vendored
12
externals/balanced-php/example/test-phar.php
vendored
|
@ -1,12 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// run this file to test your phar install of Balanced
|
|
||||||
|
|
||||||
include(__DIR__ . '/httpful.phar');
|
|
||||||
include(__DIR__ . '/restful.phar');
|
|
||||||
include(__DIR__ . '/balanced.phar');
|
|
||||||
|
|
||||||
echo "[ OK ]\n";
|
|
||||||
echo "balanced version -- " . \Balanced\Settings::VERSION . " \n";
|
|
||||||
echo "restful version -- " . \RESTful\Settings::VERSION . " \n";
|
|
||||||
echo "httpful version -- " . \Httpful\Httpful::VERSION . " \n";
|
|
12
externals/balanced-php/example/test-source.php
vendored
12
externals/balanced-php/example/test-source.php
vendored
|
@ -1,12 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// run this file to test your source install of Balanced
|
|
||||||
|
|
||||||
require(__DIR__ . "/httpful/bootstrap.php");
|
|
||||||
require(__DIR__ . "/restful/bootstrap.php");
|
|
||||||
require(__DIR__ . "/balanced/bootstrap.php");
|
|
||||||
|
|
||||||
echo "[ OK ]\n";
|
|
||||||
echo "balanced version -- " . \Balanced\Settings::VERSION . " \n";
|
|
||||||
echo "restful version -- " . \RESTful\Settings::VERSION . " \n";
|
|
||||||
echo "httpful version -- " . \Httpful\Httpful::VERSION . " \n";
|
|
55
externals/balanced-php/src/Balanced/APIKey.php
vendored
55
externals/balanced-php/src/Balanced/APIKey.php
vendored
|
@ -1,55 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use Balanced\Settings;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an api key. These are used to authenticate you with the api.
|
|
||||||
*
|
|
||||||
* Typically you create an initial api key:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* print \Balanced\Settings::$api_key == null;
|
|
||||||
* $api_key = new \Balanced\APIKey();
|
|
||||||
* $api_key = api_key->save();
|
|
||||||
* $secret = $api_key->secret;
|
|
||||||
* print $secret;
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* Then save the returned secret (we don't store it) and configure the client
|
|
||||||
* to use it:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* \Balanced\Settings::$api_key = 'my-api-key-secret';
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* You can later add another api key if you'd like to rotate or expire old
|
|
||||||
* ones:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $api_key = new \Balanced\APIKey();
|
|
||||||
* $api_key = api_key->save();
|
|
||||||
* $new_secret = $api_key->secret;
|
|
||||||
* print $new_secret;
|
|
||||||
*
|
|
||||||
* \Balanced\Settings::$api_key = $new_secret;
|
|
||||||
*
|
|
||||||
* \Balanced\APIKey::query()
|
|
||||||
* ->sort(\Balanced\APIKey::f->created_at->desc())
|
|
||||||
* ->first()
|
|
||||||
* ->delete();
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class APIKey extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('api_keys', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
}
|
|
217
externals/balanced-php/src/Balanced/Account.php
vendored
217
externals/balanced-php/src/Balanced/Account.php
vendored
|
@ -1,217 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represent a buyer or merchant account on a marketplace.
|
|
||||||
*
|
|
||||||
* You create these using Balanced\Marketplace->createBuyer or
|
|
||||||
* Balanced\Marketplace->createMerchant.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $card = $marketplace->cards->create(array(
|
|
||||||
* 'street_address' => $street_address,
|
|
||||||
* 'city' => 'Jollywood',
|
|
||||||
* 'region' => 'CA',
|
|
||||||
* 'postal_code' => '90210',
|
|
||||||
* 'name' => 'Captain Chunk',
|
|
||||||
* 'card_number' => '4111111111111111',
|
|
||||||
* 'expiration_month' => 7,
|
|
||||||
* 'expiration_year' => 2015
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* $buyer = $marketplace->createBuyer(
|
|
||||||
* 'buyer@example.com',
|
|
||||||
* $card->uri,
|
|
||||||
* array(
|
|
||||||
* 'my_id' => '1212121',
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* @see Balanced\Marketplace->createBuyer
|
|
||||||
* @see Balanced\Marketplace->createMerchant
|
|
||||||
*/
|
|
||||||
class Account extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('accounts', 'id');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Credit the account.
|
|
||||||
*
|
|
||||||
* @param int amount Amount to credit the account in USD pennies.
|
|
||||||
* @param string description Optional description of the credit.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the credit.
|
|
||||||
* @param mixed destination Optional URI of a funding destination (i.e. \Balanced\BankAccount) associated with this account to credit. If not specified the funding destination most recently added to the account is used.
|
|
||||||
* @param string appears_on_statement_as Optional description of the credit as it will appears on the customer's billing statement.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Credit
|
|
||||||
*/
|
|
||||||
public function credit(
|
|
||||||
$amount,
|
|
||||||
$description = null,
|
|
||||||
$meta = null,
|
|
||||||
$destination = null,
|
|
||||||
$appears_on_statement_as = null)
|
|
||||||
{
|
|
||||||
if ($destination == null)
|
|
||||||
$destination_uri = null;
|
|
||||||
else
|
|
||||||
$destination_uri = is_string($destination) ? $destination : $destination->uri;
|
|
||||||
return $this->credits->create(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'description' => $description,
|
|
||||||
'meta' => $meta,
|
|
||||||
'destination_uri' => $destination_uri,
|
|
||||||
'appears_on_statement_as' => $appears_on_statement_as
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Debit the account.
|
|
||||||
*
|
|
||||||
* @param int amount Amount to debit the account in USD pennies.
|
|
||||||
* @param string appears_on_statement_as Optional description of the debit as it will appears on the customer's billing statement.
|
|
||||||
* @param string description Optional description of the debit.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the debit.
|
|
||||||
* @param mixed Optional funding source (i.e. \Balanced\Card) or URI of a funding source associated with this account to debit. If not specified the funding source most recently added to the account is used.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Debit
|
|
||||||
*/
|
|
||||||
public function debit(
|
|
||||||
$amount,
|
|
||||||
$appears_on_statement_as = null,
|
|
||||||
$description = null,
|
|
||||||
$meta = null,
|
|
||||||
$source = null,
|
|
||||||
$on_behalf_of = null)
|
|
||||||
{
|
|
||||||
if ($source == null) {
|
|
||||||
$source_uri = null;
|
|
||||||
} else if (is_string($source)) {
|
|
||||||
$source_uri = $source;
|
|
||||||
} else {
|
|
||||||
$source_uri = $source->uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($on_behalf_of == null) {
|
|
||||||
$on_behalf_of_uri = null;
|
|
||||||
} else if (is_string($on_behalf_of)) {
|
|
||||||
$on_behalf_of_uri = $on_behalf_of;
|
|
||||||
} else {
|
|
||||||
$on_behalf_of_uri = $on_behalf_of->uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($this->uri) && $on_behalf_of_uri == $this->uri)
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
'The on_behalf_of parameter MAY NOT be the same account as the account you are debiting!'
|
|
||||||
);
|
|
||||||
|
|
||||||
return $this->debits->create(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'description' => $description,
|
|
||||||
'meta' => $meta,
|
|
||||||
'source_uri' => $source_uri,
|
|
||||||
'on_behalf_of_uri' => $on_behalf_of_uri,
|
|
||||||
'appears_on_statement_as' => $appears_on_statement_as
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hold (i.e. a guaranteed pending debit) for account funds. You
|
|
||||||
* can later capture or void. A hold is associated with a account funding
|
|
||||||
* source (i.e. \Balanced\Card). If you don't specify the source then the
|
|
||||||
* current primary funding source for the account is used.
|
|
||||||
*
|
|
||||||
* @param int amount Amount of the hold in USD pennies.
|
|
||||||
* @param string Optional description Description of the hold.
|
|
||||||
* @param string Optional URI referencing the card to use for the hold.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the hold.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Hold
|
|
||||||
*/
|
|
||||||
public function hold(
|
|
||||||
$amount,
|
|
||||||
$description = null,
|
|
||||||
$source_uri = null,
|
|
||||||
$meta = null)
|
|
||||||
{
|
|
||||||
return $this->holds->create(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'description' => $description,
|
|
||||||
'source_uri' => $source_uri,
|
|
||||||
'meta' => $meta
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates or associates a created card with the account. The default
|
|
||||||
* funding source for the account will be this card.
|
|
||||||
*
|
|
||||||
* @see \Balanced\Marketplace->createCard
|
|
||||||
*
|
|
||||||
* @param mixed card \Balanced\Card or URI referencing a card to associate with the account. Alternatively it can be an associative array describing a card to create and associate with the account.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function addCard($card)
|
|
||||||
{
|
|
||||||
if (is_string($card))
|
|
||||||
$this->card_uri = $card;
|
|
||||||
else if (is_array($card))
|
|
||||||
$this->card = $card;
|
|
||||||
else
|
|
||||||
$this->card_uri = $card->uri;
|
|
||||||
return $this->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates or associates a created bank account with the account. The
|
|
||||||
* new default funding destination for the account will be this bank account.
|
|
||||||
*
|
|
||||||
* @see \Balanced\Marketplace->createBankAccount
|
|
||||||
*
|
|
||||||
* @param mixed bank_account \Balanced\BankAccount or URI for a bank account to associate with the account. Alternatively it can be an associative array describing a bank account to create and associate with the account.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function addBankAccount($bank_account)
|
|
||||||
{
|
|
||||||
if (is_string($bank_account))
|
|
||||||
$this->bank_account_uri = $bank_account;
|
|
||||||
else if (is_array($bank_account))
|
|
||||||
$this->bank_account = $bank_account;
|
|
||||||
else
|
|
||||||
$this->bank_account_uri = $bank_account->uri;
|
|
||||||
return $this->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Promotes a role-less or buyer account to a merchant.
|
|
||||||
*
|
|
||||||
* @see Balanced\Marketplace::createMerchant
|
|
||||||
*
|
|
||||||
* @param mixed merchant Associative array describing the merchants identity or a URI referencing a created merchant.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function promoteToMerchant($merchant)
|
|
||||||
{
|
|
||||||
if (is_string($merchant))
|
|
||||||
$this->merchant_uri = $merchant;
|
|
||||||
else
|
|
||||||
$this->merchant = $merchant;
|
|
||||||
return $this->save();
|
|
||||||
}
|
|
||||||
}
|
|
127
externals/balanced-php/src/Balanced/BankAccount.php
vendored
127
externals/balanced-php/src/Balanced/BankAccount.php
vendored
|
@ -1,127 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an account bank account.
|
|
||||||
*
|
|
||||||
* You can create these via Balanced\Marketplace::bank_accounts::create or
|
|
||||||
* Balanced\Marketplace::createBankAccount. Associate them with a buyer or
|
|
||||||
* merchant one creation via Balanced\Marketplace::createBuyer or
|
|
||||||
* Balanced\Marketplace::createMerchant and with an existing buyer or merchant
|
|
||||||
* use Balanced\Account::addBankAccount.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $bank_account = $marketplace->bank_accounts->create(array(
|
|
||||||
* 'name' => 'name',
|
|
||||||
* 'account_number' => '11223344',
|
|
||||||
* 'bank_code' => '1313123',
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('merchant@example.com'))
|
|
||||||
* ->one();
|
|
||||||
* $account->addBankAccount($bank_account->uri);
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class BankAccount extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('bank_accounts', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Credit a bank account.
|
|
||||||
*
|
|
||||||
* @param int amount Amount to credit in USD pennies.
|
|
||||||
* @param string description Optional description of the credit.
|
|
||||||
* @param string appears_on_statement_as Optional description of the credit as it will appears on the customer's billing statement.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Credit
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $bank_account = new \Balanced\BankAccount(array(
|
|
||||||
* 'account_number' => '12341234',
|
|
||||||
* 'name' => 'Fit Finlay',
|
|
||||||
* 'bank_code' => '325182797',
|
|
||||||
* 'type' => 'checking',
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* $credit = $bank_account->credit(123, 'something descriptive');
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
public function credit(
|
|
||||||
$amount,
|
|
||||||
$description = null,
|
|
||||||
$meta = null,
|
|
||||||
$appears_on_statement_as = null)
|
|
||||||
{
|
|
||||||
if (!property_exists($this, 'account') || $this->account == null) {
|
|
||||||
$credit = $this->credits->create(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'description' => $description,
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
$credit = $this->account->credit(
|
|
||||||
$amount,
|
|
||||||
$description,
|
|
||||||
$meta,
|
|
||||||
$this->uri,
|
|
||||||
$appears_on_statement_as
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $credit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function verify()
|
|
||||||
{
|
|
||||||
$response = self::getClient()->post(
|
|
||||||
$this->verifications_uri, null
|
|
||||||
);
|
|
||||||
$verification = new BankAccountVerification();
|
|
||||||
$verification->_objectify($response->body);
|
|
||||||
return $verification;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an verification for a bank account which is a pre-requisite if
|
|
||||||
* you want to create debits using the associated bank account. The side-effect
|
|
||||||
* of creating a verification is that 2 random amounts will be deposited into
|
|
||||||
* the account which must then be confirmed via the confirm method to ensure
|
|
||||||
* that you have access to the bank account in question.
|
|
||||||
*
|
|
||||||
* You can create these via Balanced\Marketplace::bank_accounts::verify.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $bank_account = $marketplace->bank_accounts->create(array(
|
|
||||||
* 'name' => 'name',
|
|
||||||
* 'account_number' => '11223344',
|
|
||||||
* 'bank_code' => '1313123',
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* $verification = $bank_account->verify();
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class BankAccountVerification extends Resource {
|
|
||||||
|
|
||||||
public function confirm($amount1, $amount2) {
|
|
||||||
$this->amount_1 = $amount1;
|
|
||||||
$this->amount_2 = $amount2;
|
|
||||||
$this->save();
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bootstrapper for Balanced does autoloading and resource initialization.
|
|
||||||
*/
|
|
||||||
class Bootstrap
|
|
||||||
{
|
|
||||||
const DIR_SEPARATOR = DIRECTORY_SEPARATOR;
|
|
||||||
const NAMESPACE_SEPARATOR = '\\';
|
|
||||||
|
|
||||||
public static $initialized = false;
|
|
||||||
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
spl_autoload_register(array('\Balanced\Bootstrap', 'autoload'));
|
|
||||||
self::initializeResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function autoload($classname)
|
|
||||||
{
|
|
||||||
self::_autoload(dirname(dirname(__FILE__)), $classname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function pharInit()
|
|
||||||
{
|
|
||||||
spl_autoload_register(array('\Balanced\Bootstrap', 'pharAutoload'));
|
|
||||||
self::initializeResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function pharAutoload($classname)
|
|
||||||
{
|
|
||||||
self::_autoload('phar://balanced.phar', $classname);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static function _autoload($base, $classname)
|
|
||||||
{
|
|
||||||
if (!strncmp($classname, 'Balanced\Errors\\', strlen('Balanced\Errors\\')))
|
|
||||||
$classname = 'Balanced\Errors';
|
|
||||||
$parts = explode(self::NAMESPACE_SEPARATOR, $classname);
|
|
||||||
$path = $base . self::DIR_SEPARATOR. implode(self::DIR_SEPARATOR, $parts) . '.php';
|
|
||||||
if (file_exists($path)) {
|
|
||||||
require_once($path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes resources (i.e. registers them with Resource::_registry). Note
|
|
||||||
* that if you add a Resource then you must initialize it here.
|
|
||||||
*
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
private static function initializeResources()
|
|
||||||
{
|
|
||||||
if (self::$initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
\Balanced\Errors\Error::init();
|
|
||||||
|
|
||||||
\Balanced\Resource::init();
|
|
||||||
|
|
||||||
\Balanced\APIKey::init();
|
|
||||||
\Balanced\Marketplace::init();
|
|
||||||
\Balanced\Account::init();
|
|
||||||
\Balanced\Credit::init();
|
|
||||||
\Balanced\Debit::init();
|
|
||||||
\Balanced\Refund::init();
|
|
||||||
\Balanced\Card::init();
|
|
||||||
\Balanced\BankAccount::init();
|
|
||||||
\Balanced\Hold::init();
|
|
||||||
\Balanced\Merchant::init();
|
|
||||||
\Balanced\Callback::init();
|
|
||||||
\Balanced\Event::init();
|
|
||||||
|
|
||||||
self::$initialized = true;
|
|
||||||
}
|
|
||||||
}
|
|
24
externals/balanced-php/src/Balanced/Callback.php
vendored
24
externals/balanced-php/src/Balanced/Callback.php
vendored
|
@ -1,24 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A Callback is a publicly accessible location that can receive POSTed JSON
|
|
||||||
* data whenever an Event is generated.
|
|
||||||
*
|
|
||||||
* You create these using Balanced\Marketplace->createCallback.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class Callback extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('callbacks', 'id');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
}
|
|
61
externals/balanced-php/src/Balanced/Card.php
vendored
61
externals/balanced-php/src/Balanced/Card.php
vendored
|
@ -1,61 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an account card.
|
|
||||||
*
|
|
||||||
* You can create these via Balanced\Marketplace::cards::create or
|
|
||||||
* Balanced\Marketplace::createCard. Associate them with a buyer or merchant
|
|
||||||
* one creation via Marketplace::createBuyer or
|
|
||||||
* Balanced\Marketplace::createMerchant and with an existing buyer or merchant
|
|
||||||
* use Balanced\Account::addCard.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $card = $marketplace->cards->create(array(
|
|
||||||
* 'name' => 'name',
|
|
||||||
* 'account_number' => '11223344',
|
|
||||||
* 'bank_code' => '1313123'
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('buyer@example.com'))
|
|
||||||
* ->one();
|
|
||||||
* $account->addCard($card->uri);
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Card extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('cards', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function debit(
|
|
||||||
$amount,
|
|
||||||
$appears_on_statement_as = null,
|
|
||||||
$description = null,
|
|
||||||
$meta = null,
|
|
||||||
$source = null)
|
|
||||||
{
|
|
||||||
if ($this->account == null) {
|
|
||||||
throw new \UnexpectedValueException('Card is not associated with an account.');
|
|
||||||
}
|
|
||||||
return $this->account->debit(
|
|
||||||
$amount,
|
|
||||||
$appears_on_statement_as,
|
|
||||||
$description,
|
|
||||||
$meta,
|
|
||||||
$this->uri);
|
|
||||||
}
|
|
||||||
}
|
|
75
externals/balanced-php/src/Balanced/Credit.php
vendored
75
externals/balanced-php/src/Balanced/Credit.php
vendored
|
@ -1,75 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an account credit transaction.
|
|
||||||
*
|
|
||||||
* You create these using Balanced\Account::credit.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('merchant@example.com'))
|
|
||||||
* ->one();
|
|
||||||
*
|
|
||||||
* $credit = $account->credit(
|
|
||||||
* 100,
|
|
||||||
* 'how it '
|
|
||||||
* array(
|
|
||||||
* 'my_id': '112233'
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Credit extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('credits', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Credit an unstored bank account.
|
|
||||||
*
|
|
||||||
* @param int amount Amount to credit in USD pennies.
|
|
||||||
* @param string description Optional description of the credit.
|
|
||||||
* @param mixed bank_account Associative array describing a bank account to credit. The bank account will *not* be stored.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Credit
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $credit = \Balanced\Credit::bankAccount(
|
|
||||||
* 123,
|
|
||||||
* array(
|
|
||||||
* 'account_number' => '12341234',
|
|
||||||
* 'name' => 'Fit Finlay',
|
|
||||||
* 'bank_code' => '325182797',
|
|
||||||
* 'type' => 'checking',
|
|
||||||
* ),
|
|
||||||
* 'something descriptive');
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
public static function bankAccount(
|
|
||||||
$amount,
|
|
||||||
$bank_account,
|
|
||||||
$description = null)
|
|
||||||
{
|
|
||||||
$credit = new Credit(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'bank_account' => $bank_account,
|
|
||||||
'description' => $description
|
|
||||||
));
|
|
||||||
$credit->save();
|
|
||||||
return $credit;
|
|
||||||
}
|
|
||||||
}
|
|
64
externals/balanced-php/src/Balanced/Debit.php
vendored
64
externals/balanced-php/src/Balanced/Debit.php
vendored
|
@ -1,64 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an account debit transaction.
|
|
||||||
*
|
|
||||||
* You create these using Balanced\Account::debit.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('buyer@example.com'))
|
|
||||||
* ->one();
|
|
||||||
*
|
|
||||||
* $debit = $account->debit(
|
|
||||||
* 100,
|
|
||||||
* 'how it appears on the statement',
|
|
||||||
* 'a description',
|
|
||||||
* array(
|
|
||||||
* 'my_id': '443322'
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Debit extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('debits', 'id');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a refund for this debit. You can create multiple refunds for a
|
|
||||||
* debit but the total amount of the refunds must be less than the debit
|
|
||||||
* amount.
|
|
||||||
*
|
|
||||||
* @param int amount Optional amount of the refund in USD pennies. If unspecified then the full debit amount is used.
|
|
||||||
* @param string description Optional description of the refund.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the refund.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Refund
|
|
||||||
*/
|
|
||||||
public function refund(
|
|
||||||
$amount = null,
|
|
||||||
$description = null,
|
|
||||||
$meta = null)
|
|
||||||
{
|
|
||||||
return $this->refunds->create(array(
|
|
||||||
'amount' => $amount,
|
|
||||||
'description' => $description,
|
|
||||||
'meta' => $meta
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
135
externals/balanced-php/src/Balanced/Errors.php
vendored
135
externals/balanced-php/src/Balanced/Errors.php
vendored
|
@ -1,135 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced\Errors;
|
|
||||||
|
|
||||||
use RESTful\Exceptions\HTTPError;
|
|
||||||
|
|
||||||
class Error extends HTTPError
|
|
||||||
{
|
|
||||||
public static $codes = array();
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
foreach (get_declared_classes() as $class) {
|
|
||||||
$parent_class = get_parent_class($class);
|
|
||||||
if ($parent_class != 'Balanced\Errors\Error')
|
|
||||||
continue;
|
|
||||||
foreach ($class::$codes as $type)
|
|
||||||
self::$codes[$type] = $class;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DuplicateAccountEmailAddress extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('duplicate-email-address');
|
|
||||||
}
|
|
||||||
|
|
||||||
class InvalidAmount extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('invalid-amount');
|
|
||||||
}
|
|
||||||
|
|
||||||
class InvalidRoutingNumber extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('invalid-routing-number');
|
|
||||||
}
|
|
||||||
|
|
||||||
class InvalidBankAccountNumber extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('invalid-bank-account-number');
|
|
||||||
}
|
|
||||||
|
|
||||||
class Declined extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('funding-destination-declined', 'authorization-failed');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotAssociateMerchantWithAccount extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('cannot-associate-merchant-with-account');
|
|
||||||
}
|
|
||||||
|
|
||||||
class AccountIsAlreadyAMerchant extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('account-already-merchant');
|
|
||||||
}
|
|
||||||
|
|
||||||
class NoFundingSource extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('no-funding-source');
|
|
||||||
}
|
|
||||||
|
|
||||||
class NoFundingDestination extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('no-funding-destination');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CardAlreadyAssociated extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('card-already-funding-src');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotAssociateCard extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('cannot-associate-card');
|
|
||||||
}
|
|
||||||
|
|
||||||
class BankAccountAlreadyAssociated extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('bank-account-already-associated');
|
|
||||||
}
|
|
||||||
|
|
||||||
class AddressVerificationFailed extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('address-verification-failed');
|
|
||||||
}
|
|
||||||
|
|
||||||
class HoldExpired extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('authorization-expired');
|
|
||||||
}
|
|
||||||
|
|
||||||
class MarketplaceAlreadyCreated extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('marketplace-already-created');
|
|
||||||
}
|
|
||||||
|
|
||||||
class IdentityVerificationFailed extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('identity-verification-error', 'business-principal-kyc', 'business-kyc', 'person-kyc');
|
|
||||||
}
|
|
||||||
|
|
||||||
class InsufficientFunds extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('insufficient-funds');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotHold extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('funding-source-not-hold');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotCredit extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('funding-destination-not-creditable');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotDebit extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('funding-source-not-debitable');
|
|
||||||
}
|
|
||||||
|
|
||||||
class CannotRefund extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array('funding-source-not-refundable');
|
|
||||||
}
|
|
||||||
|
|
||||||
class BankAccountVerificationFailure extends Error
|
|
||||||
{
|
|
||||||
public static $codes = array(
|
|
||||||
'bank-account-authentication-not-pending',
|
|
||||||
'bank-account-authentication-failed',
|
|
||||||
'bank-account-authentication-already-exists'
|
|
||||||
);
|
|
||||||
}
|
|
23
externals/balanced-php/src/Balanced/Event.php
vendored
23
externals/balanced-php/src/Balanced/Event.php
vendored
|
@ -1,23 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An Event is a snapshot of another resource at a point in time when
|
|
||||||
* something significant occurred. Events are created when resources are
|
|
||||||
* created, updated, deleted or otherwise change state such as a Credit
|
|
||||||
* being marked as failed.
|
|
||||||
*/
|
|
||||||
class Event extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('events', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
}
|
|
77
externals/balanced-php/src/Balanced/Hold.php
vendored
77
externals/balanced-php/src/Balanced/Hold.php
vendored
|
@ -1,77 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents pending debit of funds for an account. The funds for that debit
|
|
||||||
* are held by the processor. You can later capture the hold, which results in
|
|
||||||
* debit, or void it, which releases the held funds.
|
|
||||||
*
|
|
||||||
* Note that a hold can expire so you should always check
|
|
||||||
* Balanced\Hold::expires_at.
|
|
||||||
*
|
|
||||||
* You create these using \Balanced\Account::hold.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('buyer@example.com'))
|
|
||||||
* ->one();
|
|
||||||
*
|
|
||||||
* $hold = $account->hold(
|
|
||||||
* 100,
|
|
||||||
* 'a description',
|
|
||||||
* null,
|
|
||||||
* array(
|
|
||||||
* 'my_id': '1293712837'
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* $debit = $hold->capture();
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Hold extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('holds', 'id');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
** Voids a pending hold. This releases the held funds. Once voided a hold
|
|
||||||
* is not longer pending can cannot be re-captured or re-voided.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Hold
|
|
||||||
*/
|
|
||||||
public function void()
|
|
||||||
{
|
|
||||||
$this->is_void = true;
|
|
||||||
return $this->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Captures a pending hold. This results in a debit. Once captured a hold
|
|
||||||
* is not longer pending can cannot be re-captured or re-voided.
|
|
||||||
*
|
|
||||||
* @param int amount Optional Portion of the pending hold to capture. If not specified the full amount associated with the hold is captured.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Debit
|
|
||||||
*/
|
|
||||||
public function capture($amount = null)
|
|
||||||
{
|
|
||||||
$this->debit = $this->account->debits->create(array(
|
|
||||||
'hold_uri' => $this->uri,
|
|
||||||
'amount' => $amount,
|
|
||||||
));
|
|
||||||
return $this->debit;
|
|
||||||
}
|
|
||||||
}
|
|
325
externals/balanced-php/src/Balanced/Marketplace.php
vendored
325
externals/balanced-php/src/Balanced/Marketplace.php
vendored
|
@ -1,325 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use Balanced\Errors;
|
|
||||||
use Balanced\Account;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a marketplace.
|
|
||||||
*
|
|
||||||
* To get started you create an api key and then create a marketplace:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $api_key = new \Balanced\APIKey();
|
|
||||||
* $api_key->save();
|
|
||||||
* $secret = $api_key->secret // better save this somewhere
|
|
||||||
* print $secret;
|
|
||||||
* \Balanced\Settings::$api_key = $secret;
|
|
||||||
*
|
|
||||||
* $marketplace = new \Balanced\Marketplace();
|
|
||||||
* $marketplace->save();
|
|
||||||
* var_dump($marketplace);
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* Each api key is uniquely associated with an api key so once you've created a
|
|
||||||
* marketplace:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* \Balanced\Settings::$api_key = $secret;
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine(); // this is the marketplace associated with $secret
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Marketplace extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('marketplaces', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the marketplace associated with the currently configured
|
|
||||||
* \Balanced\Settings::$api_key.
|
|
||||||
*
|
|
||||||
* @throws \RESTful\Exceptions\NoResultFound
|
|
||||||
* @return \Balanced\Marketplace
|
|
||||||
*/
|
|
||||||
public static function mine()
|
|
||||||
{
|
|
||||||
return self::query()->one();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a card. These can later be associated with an account using
|
|
||||||
* \Balanced\Account->addCard or \Balanced\Marketplace->createBuyer.
|
|
||||||
*
|
|
||||||
* @param string street_address Street address. Use null if there is no address for the card.
|
|
||||||
* @param string city City. Use null if there is no address for the card.
|
|
||||||
* @param string postal_code Postal code. Use null if there is no address for the card.
|
|
||||||
* @param string name Name as it appears on the card.
|
|
||||||
* @param string card_number Card number.
|
|
||||||
* @param string security_code Card security code. Use null if it is no available.
|
|
||||||
* @param int expiration_month Expiration month.
|
|
||||||
* @param int expiration_year Expiration year.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Card
|
|
||||||
*/
|
|
||||||
public function createCard(
|
|
||||||
$street_address,
|
|
||||||
$city,
|
|
||||||
$region,
|
|
||||||
$postal_code,
|
|
||||||
$name,
|
|
||||||
$card_number,
|
|
||||||
$security_code,
|
|
||||||
$expiration_month,
|
|
||||||
$expiration_year)
|
|
||||||
{
|
|
||||||
if ($region != null && strlen($region) > 0) {
|
|
||||||
trigger_error("The region parameter will be deprecated in the next minor version of balanced-php", E_USER_NOTICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->cards->create(array(
|
|
||||||
'street_address' => $street_address,
|
|
||||||
'city' => $city,
|
|
||||||
'region' => $region,
|
|
||||||
'postal_code' => $postal_code,
|
|
||||||
'name' => $name,
|
|
||||||
'card_number' => $card_number,
|
|
||||||
'security_code' => $security_code,
|
|
||||||
'expiration_month' => $expiration_month,
|
|
||||||
'expiration_year' => $expiration_year
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a bank account. These can later be associated with an account
|
|
||||||
* using \Balanced\Account->addBankAccount.
|
|
||||||
*
|
|
||||||
* @param string name Name of the account holder.
|
|
||||||
* @param string account_number Account number.
|
|
||||||
* @param string routing_number Bank code or routing number.
|
|
||||||
* @param string type checking or savings
|
|
||||||
* @param array meta Single level mapping from string keys to string values.
|
|
||||||
*
|
|
||||||
* @return \Balanced\BankAccount
|
|
||||||
*/
|
|
||||||
public function createBankAccount(
|
|
||||||
$name,
|
|
||||||
$account_number,
|
|
||||||
$routing_number,
|
|
||||||
$type,
|
|
||||||
$meta = null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return $this->bank_accounts->create(array(
|
|
||||||
'name' => $name,
|
|
||||||
'account_number' => $account_number,
|
|
||||||
'routing_number' => $routing_number,
|
|
||||||
'type' => $type,
|
|
||||||
'meta' => $meta
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a role-less account. You can later turn this into a buyer by
|
|
||||||
* adding a funding source (e.g a card) or a merchant using
|
|
||||||
* \Balanced\Account->promoteToMerchant.
|
|
||||||
*
|
|
||||||
* @param string email_address Optional email address. There can only be one account with this email address.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the account.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function createAccount($email_address = null, $meta = null)
|
|
||||||
{
|
|
||||||
return $this->accounts->create(array(
|
|
||||||
'email_address' => $email_address,
|
|
||||||
'meta' => $meta,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find or create a role-less account by email address. You can later turn
|
|
||||||
* this into a buyer by adding a funding source (e.g a card) or a merchant
|
|
||||||
* using \Balanced\Account->promoteToMerchant.
|
|
||||||
*
|
|
||||||
* @param string email_address Email address. There can only be one account with this email address.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
function findOrCreateAccountByEmailAddress($email_address)
|
|
||||||
{
|
|
||||||
$marketplace = Marketplace::mine();
|
|
||||||
try {
|
|
||||||
$account = $this->accounts->create(array(
|
|
||||||
'email_address' => $email_address
|
|
||||||
));
|
|
||||||
}
|
|
||||||
catch (Errors\DuplicateAccountEmailAddress $e) {
|
|
||||||
$account = Account::get($e->extras->account_uri);
|
|
||||||
}
|
|
||||||
return $account;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a buyer account.
|
|
||||||
*
|
|
||||||
* @param string email_address Optional email address. There can only be one account with this email address.
|
|
||||||
* @param string card_uri URI referencing a card to associate with the account.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the account.
|
|
||||||
* @param string name Optional name of the account.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function createBuyer($email_address, $card_uri, $meta = null, $name = null)
|
|
||||||
{
|
|
||||||
return $this->accounts->create(array(
|
|
||||||
'email_address' => $email_address,
|
|
||||||
'card_uri' => $card_uri,
|
|
||||||
'meta' => $meta,
|
|
||||||
'name' => $name
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a merchant account.
|
|
||||||
*
|
|
||||||
* Unlike buyers the identity of a merchant must be established before
|
|
||||||
* the account can function as a merchant (i.e. be credited). A merchant
|
|
||||||
* can be either a person or a business. Either way that information is
|
|
||||||
* represented as an associative array and passed as the merchant parameter
|
|
||||||
* when creating the merchant account.
|
|
||||||
*
|
|
||||||
* For a person the array looks like this:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* array(
|
|
||||||
* 'type' => 'person',
|
|
||||||
* 'name' => 'William James',
|
|
||||||
* 'tax_id' => '393-48-3992',
|
|
||||||
* 'street_address' => '167 West 74th Street',
|
|
||||||
* 'postal_code' => '10023',
|
|
||||||
* 'dob' => '1842-01-01',
|
|
||||||
* 'phone_number' => '+16505551234',
|
|
||||||
* 'country_code' => 'USA'
|
|
||||||
* )
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* For a business the array looks like this:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* array(
|
|
||||||
* 'type' => 'business',
|
|
||||||
* 'name' => 'Levain Bakery',
|
|
||||||
* 'tax_id' => '253912384',
|
|
||||||
* 'street_address' => '167 West 74th Street',
|
|
||||||
* 'postal_code' => '10023',
|
|
||||||
* 'phone_number' => '+16505551234',
|
|
||||||
* 'country_code' => 'USA',
|
|
||||||
* 'person' => array(
|
|
||||||
* 'name' => 'William James',
|
|
||||||
* 'tax_id' => '393483992',
|
|
||||||
* 'street_address' => '167 West 74th Street',
|
|
||||||
* 'postal_code' => '10023',
|
|
||||||
* 'dob' => '1842-01-01',
|
|
||||||
* 'phone_number' => '+16505551234',
|
|
||||||
* 'country_code' => 'USA',
|
|
||||||
* )
|
|
||||||
* )
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* In some cases the identity of the merchant, person or business, cannot
|
|
||||||
* be verified in which case a \Balanced\Exceptions\HTTPError is thrown:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $identity = array(
|
|
||||||
* 'type' => 'business',
|
|
||||||
* 'name' => 'Levain Bakery',
|
|
||||||
* 'tax_id' => '253912384',
|
|
||||||
* 'street_address' => '167 West 74th Street',
|
|
||||||
* 'postal_code' => '10023',
|
|
||||||
* 'phone_number' => '+16505551234',
|
|
||||||
* 'country_code' => 'USA',
|
|
||||||
* 'person' => array(
|
|
||||||
* 'name' => 'William James',
|
|
||||||
* 'tax_id' => '393483992',
|
|
||||||
* 'street_address' => '167 West 74th Street',
|
|
||||||
* 'postal_code' => '10023',
|
|
||||||
* 'dob' => '1842-01-01',
|
|
||||||
* 'phone_number' => '+16505551234',
|
|
||||||
* 'country_code' => 'USA',
|
|
||||||
* ),
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* try {
|
|
||||||
* $merchant = \Balanced\Marketplace::mine()->createMerchant(
|
|
||||||
* 'merchant@example.com',
|
|
||||||
* $identity,
|
|
||||||
* );
|
|
||||||
* catch (\Balanced\Exceptions\HTTPError $e) {
|
|
||||||
* if ($e->code != 300) {
|
|
||||||
* throw $e;
|
|
||||||
* }
|
|
||||||
* print e->response->header['Location'] // this is where merchant must signup
|
|
||||||
* }
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* Once the merchant has completed signup you can use the resulting URI to
|
|
||||||
* create an account for them on your marketplace:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $merchant = self::$marketplace->createMerchant(
|
|
||||||
* 'merchant@example.com',
|
|
||||||
* null,
|
|
||||||
* null,
|
|
||||||
* $merchant_uri
|
|
||||||
* );
|
|
||||||
* </coe>
|
|
||||||
*
|
|
||||||
* @param string email_address Optional email address. There can only be one account with this email address.
|
|
||||||
* @param array[string]mixed merchant Associative array describing the merchants identity.
|
|
||||||
* @param string $bank_account_uri Optional URI referencing a bank account to associate with this account.
|
|
||||||
* @param string $merchant_uri URI of a merchant created via the redirection sign-up flow.
|
|
||||||
* @param string $name Optional name of the merchant.
|
|
||||||
* @param array[string]string meta Optional metadata to associate with the account.
|
|
||||||
*
|
|
||||||
* @return \Balanced\Account
|
|
||||||
*/
|
|
||||||
public function createMerchant(
|
|
||||||
$email_address = null,
|
|
||||||
$merchant = null,
|
|
||||||
$bank_account_uri = null,
|
|
||||||
$merchant_uri = null,
|
|
||||||
$name = null,
|
|
||||||
$meta = null)
|
|
||||||
{
|
|
||||||
return $this->accounts->create(array(
|
|
||||||
'email_address' => $email_address,
|
|
||||||
'merchant' => $merchant,
|
|
||||||
'merchant_uri' => $merchant_uri,
|
|
||||||
'bank_account_uri' => $bank_account_uri,
|
|
||||||
'name' => $name,
|
|
||||||
'meta' => $meta,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a callback.
|
|
||||||
*
|
|
||||||
* @param string url URL of callback.
|
|
||||||
*/
|
|
||||||
public function createCallback(
|
|
||||||
$url
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return $this->callbacks->create(array(
|
|
||||||
'url' => $url
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
51
externals/balanced-php/src/Balanced/Merchant.php
vendored
51
externals/balanced-php/src/Balanced/Merchant.php
vendored
|
@ -1,51 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a merchant identity.
|
|
||||||
*
|
|
||||||
* These are optionally created and associated with an account via
|
|
||||||
* \Balanced\Marketplace::createMerchant which establishes a merchant account
|
|
||||||
* on a marketplace.
|
|
||||||
*
|
|
||||||
* In some cases a merchant may need to be redirected to create a identity (e.g. the
|
|
||||||
* information provided cannot be verified, more information is needed, etc). That
|
|
||||||
* redirected signup results in a merchant_uri which is then associated with an
|
|
||||||
* account on the marketplace via \Balanced\Marketplace::createMerchant.
|
|
||||||
*
|
|
||||||
* @see \Balanced\Marketplace
|
|
||||||
*/
|
|
||||||
class Merchant extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('merchants', 'id', '/v1');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the merchant identity associated with the current
|
|
||||||
* Balanced\Settings::$api_key. If you are not authenticated (i.e.
|
|
||||||
* ) then Balanced\Exceptions\NoResult
|
|
||||||
* will be thrown.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $merchant = \Balanced\Merchant::me();
|
|
||||||
* $owner_account = \Balanced\Marketplace::mine()->owner_account;
|
|
||||||
* assert($merchant->id == $owner_account->merchant->id);
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* @throws \RESTful\Exceptions\NoResultFound
|
|
||||||
* @return \Balanced\Merchant
|
|
||||||
*/
|
|
||||||
public static function me()
|
|
||||||
{
|
|
||||||
return self::query()->one();
|
|
||||||
}
|
|
||||||
}
|
|
50
externals/balanced-php/src/Balanced/Refund.php
vendored
50
externals/balanced-php/src/Balanced/Refund.php
vendored
|
@ -1,50 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use \RESTful\URISpec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a refund of an account debit transaction.
|
|
||||||
*
|
|
||||||
* You create these via Balanced\Debit::refund.
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* $marketplace = \Balanced\Marketplace::mine();
|
|
||||||
*
|
|
||||||
* $account = $marketplace
|
|
||||||
* ->accounts
|
|
||||||
* ->query()
|
|
||||||
* ->filter(Account::f->email_address->eq('buyer@example.com'))
|
|
||||||
* ->one();
|
|
||||||
*
|
|
||||||
* $debit = $account->debit(
|
|
||||||
* 100,
|
|
||||||
* 'how it appears on the statement',
|
|
||||||
* 'a description',
|
|
||||||
* array(
|
|
||||||
* 'my_id': '443322'
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* $debit->refund(
|
|
||||||
* 99,
|
|
||||||
* 'some description',
|
|
||||||
* array(
|
|
||||||
* 'my_id': '123123'
|
|
||||||
* )
|
|
||||||
* );
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Refund extends Resource
|
|
||||||
{
|
|
||||||
protected static $_uri_spec = null;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_uri_spec = new URISpec('refunds', 'id');
|
|
||||||
self::$_registry->add(get_called_class());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
48
externals/balanced-php/src/Balanced/Resource.php
vendored
48
externals/balanced-php/src/Balanced/Resource.php
vendored
|
@ -1,48 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
use Balanced\Errors\Error;
|
|
||||||
use RESTful\Exceptions\HTTPError;
|
|
||||||
|
|
||||||
class Resource extends \RESTful\Resource
|
|
||||||
{
|
|
||||||
public static $fields, $f;
|
|
||||||
|
|
||||||
protected static $_client, $_registry, $_uri_spec;
|
|
||||||
|
|
||||||
public static function init()
|
|
||||||
{
|
|
||||||
self::$_client = new \RESTful\Client('\Balanced\Settings', null, __NAMESPACE__ .'\Resource::convertError');
|
|
||||||
self::$_registry = new \RESTful\Registry();
|
|
||||||
self::$f = self::$fields = new \RESTful\Fields();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function convertError($response)
|
|
||||||
{
|
|
||||||
if (property_exists($response->body, 'category_code') &&
|
|
||||||
array_key_exists($response->body->category_code, Error::$codes))
|
|
||||||
$error = new Error::$codes[$response->body->category_code]($response);
|
|
||||||
else
|
|
||||||
$error = new HTTPError($response);
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getClient()
|
|
||||||
{
|
|
||||||
$class = get_called_class();
|
|
||||||
return $class::$_client;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getRegistry()
|
|
||||||
{
|
|
||||||
$class = get_called_class();
|
|
||||||
return $class::$_registry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getURISpec()
|
|
||||||
{
|
|
||||||
$class = get_called_class();
|
|
||||||
return $class::$_uri_spec;
|
|
||||||
}
|
|
||||||
}
|
|
43
externals/balanced-php/src/Balanced/Settings.php
vendored
43
externals/balanced-php/src/Balanced/Settings.php
vendored
|
@ -1,43 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configurable settings.
|
|
||||||
*
|
|
||||||
* You can either set these settings individually:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* \Balanced\Settngs::api_key = 'my-api-key-secret';
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* or all at once:
|
|
||||||
*
|
|
||||||
* <code>
|
|
||||||
* \Balanced\Settngs::configure(
|
|
||||||
* 'https://api.balancedpayments.com',
|
|
||||||
* 'my-api-key-secret'
|
|
||||||
* );
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
class Settings
|
|
||||||
{
|
|
||||||
const VERSION = '0.7.1';
|
|
||||||
|
|
||||||
public static $url_root = 'https://api.balancedpayments.com',
|
|
||||||
$api_key = null,
|
|
||||||
$agent = 'balanced-php',
|
|
||||||
$version = Settings::VERSION;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure all settings.
|
|
||||||
*
|
|
||||||
* @param string url_root The root (schema://hostname[:port]) to use when constructing api URLs.
|
|
||||||
* @param string api_key The api key secret to use for authenticating when talking to the api. If null then api usage is limited to uauthenticated endpoints.
|
|
||||||
*/
|
|
||||||
public static function configure($url_root, $api_key)
|
|
||||||
{
|
|
||||||
self::$url_root= $url_root;
|
|
||||||
self::$api_key = $api_key;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,614 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced\Test;
|
|
||||||
|
|
||||||
\Balanced\Bootstrap::init();
|
|
||||||
\RESTful\Bootstrap::init();
|
|
||||||
\Httpful\Bootstrap::init();
|
|
||||||
|
|
||||||
use Balanced\Resource;
|
|
||||||
use Balanced\Settings;
|
|
||||||
use Balanced\APIKey;
|
|
||||||
use Balanced\Marketplace;
|
|
||||||
use Balanced\Credit;
|
|
||||||
use Balanced\Debit;
|
|
||||||
use Balanced\Refund;
|
|
||||||
use Balanced\Account;
|
|
||||||
use Balanced\Merchant;
|
|
||||||
use Balanced\BankAccount;
|
|
||||||
use Balanced\Card;
|
|
||||||
use Balanced\Hold;
|
|
||||||
|
|
||||||
use \RESTful\Collection;
|
|
||||||
|
|
||||||
|
|
||||||
class APIKeyTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$this->expectOutputString('');
|
|
||||||
$result = Resource::getRegistry()->match('/v1/api_keys');
|
|
||||||
return;
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\APIKey',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/api_keys/1234');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\APIKey',
|
|
||||||
'ids' => array('id' => '1234'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MarketplaceTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/marketplaces');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Marketplace',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/marketplaces/1122');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Marketplace',
|
|
||||||
'ids' => array('id' => '1122'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateCard()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Card', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'street_address' => '123 Fake Street',
|
|
||||||
'city' => 'Jollywood',
|
|
||||||
'region' => '',
|
|
||||||
'postal_code' => '90210',
|
|
||||||
'name' => 'khalkhalash',
|
|
||||||
'card_number' => '4112344112344113',
|
|
||||||
'security_code' => '123',
|
|
||||||
'expiration_month' => 12,
|
|
||||||
'expiration_year' => 2013,
|
|
||||||
));
|
|
||||||
|
|
||||||
$marketplace = new Marketplace(array('cards' => $collection));
|
|
||||||
$marketplace->createCard(
|
|
||||||
'123 Fake Street',
|
|
||||||
'Jollywood',
|
|
||||||
'',
|
|
||||||
'90210',
|
|
||||||
'khalkhalash',
|
|
||||||
'4112344112344113',
|
|
||||||
'123',
|
|
||||||
12,
|
|
||||||
2013);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateBankAccount()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\BankAccount', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'name' => 'Homer Jay',
|
|
||||||
'account_number' => '112233a',
|
|
||||||
'routing_number' => '121042882',
|
|
||||||
'type' => 'savings',
|
|
||||||
'meta' => null
|
|
||||||
));
|
|
||||||
|
|
||||||
$marketplace = new Marketplace(array('bank_accounts' => $collection));
|
|
||||||
$marketplace->createBankAccount(
|
|
||||||
'Homer Jay',
|
|
||||||
'112233a',
|
|
||||||
'121042882',
|
|
||||||
'savings');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateAccount()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Account', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'email_address' => 'role-less@example.com',
|
|
||||||
'meta' => array('test#' => 'test_d')
|
|
||||||
));
|
|
||||||
|
|
||||||
$marketplace = new Marketplace(array('accounts' => $collection));
|
|
||||||
$marketplace->createAccount(
|
|
||||||
'role-less@example.com',
|
|
||||||
array('test#' => 'test_d')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateBuyer()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Account', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'email_address' => 'buyer@example.com',
|
|
||||||
'card_uri' => '/some/card/uri',
|
|
||||||
'meta' => array('test#' => 'test_d'),
|
|
||||||
'name' => 'Buy Er'
|
|
||||||
));
|
|
||||||
|
|
||||||
$marketplace = new Marketplace(array('accounts' => $collection));
|
|
||||||
$marketplace->createBuyer(
|
|
||||||
'buyer@example.com',
|
|
||||||
'/some/card/uri',
|
|
||||||
array('test#' => 'test_d'),
|
|
||||||
'Buy Er'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AccountTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/accounts');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Account',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/accounts/0099');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Account',
|
|
||||||
'ids' => array('id' => '0099'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCredit()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Credit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 101,
|
|
||||||
'description' => 'something sweet',
|
|
||||||
'meta' => null,
|
|
||||||
'destination_uri' => null,
|
|
||||||
'appears_on_statement_as' => null
|
|
||||||
));
|
|
||||||
|
|
||||||
$account = new Account(array('credits' => $collection));
|
|
||||||
$account->credit(101, 'something sweet');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebit()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Debit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 9911,
|
|
||||||
'description' => 'something tangy',
|
|
||||||
'appears_on_statement_as' => 'BAL*TANG',
|
|
||||||
'meta' => null,
|
|
||||||
'source_uri' => null,
|
|
||||||
'on_behalf_of_uri' => null,
|
|
||||||
));
|
|
||||||
|
|
||||||
$account = new Account(array('debits' => $collection));
|
|
||||||
$account->debit(9911, 'BAL*TANG', 'something tangy');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testHold()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Hold', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 1243,
|
|
||||||
'description' => 'something crispy',
|
|
||||||
'source_uri' => '/some/card/uri',
|
|
||||||
'meta' => array('test#' => 'test_d')
|
|
||||||
));
|
|
||||||
|
|
||||||
$account = new Account(array('holds' => $collection));
|
|
||||||
$account->hold(
|
|
||||||
1243,
|
|
||||||
'something crispy',
|
|
||||||
'/some/card/uri',
|
|
||||||
array('test#' => 'test_d')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testAddCard()
|
|
||||||
{
|
|
||||||
$account = $this->getMock(
|
|
||||||
'\Balanced\Account',
|
|
||||||
array('save')
|
|
||||||
);
|
|
||||||
|
|
||||||
$account
|
|
||||||
->expects($this->once())
|
|
||||||
->method('save')
|
|
||||||
->with();
|
|
||||||
|
|
||||||
$account->addCard('/my/new/card/121212');
|
|
||||||
$this->assertEquals($account->card_uri, '/my/new/card/121212');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testAddBankAccount()
|
|
||||||
{
|
|
||||||
$account = $this->getMock(
|
|
||||||
'\Balanced\Account',
|
|
||||||
array('save')
|
|
||||||
);
|
|
||||||
|
|
||||||
$account
|
|
||||||
->expects($this->once())
|
|
||||||
->method('save')
|
|
||||||
->with();
|
|
||||||
|
|
||||||
$account->addBankAccount('/my/new/bank_account/121212');
|
|
||||||
$this->assertEquals($account->bank_account_uri, '/my/new/bank_account/121212');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testPromotToMerchant()
|
|
||||||
{
|
|
||||||
$account = $this->getMock(
|
|
||||||
'\Balanced\Account',
|
|
||||||
array('save')
|
|
||||||
);
|
|
||||||
|
|
||||||
$account
|
|
||||||
->expects($this->once())
|
|
||||||
->method('save')
|
|
||||||
->with();
|
|
||||||
|
|
||||||
$merchant = array(
|
|
||||||
'type' => 'person',
|
|
||||||
'name' => 'William James',
|
|
||||||
'tax_id' => '393-48-3992',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '10023',
|
|
||||||
'dob' => '1842-01-01',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA'
|
|
||||||
);
|
|
||||||
|
|
||||||
$account->promoteToMerchant($merchant);
|
|
||||||
$this->assertEquals($account->merchant, $merchant);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HoldTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/holds');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Hold',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/holds/112233');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Hold',
|
|
||||||
'ids' => array('id' => '112233'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testVoid()
|
|
||||||
{
|
|
||||||
$hold = $this->getMock(
|
|
||||||
'\Balanced\Hold',
|
|
||||||
array('save')
|
|
||||||
);
|
|
||||||
|
|
||||||
$hold
|
|
||||||
->expects($this->once())
|
|
||||||
->method('save')
|
|
||||||
->with();
|
|
||||||
|
|
||||||
$hold->void();
|
|
||||||
$this->assertTrue($hold->is_void);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCapture()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Debit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'hold_uri' => 'some/hold/uri',
|
|
||||||
'amount' => 2211,
|
|
||||||
));
|
|
||||||
|
|
||||||
$account = new Account(array('debits' => $collection));
|
|
||||||
|
|
||||||
$hold = new Hold(array('uri' => 'some/hold/uri', 'account' => $account));
|
|
||||||
|
|
||||||
$hold->capture(2211);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CreditTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/credits');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Credit',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/credits/9988');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Credit',
|
|
||||||
'ids' => array('id' => '9988'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DebitTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/debits');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Debit',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/debits/4545');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Debit',
|
|
||||||
'ids' => array('id' => '4545'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testRefund()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Refund', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 5645,
|
|
||||||
'description' => null,
|
|
||||||
'meta' => array('test#' => 'test_d')
|
|
||||||
));
|
|
||||||
|
|
||||||
$debit = new Debit(array('refunds' => $collection));
|
|
||||||
|
|
||||||
$debit->refund(5645, null, array('test#' => 'test_d'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RefundTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/refunds');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Refund',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/refunds/1287');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Refund',
|
|
||||||
'ids' => array('id' => '1287'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class BankAccountTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/bank_accounts');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\BankAccount',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/bank_accounts/887766');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\BankAccount',
|
|
||||||
'ids' => array('id' => '887766'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditAccount()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Credit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 101,
|
|
||||||
'description' => 'something super sweet',
|
|
||||||
'meta' => null,
|
|
||||||
'destination_uri' => '/some/other/uri',
|
|
||||||
'appears_on_statement_as' => null
|
|
||||||
));
|
|
||||||
|
|
||||||
$account = new Account(array('credits' => $collection));
|
|
||||||
$bank_account = new BankAccount(array('uri' => '/some/other/uri', 'account' => $account));
|
|
||||||
|
|
||||||
$bank_account->credit(101, 'something super sweet');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditAccountless()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Credit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 101,
|
|
||||||
'description' => 'something super sweet',
|
|
||||||
));
|
|
||||||
$bank_account = new BankAccount(array(
|
|
||||||
'uri' => '/some/other/uri',
|
|
||||||
'account' => null,
|
|
||||||
'credits' => $collection,
|
|
||||||
));
|
|
||||||
|
|
||||||
$bank_account->credit(101, 'something super sweet');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CardTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/cards');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Card',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/cards/136asd6713');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Card',
|
|
||||||
'ids' => array('id' => '136asd6713'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebit()
|
|
||||||
{
|
|
||||||
$collection = $this->getMock(
|
|
||||||
'\RESTful\Collection',
|
|
||||||
array('create'),
|
|
||||||
array('\Balanced\Debit', 'some/uri', null)
|
|
||||||
);
|
|
||||||
|
|
||||||
$account = new Account(array('debits' => $collection));
|
|
||||||
$card = new Card(array('uri' => '/some/uri', 'account' => $account ));
|
|
||||||
|
|
||||||
$collection
|
|
||||||
->expects($this->once())
|
|
||||||
->method('create')
|
|
||||||
->with(array(
|
|
||||||
'amount' => 9911,
|
|
||||||
'description' => 'something tangy',
|
|
||||||
'appears_on_statement_as' => 'BAL*TANG',
|
|
||||||
'meta' => null,
|
|
||||||
'source_uri' => '/some/uri',
|
|
||||||
'on_behalf_of_uri' => null,
|
|
||||||
));
|
|
||||||
|
|
||||||
$card->debit(9911, 'BAL*TANG', 'something tangy');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \UnexpectedValueException
|
|
||||||
*/
|
|
||||||
function testNotAssociatedDebit()
|
|
||||||
{
|
|
||||||
$card = new Card(array('uri' => '/some/uri', 'account' => null ));
|
|
||||||
$card->debit(9911, 'BAL*TANG', 'something tangy');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class MerchantTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
function testRegistry()
|
|
||||||
{
|
|
||||||
$result = Resource::getRegistry()->match('/v1/merchants');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => true,
|
|
||||||
'class' => 'Balanced\Merchant',
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
$result = Resource::getRegistry()->match('/v1/merchants/136asd6713');
|
|
||||||
$expected = array(
|
|
||||||
'collection' => false,
|
|
||||||
'class' => 'Balanced\Merchant',
|
|
||||||
'ids' => array('id' => '136asd6713'),
|
|
||||||
);
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
}
|
|
798
externals/balanced-php/tests/Balanced/SuiteTest.php
vendored
798
externals/balanced-php/tests/Balanced/SuiteTest.php
vendored
|
@ -1,798 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Balanced\Test;
|
|
||||||
|
|
||||||
\Balanced\Bootstrap::init();
|
|
||||||
\RESTful\Bootstrap::init();
|
|
||||||
\Httpful\Bootstrap::init();
|
|
||||||
|
|
||||||
use Balanced\Settings;
|
|
||||||
use Balanced\APIKey;
|
|
||||||
use Balanced\Marketplace;
|
|
||||||
use Balanced\Credit;
|
|
||||||
use Balanced\Debit;
|
|
||||||
use Balanced\Refund;
|
|
||||||
use Balanced\Account;
|
|
||||||
use Balanced\Merchant;
|
|
||||||
use Balanced\BankAccount;
|
|
||||||
use Balanced\Card;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Suite test cases. These talk to an API server and so make network calls.
|
|
||||||
*
|
|
||||||
* Environment variables can be used to control client settings:
|
|
||||||
*
|
|
||||||
* <ul>
|
|
||||||
* <li>$BALANCED_URL_ROOT If set applies to \Balanced\Settings::$url_root.
|
|
||||||
* <li>$BALANCED_API_KEY If set applies to \Balanced\Settings::$api_key.
|
|
||||||
* </ul>
|
|
||||||
*/
|
|
||||||
class SuiteTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
static $key,
|
|
||||||
$marketplace,
|
|
||||||
$email_counter = 0;
|
|
||||||
|
|
||||||
static function _createBuyer($email_address = null, $card = null)
|
|
||||||
{
|
|
||||||
if ($email_address == null)
|
|
||||||
$email_address = sprintf('m+%d@poundpay.com', self::$email_counter++);
|
|
||||||
if ($card == null)
|
|
||||||
$card = self::_createCard();
|
|
||||||
return self::$marketplace->createBuyer(
|
|
||||||
$email_address,
|
|
||||||
$card->uri,
|
|
||||||
array('test#' => 'test_d'),
|
|
||||||
'Hobo Joe'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function _createCard($account = null)
|
|
||||||
{
|
|
||||||
$card = self::$marketplace->createCard(
|
|
||||||
'123 Fake Street',
|
|
||||||
'Jollywood',
|
|
||||||
null,
|
|
||||||
'90210',
|
|
||||||
'khalkhalash',
|
|
||||||
'4112344112344113',
|
|
||||||
null,
|
|
||||||
12,
|
|
||||||
2013);
|
|
||||||
if ($account != null) {
|
|
||||||
$account->addCard($card);
|
|
||||||
$card = Card::get($card->uri);
|
|
||||||
}
|
|
||||||
return $card;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function _createBankAccount($account = null)
|
|
||||||
{
|
|
||||||
$bank_account = self::$marketplace->createBankAccount(
|
|
||||||
'Homer Jay',
|
|
||||||
'112233a',
|
|
||||||
'121042882',
|
|
||||||
'checking'
|
|
||||||
);
|
|
||||||
if ($account != null) {
|
|
||||||
$account->addBankAccount($bank_account);
|
|
||||||
$bank_account = $account->bank_accounts[0];
|
|
||||||
}
|
|
||||||
return $bank_account;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function _createPersonMerchant($email_address = null, $bank_account = null)
|
|
||||||
{
|
|
||||||
if ($email_address == null)
|
|
||||||
$email_address = sprintf('m+%d@poundpay.com', self::$email_counter++);
|
|
||||||
if ($bank_account == null)
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$merchant = array(
|
|
||||||
'type' => 'person',
|
|
||||||
'name' => 'William James',
|
|
||||||
'tax_id' => '393-48-3992',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '10023',
|
|
||||||
'dob' => '1842-01-01',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA'
|
|
||||||
);
|
|
||||||
return self::$marketplace->createMerchant(
|
|
||||||
$email_address,
|
|
||||||
$merchant,
|
|
||||||
$bank_account->uri
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function _createBusinessMerchant($email_address = null, $bank_account = null)
|
|
||||||
{
|
|
||||||
if ($email_address == null)
|
|
||||||
$email_address = sprintf('m+%d@poundpay.com', self::$email_counter++);
|
|
||||||
if ($bank_account == null)
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$merchant = array(
|
|
||||||
'type' => 'business',
|
|
||||||
'name' => 'Levain Bakery',
|
|
||||||
'tax_id' => '253912384',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '10023',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA',
|
|
||||||
'person' => array(
|
|
||||||
'name' => 'William James',
|
|
||||||
'tax_id' => '393483992',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '10023',
|
|
||||||
'dob' => '1842-01-01',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return self::$marketplace->createMerchant(
|
|
||||||
$email_address,
|
|
||||||
$merchant,
|
|
||||||
$bank_account->uri
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function setUpBeforeClass()
|
|
||||||
{
|
|
||||||
// url root
|
|
||||||
$url_root = getenv('BALANCED_URL_ROOT');
|
|
||||||
if ($url_root != '') {
|
|
||||||
Settings::$url_root = $url_root;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Settings::$url_root = 'https://api.balancedpayments.com';
|
|
||||||
|
|
||||||
// api key
|
|
||||||
$api_key = getenv('BALANCED_API_KEY');
|
|
||||||
if ($api_key != '') {
|
|
||||||
Settings::$api_key = $api_key;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self::$key = new APIKey();
|
|
||||||
self::$key->save();
|
|
||||||
Settings::$api_key = self::$key->secret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// marketplace
|
|
||||||
try {
|
|
||||||
self::$marketplace = Marketplace::mine();
|
|
||||||
}
|
|
||||||
catch(\RESTful\Exceptions\NoResultFound $e) {
|
|
||||||
self::$marketplace = new Marketplace();
|
|
||||||
self::$marketplace->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function testMarketplaceMine()
|
|
||||||
{
|
|
||||||
$marketplace = Marketplace::mine();
|
|
||||||
$this->assertEquals($this::$marketplace->id, $marketplace->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
function testAnotherMarketplace()
|
|
||||||
{
|
|
||||||
$marketplace = new Marketplace();
|
|
||||||
$marketplace->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
function testDuplicateEmailAddress()
|
|
||||||
{
|
|
||||||
self::_createBuyer('dupe@poundpay.com');
|
|
||||||
self::_createBuyer('dupe@poundpay.com');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testIndexMarketplace()
|
|
||||||
{
|
|
||||||
$marketplaces = Marketplace::query()->all();
|
|
||||||
$this->assertEquals(count($marketplaces), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateBuyer()
|
|
||||||
{
|
|
||||||
self::_createBuyer();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateAccountWithoutEmailAddress()
|
|
||||||
{
|
|
||||||
self::$marketplace->createAccount();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testFindOrCreateAccountByEmailAddress()
|
|
||||||
{
|
|
||||||
$account1 = self::$marketplace->createAccount('foc@example.com');
|
|
||||||
$account2 = self::$marketplace->findOrCreateAccountByEmailAddress('foc@example.com');
|
|
||||||
$this->assertEquals($account2->id, $account2->id);
|
|
||||||
$account3 = self::$marketplace->findOrCreateAccountByEmailAddress('foc2@example.com');
|
|
||||||
$this->assertNotEquals($account3->id, $account1->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testGetBuyer()
|
|
||||||
{
|
|
||||||
$buyer1 = self::_createBuyer();
|
|
||||||
$buyer2 = Account::get($buyer1->uri);
|
|
||||||
$this->assertEquals($buyer1->id, $buyer2->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function testMe()
|
|
||||||
{
|
|
||||||
$marketplace = Marketplace::mine();
|
|
||||||
$merchant = Merchant::me();
|
|
||||||
$this->assertEquals($marketplace->id, $merchant->marketplace->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebitAndRefundBuyer()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$debit = $buyer->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought',
|
|
||||||
array('hi' => 'bye')
|
|
||||||
);
|
|
||||||
$refund = $debit->refund(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
function testDebitZero()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$debit = $buyer->debit(
|
|
||||||
0,
|
|
||||||
'Softie',
|
|
||||||
'something i bought'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testMultipleRefunds()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$debit = $buyer->debit(
|
|
||||||
1500,
|
|
||||||
'Softie',
|
|
||||||
'something tart',
|
|
||||||
array('hi' => 'bye'));
|
|
||||||
$refunds = array(
|
|
||||||
$debit->refund(100),
|
|
||||||
$debit->refund(100),
|
|
||||||
$debit->refund(100),
|
|
||||||
$debit->refund(100));
|
|
||||||
$expected_refund_ids = array_map(
|
|
||||||
function($x) {
|
|
||||||
return $x->id;
|
|
||||||
}, $refunds);
|
|
||||||
sort($expected_refund_ids);
|
|
||||||
$this->assertEquals($debit->refunds->total(), 4);
|
|
||||||
|
|
||||||
// itemization
|
|
||||||
$total = 0;
|
|
||||||
$refund_ids = array();
|
|
||||||
foreach ($debit->refunds as $refund) {
|
|
||||||
$total += $refund->amount;
|
|
||||||
array_push($refund_ids, $refund->id);
|
|
||||||
}
|
|
||||||
sort($refund_ids);
|
|
||||||
$this->assertEquals($total, 400);
|
|
||||||
$this->assertEquals($expected_refund_ids, $refund_ids);
|
|
||||||
|
|
||||||
// pagination
|
|
||||||
$total = 0;
|
|
||||||
$refund_ids = array();
|
|
||||||
foreach ($debit->refunds->paginate() as $page) {
|
|
||||||
foreach ($page->items as $refund) {
|
|
||||||
$total += $refund->amount;
|
|
||||||
array_push($refund_ids, $refund->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sort($refund_ids);
|
|
||||||
$this->assertEquals($total, 400);
|
|
||||||
$this->assertEquals($expected_refund_ids, $refund_ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebitSource()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$card1 = self::_createCard($buyer);
|
|
||||||
$card2 = self::_createCard($buyer);
|
|
||||||
|
|
||||||
$credit = $buyer->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought'
|
|
||||||
);
|
|
||||||
$this->assertEquals($credit->source->id, $card2->id);
|
|
||||||
|
|
||||||
$credit = $buyer->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought',
|
|
||||||
null,
|
|
||||||
$card1
|
|
||||||
);
|
|
||||||
$this->assertEquals($credit->source->id, $card1->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebitOnBehalfOf()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$merchant = self::$marketplace->createAccount(null);
|
|
||||||
$card1 = self::_createCard($buyer);
|
|
||||||
|
|
||||||
$debit = $buyer->debit(1000, null, null, null, null, $merchant);
|
|
||||||
$this->assertEquals($debit->amount, 1000);
|
|
||||||
// for now just test the debit succeeds.
|
|
||||||
// TODO: once the on_behalf_of actually shows up on the response, test it.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
function testDebitOnBehalfOfFailsForBuyer()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$card1 = self::_createCard($buyer);
|
|
||||||
$debit = $buyer->debit(1000, null, null, null, null, $buyer);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateAndVoidHold()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$hold = $buyer->hold(1000);
|
|
||||||
$this->assertEquals($hold->is_void, false);
|
|
||||||
$hold->void();
|
|
||||||
$this->assertEquals($hold->is_void, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateAndCaptureHold()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$hold = $buyer->hold(1000);
|
|
||||||
$debit = $hold->capture(909);
|
|
||||||
$this->assertEquals($debit->account->id, $buyer->id);
|
|
||||||
$this->assertEquals($debit->hold->id, $hold->id);
|
|
||||||
$this->assertEquals($hold->debit->id, $debit->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreatePersonMerchant()
|
|
||||||
{
|
|
||||||
$merchant = self::_createPersonMerchant();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateBusinessMerchant()
|
|
||||||
{
|
|
||||||
$merchant = self::_createBusinessMerchant();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
function testCreditRequiresNonZeroAmount()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought'
|
|
||||||
);
|
|
||||||
$merchant = self::_createBusinessMerchant();
|
|
||||||
$merchant->credit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
function testCreditMoreThanEscrowBalanceFails()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->credit(
|
|
||||||
1000,
|
|
||||||
'something i bought',
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'Softie'
|
|
||||||
);
|
|
||||||
$merchant = self::_createBusinessMerchant();
|
|
||||||
$merchant->credit(self::$marketplace->in_escrow + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditDestiation()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(3000); # NOTE: build up escrow balance to credit
|
|
||||||
|
|
||||||
$merchant = self::_createPersonMerchant();
|
|
||||||
$bank_account1 = self::_createBankAccount($merchant);
|
|
||||||
$bank_account2 = self::_createBankAccount($merchant);
|
|
||||||
|
|
||||||
$credit = $merchant->credit(
|
|
||||||
1000,
|
|
||||||
'something i sold',
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'Softie'
|
|
||||||
);
|
|
||||||
$this->assertEquals($credit->destination->id, $bank_account2->id);
|
|
||||||
|
|
||||||
$credit = $merchant->credit(
|
|
||||||
1000,
|
|
||||||
'something i sold',
|
|
||||||
null,
|
|
||||||
$bank_account1,
|
|
||||||
'Softie'
|
|
||||||
);
|
|
||||||
$this->assertEquals($credit->destination->id, $bank_account1->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testAssociateCard()
|
|
||||||
{
|
|
||||||
$merchant = self::_createPersonMerchant();
|
|
||||||
$card = self::_createCard();
|
|
||||||
$merchant->addCard($card->uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testAssociateBankAccount()
|
|
||||||
{
|
|
||||||
$merchant = self::_createPersonMerchant();
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$merchant->addBankAccount($bank_account->uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCardMasking()
|
|
||||||
{
|
|
||||||
$card = self::$marketplace->createCard(
|
|
||||||
'123 Fake Street',
|
|
||||||
'Jollywood',
|
|
||||||
null,
|
|
||||||
'90210',
|
|
||||||
'khalkhalash',
|
|
||||||
'4112344112344113',
|
|
||||||
'123',
|
|
||||||
12,
|
|
||||||
2013);
|
|
||||||
$this->assertEquals($card->last_four, '4113');
|
|
||||||
$this->assertFalse(property_exists($card, 'number'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testBankAccountMasking()
|
|
||||||
{
|
|
||||||
$bank_account = self::$marketplace->createBankAccount(
|
|
||||||
'Homer Jay',
|
|
||||||
'112233a',
|
|
||||||
'121042882',
|
|
||||||
'checking'
|
|
||||||
);
|
|
||||||
$this->assertEquals($bank_account->last_four, '233a');
|
|
||||||
$this->assertEquals($bank_account->account_number, 'xxx233a');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testFilteringAndSorting()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$debit1 = $buyer->debit(1122, null, null, array('tag' => '1'));
|
|
||||||
$debit2 = $buyer->debit(3322, null, null, array('tag' => '1'));
|
|
||||||
$debit3 = $buyer->debit(2211, null, null, array('tag' => '2'));
|
|
||||||
|
|
||||||
$getId = function($o) {
|
|
||||||
return $o->id;
|
|
||||||
};
|
|
||||||
|
|
||||||
$debits = (
|
|
||||||
self::$marketplace->debits->query()
|
|
||||||
->filter(Debit::$f->meta->tag->eq('1'))
|
|
||||||
->sort(Debit::$f->created_at->asc())
|
|
||||||
->all());
|
|
||||||
$debit_ids = array_map($getId, $debits);
|
|
||||||
$this->assertEquals($debit_ids, array($debit1->id, $debit2->id));
|
|
||||||
|
|
||||||
$debits = (
|
|
||||||
self::$marketplace->debits->query()
|
|
||||||
->filter(Debit::$f->meta->tag->eq('2'))
|
|
||||||
->all());
|
|
||||||
$debit_ids = array_map($getId, $debits);
|
|
||||||
$this->assertEquals($debit_ids, array($debit3->id));
|
|
||||||
|
|
||||||
$debits = (
|
|
||||||
self::$marketplace->debits->query()
|
|
||||||
->filter(Debit::$f->meta->contains('tag'))
|
|
||||||
->sort(Debit::$f->created_at->asc())
|
|
||||||
->all());
|
|
||||||
$debit_ids = array_map($getId, $debits);
|
|
||||||
$this->assertEquals($debit_ids, array($debit1->id, $debit2->id, $debit3->id));
|
|
||||||
|
|
||||||
$debits = (
|
|
||||||
self::$marketplace->debits->query()
|
|
||||||
->filter(Debit::$f->meta->contains('tag'))
|
|
||||||
->sort(Debit::$f->amount->desc())
|
|
||||||
->all());
|
|
||||||
$debit_ids = array_map($getId, $debits);
|
|
||||||
$this->assertEquals($debit_ids, array($debit2->id, $debit3->id, $debit1->id));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testMerchantIdentityFailure()
|
|
||||||
{
|
|
||||||
// NOTE: postal_code == '99999' && region == 'EX' triggers identity failure
|
|
||||||
$identity = array(
|
|
||||||
'type' => 'business',
|
|
||||||
'name' => 'Levain Bakery',
|
|
||||||
'tax_id' => '253912384',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '99999',
|
|
||||||
'region' => 'EX',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA',
|
|
||||||
'person' => array(
|
|
||||||
'name' => 'William James',
|
|
||||||
'tax_id' => '393483992',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '99999',
|
|
||||||
'region' => 'EX',
|
|
||||||
'dob' => '1842-01-01',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
self::$marketplace->createMerchant(
|
|
||||||
sprintf('m+%d@poundpay.com', self::$email_counter++),
|
|
||||||
$identity);
|
|
||||||
}
|
|
||||||
catch(\RESTful\Exceptions\HTTPError $e) {
|
|
||||||
$this->assertEquals($e->response->code, 300);
|
|
||||||
$expected = sprintf('https://www.balancedpayments.com/marketplaces/%s/kyc', self::$marketplace->id);
|
|
||||||
$this->assertEquals($e->redirect_uri, $expected);
|
|
||||||
$this->assertEquals($e->response->headers['Location'], $expected);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$this->fail('Expected exception HTTPError not raised.');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testInternationalCard()
|
|
||||||
{
|
|
||||||
$payload = array(
|
|
||||||
'card_number' => '4111111111111111',
|
|
||||||
'city' => '\xe9\x83\xbd\xe7\x95\x99\xe5\xb8\x82',
|
|
||||||
'country_code' => 'JPN',
|
|
||||||
'expiration_month' => 12,
|
|
||||||
'expiration_year' => 2014,
|
|
||||||
'name' => 'Johnny Fresh',
|
|
||||||
'postal_code' => '4020054',
|
|
||||||
'street_address' => '\xe7\x94\xb0\xe5\x8e\x9f\xef\xbc\x93\xe3\x83\xbc\xef\xbc\x98\xe3\x83\xbc\xef\xbc\x91'
|
|
||||||
);
|
|
||||||
$card = self::$marketplace->cards->create($payload);
|
|
||||||
$this->assertEquals($card->street_address, $payload['street_address']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \RESTful\Exceptions\NoResultFound
|
|
||||||
*/
|
|
||||||
function testAccountWithEmailAddressNotFound()
|
|
||||||
{
|
|
||||||
self::$marketplace->accounts->query()
|
|
||||||
->filter(Account::$f->email_address->eq('unlikely@address.com'))
|
|
||||||
->one();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDebitACard()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$card = self::_createCard($buyer);
|
|
||||||
$debit = $card->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought',
|
|
||||||
array('hi' => 'bye'));
|
|
||||||
$this->assertEquals($debit->source->uri, $card->uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \UnexpectedValueException
|
|
||||||
*/
|
|
||||||
function testDebitAnUnassociatedCard()
|
|
||||||
{
|
|
||||||
$card = self::_createCard();
|
|
||||||
$card->debit(1000, 'Softie');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditABankAccount()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(101); # NOTE: build up escrow balance to credit
|
|
||||||
|
|
||||||
$merchant = self::_createPersonMerchant();
|
|
||||||
$bank_account = self::_createBankAccount($merchant);
|
|
||||||
$credit = $bank_account->credit(55, 'something sour');
|
|
||||||
$this->assertEquals($credit->destination->uri, $bank_account->uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testQuery()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$tag = '123123123123';
|
|
||||||
$debit1 = $buyer->debit(1122, null, null, array('tag' => $tag));
|
|
||||||
$debit2 = $buyer->debit(3322, null, null, array('tag' => $tag));
|
|
||||||
$debit3 = $buyer->debit(2211, null, null, array('tag' => $tag));
|
|
||||||
$expected_debit_ids = array($debit1->id, $debit2->id, $debit3->id);
|
|
||||||
|
|
||||||
$query = (
|
|
||||||
self::$marketplace->debits->query()
|
|
||||||
->filter(Debit::$f->meta->tag->eq($tag))
|
|
||||||
->sort(Debit::$f->created_at->asc())
|
|
||||||
->limit(1));
|
|
||||||
|
|
||||||
$this->assertEquals($query->total(), 3);
|
|
||||||
|
|
||||||
$debit_ids = array();
|
|
||||||
foreach ($query as $debits) {
|
|
||||||
array_push($debit_ids, $debits->id);
|
|
||||||
}
|
|
||||||
$this->assertEquals($debit_ids, $expected_debit_ids);
|
|
||||||
|
|
||||||
$debit_ids = array($query[0]->id, $query[1]->id, $query[2]->id);
|
|
||||||
$this->assertEquals($debit_ids, $expected_debit_ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testBuyerPromoteToMerchant()
|
|
||||||
{
|
|
||||||
$merchant = array(
|
|
||||||
'type' => 'person',
|
|
||||||
'name' => 'William James',
|
|
||||||
'tax_id' => '393-48-3992',
|
|
||||||
'street_address' => '167 West 74th Street',
|
|
||||||
'postal_code' => '10023',
|
|
||||||
'dob' => '1842-01-01',
|
|
||||||
'phone_number' => '+16505551234',
|
|
||||||
'country_code' => 'USA'
|
|
||||||
);
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->promoteToMerchant($merchant);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditAccountlessBankAccount()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(101); # NOTE: build up escrow balance to credit
|
|
||||||
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$credit = $bank_account->credit(55, 'something sour');
|
|
||||||
$this->assertEquals($credit->bank_account->id, $bank_account->id);
|
|
||||||
$bank_account = $bank_account->get($bank_account->id);
|
|
||||||
$this->assertEquals($bank_account->credits->total(), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreditUnstoredBankAccount()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(101); # NOTE: build up escrow balance to credit
|
|
||||||
|
|
||||||
$credit = Credit::bankAccount(
|
|
||||||
55,
|
|
||||||
array(
|
|
||||||
'name' => 'Homer Jay',
|
|
||||||
'account_number' => '112233a',
|
|
||||||
'routing_number' => '121042882',
|
|
||||||
'type' => 'checking',
|
|
||||||
),
|
|
||||||
'something sour');
|
|
||||||
$this->assertFalse(property_exists($credit->bank_account, 'uri'));
|
|
||||||
$this->assertFalse(property_exists($credit->bank_account, 'id'));
|
|
||||||
$this->assertEquals($credit->bank_account->name, 'Homer Jay');
|
|
||||||
$this->assertEquals($credit->bank_account->account_number, 'xxx233a');
|
|
||||||
$this->assertEquals($credit->bank_account->type, 'checking');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testDeleteBankAccount()
|
|
||||||
{
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->debit(101); # NOTE: build up escrow balance to credit
|
|
||||||
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$credit = $bank_account->credit(55, 'something sour');
|
|
||||||
$this->assertTrue(property_exists($credit->bank_account, 'uri'));
|
|
||||||
$this->assertTrue(property_exists($credit->bank_account, 'id'));
|
|
||||||
$bank_account = BankAccount::get($bank_account->id);
|
|
||||||
$bank_account->delete();
|
|
||||||
$credit = Credit::get($credit->uri);
|
|
||||||
$this->assertFalse(property_exists($credit->bank_account, 'uri'));
|
|
||||||
$this->assertFalse(property_exists($credit->bank_account, 'id'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testGetBankAccounById()
|
|
||||||
{
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$bank_account_2 = BankAccount::get($bank_account->id);
|
|
||||||
$this->assertEquals($bank_account_2->id, $bank_account->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \Balanced\Errors\InsufficientFunds
|
|
||||||
*/
|
|
||||||
function testInsufficientFunds()
|
|
||||||
{
|
|
||||||
$marketplace = Marketplace::get(self::$marketplace->uri);
|
|
||||||
$amount = $marketplace->in_escrow + 100;
|
|
||||||
$credit = Credit::bankAccount(
|
|
||||||
$amount,
|
|
||||||
array(
|
|
||||||
'name' => 'Homer Jay',
|
|
||||||
'account_number' => '112233a',
|
|
||||||
'routing_number' => '121042882',
|
|
||||||
'type' => 'checking',
|
|
||||||
),
|
|
||||||
'something sour');
|
|
||||||
}
|
|
||||||
|
|
||||||
function testCreateCallback() {
|
|
||||||
$callback = self::$marketplace->createCallback(
|
|
||||||
'http://example.com/php'
|
|
||||||
);
|
|
||||||
$this->assertEquals($callback->url, 'http://example.com/php');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \Balanced\Errors\BankAccountVerificationFailure
|
|
||||||
*/
|
|
||||||
function testBankAccountVerificationFailure() {
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->addBankAccount($bank_account);
|
|
||||||
$verification = $bank_account->verify();
|
|
||||||
$verification->confirm(1, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \Balanced\Errors\BankAccountVerificationFailure
|
|
||||||
*/
|
|
||||||
function testBankAccountVerificationDuplicate() {
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->addBankAccount($bank_account);
|
|
||||||
$bank_account->verify();
|
|
||||||
$bank_account->verify();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testBankAccountVerificationSuccess() {
|
|
||||||
$bank_account = self::_createBankAccount();
|
|
||||||
$buyer = self::_createBuyer();
|
|
||||||
$buyer->addBankAccount($bank_account);
|
|
||||||
$verification = $bank_account->verify();
|
|
||||||
$verification->confirm(1, 1);
|
|
||||||
|
|
||||||
// this will fail if the bank account is not verified
|
|
||||||
$debit = $buyer->debit(
|
|
||||||
1000,
|
|
||||||
'Softie',
|
|
||||||
'something i bought',
|
|
||||||
array('hi' => 'bye'),
|
|
||||||
$bank_account
|
|
||||||
);
|
|
||||||
$this->assertTrue(strpos($debit->source->uri, 'bank_account') > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testEvents() {
|
|
||||||
$prev_num_events = Marketplace::mine()->events->total();
|
|
||||||
$account = self::_createBuyer();
|
|
||||||
$account->debit(123);
|
|
||||||
$cur_num_events = Marketplace::mine()->events->total();
|
|
||||||
$count = 0;
|
|
||||||
while ($cur_num_events == $prev_num_events && $count < 10) {
|
|
||||||
printf("waiting for events - %d, %d == %d\n", $count + 1, $cur_num_events, $prev_num_events);
|
|
||||||
sleep(2); // 2 seconds
|
|
||||||
$cur_num_events = Marketplace::mine()->events->total();
|
|
||||||
$count += 1;
|
|
||||||
}
|
|
||||||
$this->assertTrue($cur_num_events > $prev_num_events);
|
|
||||||
}
|
|
||||||
}
|
|
8
externals/balanced-php/tests/phpunit.xml
vendored
8
externals/balanced-php/tests/phpunit.xml
vendored
|
@ -1,8 +0,0 @@
|
||||||
<phpunit>
|
|
||||||
<testsuite name="Balanced">
|
|
||||||
<directory>.</directory>
|
|
||||||
</testsuite>
|
|
||||||
<logging>
|
|
||||||
<log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
|
|
||||||
</logging>
|
|
||||||
</phpunit>
|
|
|
@ -44,7 +44,7 @@ return array(
|
||||||
'rsrc/css/application/config/config-welcome.css' => '6abd79be',
|
'rsrc/css/application/config/config-welcome.css' => '6abd79be',
|
||||||
'rsrc/css/application/config/setup-issue.css' => '22270af2',
|
'rsrc/css/application/config/setup-issue.css' => '22270af2',
|
||||||
'rsrc/css/application/config/unhandled-exception.css' => '37d4f9a2',
|
'rsrc/css/application/config/unhandled-exception.css' => '37d4f9a2',
|
||||||
'rsrc/css/application/conpherence/durable-column.css' => '8c951609',
|
'rsrc/css/application/conpherence/durable-column.css' => '1f5c64e8',
|
||||||
'rsrc/css/application/conpherence/menu.css' => 'c6ac5299',
|
'rsrc/css/application/conpherence/menu.css' => 'c6ac5299',
|
||||||
'rsrc/css/application/conpherence/message-pane.css' => '5930260a',
|
'rsrc/css/application/conpherence/message-pane.css' => '5930260a',
|
||||||
'rsrc/css/application/conpherence/notification.css' => '04a6e10a',
|
'rsrc/css/application/conpherence/notification.css' => '04a6e10a',
|
||||||
|
@ -404,7 +404,6 @@ return array(
|
||||||
'rsrc/js/application/phame/phame-post-preview.js' => 'be807912',
|
'rsrc/js/application/phame/phame-post-preview.js' => 'be807912',
|
||||||
'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '9c2623f4',
|
'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '9c2623f4',
|
||||||
'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'e58bf807',
|
'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'e58bf807',
|
||||||
'rsrc/js/application/phortune/behavior-balanced-payment-form.js' => 'b2c03e60',
|
|
||||||
'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf',
|
'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf',
|
||||||
'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'fc91ab6c',
|
'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'fc91ab6c',
|
||||||
'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef',
|
'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef',
|
||||||
|
@ -514,7 +513,7 @@ return array(
|
||||||
'changeset-view-manager' => '88be0133',
|
'changeset-view-manager' => '88be0133',
|
||||||
'config-options-css' => '7fedf08b',
|
'config-options-css' => '7fedf08b',
|
||||||
'config-welcome-css' => '6abd79be',
|
'config-welcome-css' => '6abd79be',
|
||||||
'conpherence-durable-column-view' => '8c951609',
|
'conpherence-durable-column-view' => '1f5c64e8',
|
||||||
'conpherence-menu-css' => 'c6ac5299',
|
'conpherence-menu-css' => 'c6ac5299',
|
||||||
'conpherence-message-pane-css' => '5930260a',
|
'conpherence-message-pane-css' => '5930260a',
|
||||||
'conpherence-notification-css' => '04a6e10a',
|
'conpherence-notification-css' => '04a6e10a',
|
||||||
|
@ -554,7 +553,6 @@ return array(
|
||||||
'javelin-behavior-aphront-more' => 'a80d0378',
|
'javelin-behavior-aphront-more' => 'a80d0378',
|
||||||
'javelin-behavior-audio-source' => '59b251eb',
|
'javelin-behavior-audio-source' => '59b251eb',
|
||||||
'javelin-behavior-audit-preview' => 'd835b03a',
|
'javelin-behavior-audit-preview' => 'd835b03a',
|
||||||
'javelin-behavior-balanced-payment-form' => 'b2c03e60',
|
|
||||||
'javelin-behavior-boards-dropdown' => '0ec56e1d',
|
'javelin-behavior-boards-dropdown' => '0ec56e1d',
|
||||||
'javelin-behavior-choose-control' => '6153c708',
|
'javelin-behavior-choose-control' => '6153c708',
|
||||||
'javelin-behavior-config-reorder-fields' => '14a827de',
|
'javelin-behavior-config-reorder-fields' => '14a827de',
|
||||||
|
@ -1670,11 +1668,6 @@ return array(
|
||||||
'javelin-uri',
|
'javelin-uri',
|
||||||
'javelin-request',
|
'javelin-request',
|
||||||
),
|
),
|
||||||
'b2c03e60' => array(
|
|
||||||
'javelin-behavior',
|
|
||||||
'javelin-dom',
|
|
||||||
'phortune-credit-card-form',
|
|
||||||
),
|
|
||||||
'b3a4b884' => array(
|
'b3a4b884' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'phabricator-prefab',
|
'phabricator-prefab',
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.3 KiB |
|
@ -2779,7 +2779,6 @@ phutil_register_library_map(array(
|
||||||
'PhortuneAccountTransaction' => 'applications/phortune/storage/PhortuneAccountTransaction.php',
|
'PhortuneAccountTransaction' => 'applications/phortune/storage/PhortuneAccountTransaction.php',
|
||||||
'PhortuneAccountTransactionQuery' => 'applications/phortune/query/PhortuneAccountTransactionQuery.php',
|
'PhortuneAccountTransactionQuery' => 'applications/phortune/query/PhortuneAccountTransactionQuery.php',
|
||||||
'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php',
|
'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php',
|
||||||
'PhortuneBalancedPaymentProvider' => 'applications/phortune/provider/PhortuneBalancedPaymentProvider.php',
|
|
||||||
'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php',
|
'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php',
|
||||||
'PhortuneCartAcceptController' => 'applications/phortune/controller/PhortuneCartAcceptController.php',
|
'PhortuneCartAcceptController' => 'applications/phortune/controller/PhortuneCartAcceptController.php',
|
||||||
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
|
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
|
||||||
|
@ -6176,7 +6175,6 @@ phutil_register_library_map(array(
|
||||||
'PhortuneAccountTransaction' => 'PhabricatorApplicationTransaction',
|
'PhortuneAccountTransaction' => 'PhabricatorApplicationTransaction',
|
||||||
'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
'PhortuneAccountViewController' => 'PhortuneController',
|
'PhortuneAccountViewController' => 'PhortuneController',
|
||||||
'PhortuneBalancedPaymentProvider' => 'PhortunePaymentProvider',
|
|
||||||
'PhortuneCart' => array(
|
'PhortuneCart' => array(
|
||||||
'PhortuneDAO',
|
'PhortuneDAO',
|
||||||
'PhabricatorApplicationTransactionInterface',
|
'PhabricatorApplicationTransactionInterface',
|
||||||
|
|
|
@ -1,370 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhortuneBalancedPaymentProvider extends PhortunePaymentProvider {
|
|
||||||
|
|
||||||
const BALANCED_MARKETPLACE_ID = 'balanced.marketplace-id';
|
|
||||||
const BALANCED_SECRET_KEY = 'balanced.secret-key';
|
|
||||||
|
|
||||||
public function isAcceptingLivePayments() {
|
|
||||||
return !preg_match('/-test-/', $this->getSecretKey());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getName() {
|
|
||||||
return pht('Balanced Payments');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getConfigureName() {
|
|
||||||
return pht('Add Balanced Payments Account');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getConfigureDescription() {
|
|
||||||
return pht(
|
|
||||||
'Allows you to accept credit or debit card payments with a '.
|
|
||||||
'balancedpayments.com account.');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getConfigureProvidesDescription() {
|
|
||||||
return pht(
|
|
||||||
'This merchant accepts credit and debit cards via Balanced Payments.');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getConfigureInstructions() {
|
|
||||||
return pht(
|
|
||||||
"To configure Balacned, register or log in to an existing account on ".
|
|
||||||
"[[https://balancedpayments.com | balancedpayments.com]]. Once logged ".
|
|
||||||
"in:\n\n".
|
|
||||||
" - Choose a marketplace.\n".
|
|
||||||
" - Find the **Marketplace ID** in {nav My Marketplace > Settings} and ".
|
|
||||||
" copy it into the field above.\n".
|
|
||||||
" - On the same screen, under **API keys**, choose **Add a key**, then ".
|
|
||||||
" **Show key secret**. Copy the value into the field above.\n\n".
|
|
||||||
"You can either use a test marketplace to add this provider in test ".
|
|
||||||
"mode, or use a live marketplace to accept live payments.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllConfigurableProperties() {
|
|
||||||
return array(
|
|
||||||
self::BALANCED_MARKETPLACE_ID,
|
|
||||||
self::BALANCED_SECRET_KEY,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAllConfigurableSecretProperties() {
|
|
||||||
return array(
|
|
||||||
self::BALANCED_SECRET_KEY,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function processEditForm(
|
|
||||||
AphrontRequest $request,
|
|
||||||
array $values) {
|
|
||||||
|
|
||||||
$errors = array();
|
|
||||||
$issues = array();
|
|
||||||
|
|
||||||
if (!strlen($values[self::BALANCED_MARKETPLACE_ID])) {
|
|
||||||
$errors[] = pht('Balanced Marketplace ID is required.');
|
|
||||||
$issues[self::BALANCED_MARKETPLACE_ID] = pht('Required');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strlen($values[self::BALANCED_SECRET_KEY])) {
|
|
||||||
$errors[] = pht('Balanced Secret Key is required.');
|
|
||||||
$issues[self::BALANCED_SECRET_KEY] = pht('Required');
|
|
||||||
}
|
|
||||||
|
|
||||||
return array($errors, $issues, $values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function extendEditForm(
|
|
||||||
AphrontRequest $request,
|
|
||||||
AphrontFormView $form,
|
|
||||||
array $values,
|
|
||||||
array $issues) {
|
|
||||||
|
|
||||||
$form
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setName(self::BALANCED_MARKETPLACE_ID)
|
|
||||||
->setValue($values[self::BALANCED_MARKETPLACE_ID])
|
|
||||||
->setError(idx($issues, self::BALANCED_MARKETPLACE_ID, true))
|
|
||||||
->setLabel(pht('Balanced Marketplace ID')))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setName(self::BALANCED_SECRET_KEY)
|
|
||||||
->setValue($values[self::BALANCED_SECRET_KEY])
|
|
||||||
->setError(idx($issues, self::BALANCED_SECRET_KEY, true))
|
|
||||||
->setLabel(pht('Balanced Secret Key')));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function canRunConfigurationTest() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function runConfigurationTest() {
|
|
||||||
$this->loadBalancedAPILibraries();
|
|
||||||
|
|
||||||
// TODO: This only tests that the secret key is correct. It's not clear
|
|
||||||
// how to test that the marketplace is correct.
|
|
||||||
|
|
||||||
try {
|
|
||||||
Balanced\Settings::$api_key = $this->getSecretKey();
|
|
||||||
Balanced\APIKey::query()->first();
|
|
||||||
} catch (RESTful\Exceptions\HTTPError $error) {
|
|
||||||
// NOTE: This exception doesn't print anything meaningful if it escapes
|
|
||||||
// to top level. Replace it with something slightly readable.
|
|
||||||
throw new Exception($error->response->body->description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPaymentMethodDescription() {
|
|
||||||
return pht('Add Credit or Debit Card');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPaymentMethodIcon() {
|
|
||||||
return 'Balanced';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPaymentMethodProviderDescription() {
|
|
||||||
return pht('Processed by Balanced');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDefaultPaymentMethodDisplayName(
|
|
||||||
PhortunePaymentMethod $method) {
|
|
||||||
return pht('Credit/Debit Card');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function executeCharge(
|
|
||||||
PhortunePaymentMethod $method,
|
|
||||||
PhortuneCharge $charge) {
|
|
||||||
$this->loadBalancedAPILibraries();
|
|
||||||
|
|
||||||
$price = $charge->getAmountAsCurrency();
|
|
||||||
|
|
||||||
// Build the string which will appear on the credit card statement.
|
|
||||||
$charge_as = new PhutilURI(PhabricatorEnv::getProductionURI('/'));
|
|
||||||
$charge_as = $charge_as->getDomain();
|
|
||||||
$charge_as = id(new PhutilUTF8StringTruncator())
|
|
||||||
->setMaximumBytes(22)
|
|
||||||
->setTerminator('')
|
|
||||||
->truncateString($charge_as);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Balanced\Settings::$api_key = $this->getSecretKey();
|
|
||||||
$card = Balanced\Card::get($method->getMetadataValue('balanced.cardURI'));
|
|
||||||
$debit = $card->debit($price->getValueInUSDCents(), $charge_as);
|
|
||||||
} catch (RESTful\Exceptions\HTTPError $error) {
|
|
||||||
// NOTE: This exception doesn't print anything meaningful if it escapes
|
|
||||||
// to top level. Replace it with something slightly readable.
|
|
||||||
throw new Exception($error->response->body->description);
|
|
||||||
}
|
|
||||||
|
|
||||||
$expect_status = 'succeeded';
|
|
||||||
if ($debit->status !== $expect_status) {
|
|
||||||
throw new Exception(
|
|
||||||
pht(
|
|
||||||
'Debit failed, expected "%s", got "%s".',
|
|
||||||
$expect_status,
|
|
||||||
$debit->status));
|
|
||||||
}
|
|
||||||
|
|
||||||
$charge->setMetadataValue('balanced.debitURI', $debit->uri);
|
|
||||||
$charge->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function executeRefund(
|
|
||||||
PhortuneCharge $charge,
|
|
||||||
PhortuneCharge $refund) {
|
|
||||||
$this->loadBalancedAPILibraries();
|
|
||||||
|
|
||||||
$debit_uri = $charge->getMetadataValue('balanced.debitURI');
|
|
||||||
if (!$debit_uri) {
|
|
||||||
throw new Exception(pht('No Balanced debit URI!'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$refund_cents = $refund
|
|
||||||
->getAmountAsCurrency()
|
|
||||||
->negate()
|
|
||||||
->getValueInUSDCents();
|
|
||||||
|
|
||||||
$params = array(
|
|
||||||
'amount' => $refund_cents,
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Balanced\Settings::$api_key = $this->getSecretKey();
|
|
||||||
$balanced_debit = Balanced\Debit::get($debit_uri);
|
|
||||||
$balanced_refund = $balanced_debit->refunds->create($params);
|
|
||||||
} catch (RESTful\Exceptions\HTTPError $error) {
|
|
||||||
throw new Exception($error->response->body->description);
|
|
||||||
}
|
|
||||||
|
|
||||||
$refund->setMetadataValue('balanced.refundURI', $balanced_refund->uri);
|
|
||||||
$refund->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function updateCharge(PhortuneCharge $charge) {
|
|
||||||
$this->loadBalancedAPILibraries();
|
|
||||||
|
|
||||||
$debit_uri = $charge->getMetadataValue('balanced.debitURI');
|
|
||||||
if (!$debit_uri) {
|
|
||||||
throw new Exception(pht('No Balanced debit URI!'));
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Balanced\Settings::$api_key = $this->getSecretKey();
|
|
||||||
$balanced_debit = Balanced\Debit::get($debit_uri);
|
|
||||||
} catch (RESTful\Exceptions\HTTPError $error) {
|
|
||||||
throw new Exception($error->response->body->description);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Deal with disputes / chargebacks / surprising refunds.
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getMarketplaceID() {
|
|
||||||
return $this
|
|
||||||
->getProviderConfig()
|
|
||||||
->getMetadataValue(self::BALANCED_MARKETPLACE_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getSecretKey() {
|
|
||||||
return $this
|
|
||||||
->getProviderConfig()
|
|
||||||
->getMetadataValue(self::BALANCED_SECRET_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getMarketplaceURI() {
|
|
||||||
return '/v1/marketplaces/'.$this->getMarketplaceID();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -( Adding Payment Methods )--------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
public function canCreatePaymentMethods() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function validateCreatePaymentMethodToken(array $token) {
|
|
||||||
return isset($token['balancedMarketplaceURI']);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @phutil-external-symbol class Balanced\Card
|
|
||||||
* @phutil-external-symbol class Balanced\Debit
|
|
||||||
* @phutil-external-symbol class Balanced\Settings
|
|
||||||
* @phutil-external-symbol class Balanced\Marketplace
|
|
||||||
* @phutil-external-symbol class Balanced\APIKey
|
|
||||||
* @phutil-external-symbol class RESTful\Exceptions\HTTPError
|
|
||||||
*/
|
|
||||||
public function createPaymentMethodFromRequest(
|
|
||||||
AphrontRequest $request,
|
|
||||||
PhortunePaymentMethod $method,
|
|
||||||
array $token) {
|
|
||||||
$this->loadBalancedAPILibraries();
|
|
||||||
|
|
||||||
$errors = array();
|
|
||||||
|
|
||||||
$account_phid = $method->getAccountPHID();
|
|
||||||
$author_phid = $method->getAuthorPHID();
|
|
||||||
$description = $account_phid.':'.$author_phid;
|
|
||||||
|
|
||||||
try {
|
|
||||||
Balanced\Settings::$api_key = $this->getSecretKey();
|
|
||||||
|
|
||||||
$card = Balanced\Card::get($token['balancedMarketplaceURI']);
|
|
||||||
|
|
||||||
$buyer = Balanced\Marketplace::mine()->createBuyer(
|
|
||||||
null,
|
|
||||||
$card->uri,
|
|
||||||
array(
|
|
||||||
'description' => $description,
|
|
||||||
));
|
|
||||||
|
|
||||||
} catch (RESTful\Exceptions\HTTPError $error) {
|
|
||||||
// NOTE: This exception doesn't print anything meaningful if it escapes
|
|
||||||
// to top level. Replace it with something slightly readable.
|
|
||||||
throw new Exception($error->response->body->description);
|
|
||||||
}
|
|
||||||
|
|
||||||
$method
|
|
||||||
->setBrand($card->brand)
|
|
||||||
->setLastFourDigits($card->last_four)
|
|
||||||
->setExpires($card->expiration_year, $card->expiration_month)
|
|
||||||
->setMetadata(
|
|
||||||
array(
|
|
||||||
'type' => 'balanced.account',
|
|
||||||
'balanced.accountURI' => $buyer->uri,
|
|
||||||
'balanced.cardURI' => $card->uri,
|
|
||||||
));
|
|
||||||
|
|
||||||
return $errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function renderCreatePaymentMethodForm(
|
|
||||||
AphrontRequest $request,
|
|
||||||
array $errors) {
|
|
||||||
|
|
||||||
$ccform = id(new PhortuneCreditCardForm())
|
|
||||||
->setUser($request->getUser())
|
|
||||||
->setErrors($errors)
|
|
||||||
->addScript('https://js.balancedpayments.com/v1/balanced.js');
|
|
||||||
|
|
||||||
Javelin::initBehavior(
|
|
||||||
'balanced-payment-form',
|
|
||||||
array(
|
|
||||||
'balancedMarketplaceURI' => $this->getMarketplaceURI(),
|
|
||||||
'formID' => $ccform->getFormID(),
|
|
||||||
));
|
|
||||||
|
|
||||||
return $ccform->buildForm();
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getBalancedShortErrorCode($error_code) {
|
|
||||||
$prefix = 'cc:balanced:';
|
|
||||||
if (strncmp($error_code, $prefix, strlen($prefix))) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return substr($error_code, strlen($prefix));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function translateCreatePaymentMethodErrorCode($error_code) {
|
|
||||||
$short_code = $this->getBalancedShortErrorCode($error_code);
|
|
||||||
|
|
||||||
if ($short_code) {
|
|
||||||
static $map = array(
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isset($map[$short_code])) {
|
|
||||||
return $map[$short_code];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $error_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getCreatePaymentMethodErrorMessage($error_code) {
|
|
||||||
$short_code = $this->getBalancedShortErrorCode($error_code);
|
|
||||||
if (!$short_code) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($short_code) {
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function loadBalancedAPILibraries() {
|
|
||||||
$root = dirname(phutil_get_library_root('phabricator'));
|
|
||||||
require_once $root.'/externals/httpful/bootstrap.php';
|
|
||||||
require_once $root.'/externals/restful/bootstrap.php';
|
|
||||||
require_once $root.'/externals/balanced-php/bootstrap.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
/**
|
|
||||||
* @provides javelin-behavior-balanced-payment-form
|
|
||||||
* @requires javelin-behavior
|
|
||||||
* javelin-dom
|
|
||||||
* phortune-credit-card-form
|
|
||||||
*/
|
|
||||||
|
|
||||||
JX.behavior('balanced-payment-form', function(config) {
|
|
||||||
balanced.init(config.balancedMarketplaceURI);
|
|
||||||
|
|
||||||
function onsubmit(card_data) {
|
|
||||||
var errors = [];
|
|
||||||
|
|
||||||
if (!balanced.card.isCardNumberValid(card_data.number)) {
|
|
||||||
errors.push('cc:invalid:number');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!balanced.card.isSecurityCodeValid(card_data.number, card_data.cvc)) {
|
|
||||||
errors.push('cc:invalid:cvc');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!balanced.card.isExpiryValid(card_data.month, card_data.year)) {
|
|
||||||
errors.push('cc:invalid:expiry');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errors.length) {
|
|
||||||
ccform.submitForm(errors);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = {
|
|
||||||
card_number: card_data.number,
|
|
||||||
security_code: card_data.cvc,
|
|
||||||
expiration_month: card_data.month,
|
|
||||||
expiration_year: card_data.year
|
|
||||||
};
|
|
||||||
|
|
||||||
balanced.card.create(data, onresponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onresponse(response) {
|
|
||||||
var token = null;
|
|
||||||
var errors = [];
|
|
||||||
|
|
||||||
if (response.error) {
|
|
||||||
errors = ['cc:balanced:error:' + response.error.type];
|
|
||||||
} else if (response.status != 201) {
|
|
||||||
errors = ['cc:balanced:http:' + response.status];
|
|
||||||
} else {
|
|
||||||
token = response.data.uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
ccform.submitForm(errors, {balancedMarketplaceURI: token});
|
|
||||||
}
|
|
||||||
|
|
||||||
var ccform = new JX.PhortuneCreditCardForm(JX.$(config.formID), onsubmit);
|
|
||||||
});
|
|
Loading…
Reference in a new issue