TransactionWithUsBankAccountTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. namespace Test\Integration;
  3. require_once dirname(__DIR__) . '/Setup.php';
  4. use DateTime;
  5. use Test;
  6. use Test\Setup;
  7. use Braintree;
  8. class UsBankAccountTransactionTest extends Setup
  9. {
  10. public function testSaleWithUsBankAccountNonce()
  11. {
  12. $result = Braintree\Transaction::sale([
  13. 'amount' => '100.00',
  14. 'merchantAccountId' => Test\Helper::usBankMerchantAccount(),
  15. 'paymentMethodNonce' => Test\Helper::generateValidUsBankAccountNonce(),
  16. 'options' => [
  17. 'submitForSettlement' => true,
  18. 'storeInVault' => true
  19. ]
  20. ]);
  21. $this->assertTrue($result->success);
  22. $transaction = $result->transaction;
  23. $this->assertEquals(Braintree\Transaction::SETTLEMENT_PENDING, $transaction->status);
  24. $this->assertEquals(Braintree\Transaction::SALE, $transaction->type);
  25. $this->assertEquals('100.00', $transaction->amount);
  26. $this->assertEquals('021000021', $transaction->usBankAccount->routingNumber);
  27. $this->assertEquals('1234', $transaction->usBankAccount->last4);
  28. $this->assertEquals('checking', $transaction->usBankAccount->accountType);
  29. $this->assertEquals('Dan Schulman', $transaction->usBankAccount->accountHolderName);
  30. $this->assertRegExp('/CHASE/', $transaction->usBankAccount->bankName);
  31. $this->assertEquals('cl mandate text', $transaction->usBankAccount->achMandate->text);
  32. $this->assertEquals('DateTime', get_class($transaction->usBankAccount->achMandate->acceptedAt));
  33. }
  34. public function testSaleWithUsBankAccountNonceAndVaultedToken()
  35. {
  36. $result = Braintree\Transaction::sale([
  37. 'amount' => '100.00',
  38. 'merchantAccountId' => Test\Helper::usBankMerchantAccount(),
  39. 'paymentMethodNonce' => Test\Helper::generateValidUsBankAccountNonce(),
  40. 'options' => [
  41. 'submitForSettlement' => true,
  42. 'storeInVault' => true
  43. ]
  44. ]);
  45. $this->assertTrue($result->success);
  46. $transaction = $result->transaction;
  47. $this->assertEquals(Braintree\Transaction::SETTLEMENT_PENDING, $transaction->status);
  48. $this->assertEquals(Braintree\Transaction::SALE, $transaction->type);
  49. $this->assertEquals('100.00', $transaction->amount);
  50. $this->assertEquals('021000021', $transaction->usBankAccount->routingNumber);
  51. $this->assertEquals('1234', $transaction->usBankAccount->last4);
  52. $this->assertEquals('checking', $transaction->usBankAccount->accountType);
  53. $this->assertEquals('Dan Schulman', $transaction->usBankAccount->accountHolderName);
  54. $this->assertEquals('cl mandate text', $transaction->usBankAccount->achMandate->text);
  55. $this->assertEquals('DateTime', get_class($transaction->usBankAccount->achMandate->acceptedAt));
  56. $result = Braintree\Transaction::sale([
  57. 'amount' => '100.00',
  58. 'merchantAccountId' => Test\Helper::usBankMerchantAccount(),
  59. 'paymentMethodToken' => $transaction->usBankAccount->token,
  60. 'options' => [
  61. 'submitForSettlement' => true,
  62. 'storeInVault' => true
  63. ]
  64. ]);
  65. $this->assertTrue($result->success);
  66. $transaction = $result->transaction;
  67. $this->assertEquals(Braintree\Transaction::SETTLEMENT_PENDING, $transaction->status);
  68. $this->assertEquals(Braintree\Transaction::SALE, $transaction->type);
  69. $this->assertEquals('100.00', $transaction->amount);
  70. $this->assertEquals('021000021', $transaction->usBankAccount->routingNumber);
  71. $this->assertEquals('1234', $transaction->usBankAccount->last4);
  72. $this->assertEquals('checking', $transaction->usBankAccount->accountType);
  73. $this->assertEquals('Dan Schulman', $transaction->usBankAccount->accountHolderName);
  74. $this->assertEquals('cl mandate text', $transaction->usBankAccount->achMandate->text);
  75. $this->assertEquals('DateTime', get_class($transaction->usBankAccount->achMandate->acceptedAt));
  76. }
  77. public function testSaleWithPlaidUsBankAccountNonce()
  78. {
  79. $result = Braintree\Transaction::sale([
  80. 'amount' => '100.00',
  81. 'merchantAccountId' => Test\Helper::usBankMerchantAccount(),
  82. 'paymentMethodNonce' => Test\Helper::generatePlaidUsBankAccountNonce(),
  83. 'options' => [
  84. 'submitForSettlement' => true,
  85. 'storeInVault' => true
  86. ]
  87. ]);
  88. $this->assertTrue($result->success);
  89. $transaction = $result->transaction;
  90. $this->assertEquals(Braintree\Transaction::SETTLEMENT_PENDING, $transaction->status);
  91. $this->assertEquals(Braintree\Transaction::SALE, $transaction->type);
  92. $this->assertEquals('100.00', $transaction->amount);
  93. $this->assertEquals('011000015', $transaction->usBankAccount->routingNumber);
  94. $this->assertEquals('0000', $transaction->usBankAccount->last4);
  95. $this->assertEquals('checking', $transaction->usBankAccount->accountType);
  96. $this->assertEquals('Dan Schulman', $transaction->usBankAccount->accountHolderName);
  97. $this->assertRegExp('/FEDERAL/', $transaction->usBankAccount->bankName);
  98. $this->assertEquals('cl mandate text', $transaction->usBankAccount->achMandate->text);
  99. $this->assertEquals('DateTime', get_class($transaction->usBankAccount->achMandate->acceptedAt));
  100. }
  101. public function testSaleWithInvalidUsBankAccountNonce()
  102. {
  103. $result = Braintree\Transaction::sale([
  104. 'amount' => '100.00',
  105. 'merchantAccountId' => Test\Helper::usBankMerchantAccount(),
  106. 'paymentMethodNonce' => Test\Helper::generateInvalidUsBankAccountNonce(),
  107. 'options' => [
  108. 'submitForSettlement' => true,
  109. 'storeInVault' => true
  110. ]
  111. ]);
  112. $this->assertFalse($result->success);
  113. $baseErrors = $result->errors->forKey('transaction')->onAttribute('paymentMethodNonce');
  114. $this->assertEquals(Braintree\Error\Codes::TRANSACTION_PAYMENT_METHOD_NONCE_UNKNOWN, $baseErrors[0]->code);
  115. }
  116. public function testCompliantMerchantUnverifiedToken()
  117. {
  118. $gateway = new Braintree\Gateway([
  119. 'environment' => 'development',
  120. 'merchantId' => 'integration2_merchant_id',
  121. 'publicKey' => 'integration2_public_key',
  122. 'privateKey' => 'integration2_private_key'
  123. ]);
  124. $customer = $gateway->customer()->create([
  125. 'firstName' => 'Joe',
  126. 'lastName' => 'Brown'
  127. ])->customer;
  128. $result = $gateway->paymentMethod()->create([
  129. 'customerId' => $customer->id,
  130. 'paymentMethodNonce' => Test\Helper::generateValidUsBankAccountNonce(),
  131. 'options' => [
  132. 'verificationMerchantAccountId' => Test\Helper::anotherUsBankMerchantAccount()
  133. ]
  134. ]);
  135. $usBankAccount = $result->paymentMethod;
  136. $this->assertEquals('021000021', $usBankAccount->routingNumber);
  137. $this->assertEquals('1234', $usBankAccount->last4);
  138. $this->assertEquals('checking', $usBankAccount->accountType);
  139. $this->assertEquals('Dan Schulman', $usBankAccount->accountHolderName);
  140. $this->assertRegexp('/CHASE/', $usBankAccount->bankName);
  141. $this->assertEquals(false, $usBankAccount->verified);
  142. $this->assertEquals(0, count($usBankAccount->verifications));
  143. $sale = $gateway->transaction()->sale([
  144. 'amount' => '100.00',
  145. 'merchantAccountId' => Test\Helper::anotherUsBankMerchantAccount(),
  146. 'paymentMethodToken' => $usBankAccount->token,
  147. 'options' => [
  148. 'submitForSettlement' => true,
  149. 'storeInVault' => true
  150. ]
  151. ]);
  152. $this->assertFalse($sale->success);
  153. $baseErrors = $sale->errors->forKey('transaction')->onAttribute('paymentMethodToken');
  154. $this->assertEquals(Braintree\Error\Codes::TRANSACTION_US_BANK_ACCOUNT_NOT_VERIFIED, $baseErrors[0]->code);
  155. }
  156. public function testCompliantMerchantUnverifiedNonce()
  157. {
  158. $gateway = new Braintree\Gateway([
  159. 'environment' => 'development',
  160. 'merchantId' => 'integration2_merchant_id',
  161. 'publicKey' => 'integration2_public_key',
  162. 'privateKey' => 'integration2_private_key'
  163. ]);
  164. $sale = $gateway->transaction()->sale([
  165. 'amount' => '100.00',
  166. 'merchantAccountId' => Test\Helper::anotherUsBankMerchantAccount(),
  167. 'paymentMethodNonce' => Test\Helper::generateValidUsBankAccountNonce(),
  168. 'options' => [
  169. 'submitForSettlement' => true,
  170. 'storeInVault' => true
  171. ]
  172. ]);
  173. $this->assertFalse($sale->success);
  174. $baseErrors = $sale->errors->forKey('transaction')->onAttribute('paymentMethodNonce');
  175. $this->assertEquals(Braintree\Error\Codes::TRANSACTION_US_BANK_ACCOUNT_NONCE_MUST_BE_PLAID_VERIFIED, $baseErrors[0]->code);
  176. }
  177. public function testCompliantMerchantPlaidToken()
  178. {
  179. $gateway = new Braintree\Gateway([
  180. 'environment' => 'development',
  181. 'merchantId' => 'integration2_merchant_id',
  182. 'publicKey' => 'integration2_public_key',
  183. 'privateKey' => 'integration2_private_key'
  184. ]);
  185. $customer = $gateway->customer()->create([
  186. 'firstName' => 'Joe',
  187. 'lastName' => 'Brown'
  188. ])->customer;
  189. $result = $gateway->paymentMethod()->create([
  190. 'customerId' => $customer->id,
  191. 'paymentMethodNonce' => Test\Helper::generatePlaidUsBankAccountNonce(),
  192. 'options' => [
  193. 'verificationMerchantAccountId' => Test\Helper::anotherUsBankMerchantAccount()
  194. ]
  195. ]);
  196. $usBankAccount = $result->paymentMethod;
  197. $this->assertEquals('011000015', $usBankAccount->routingNumber);
  198. $this->assertEquals('0000', $usBankAccount->last4);
  199. $this->assertEquals('checking', $usBankAccount->accountType);
  200. $this->assertEquals('Dan Schulman', $usBankAccount->accountHolderName);
  201. $this->assertRegexp('/FEDERAL/', $usBankAccount->bankName);
  202. $this->assertEquals(true, $usBankAccount->verified);
  203. $this->assertEquals(1, count($usBankAccount->verifications));
  204. $sale = $gateway->transaction()->sale([
  205. 'amount' => '100.00',
  206. 'merchantAccountId' => Test\Helper::anotherUsBankMerchantAccount(),
  207. 'paymentMethodToken' => $usBankAccount->token,
  208. 'options' => [
  209. 'submitForSettlement' => true,
  210. 'storeInVault' => true
  211. ]
  212. ]);
  213. $this->assertTrue($sale->success);
  214. $this->assertEquals($sale->transaction->amount, '100');
  215. $this->assertEquals($sale->transaction->usBankAccount->token, $usBankAccount->token);
  216. }
  217. public function testCompliantMerchantPlaidNonce()
  218. {
  219. $gateway = new Braintree\Gateway([
  220. 'environment' => 'development',
  221. 'merchantId' => 'integration2_merchant_id',
  222. 'publicKey' => 'integration2_public_key',
  223. 'privateKey' => 'integration2_private_key'
  224. ]);
  225. $sale = $gateway->transaction()->sale([
  226. 'amount' => '100.00',
  227. 'merchantAccountId' => Test\Helper::anotherUsBankMerchantAccount(),
  228. 'paymentMethodNonce' => Test\Helper::generatePlaidUsBankAccountNonce(),
  229. 'options' => [
  230. 'submitForSettlement' => true,
  231. 'storeInVault' => true
  232. ]
  233. ]);
  234. $this->assertTrue($sale->success);
  235. $this->assertEquals($sale->transaction->amount, '100');
  236. }
  237. }