CreditCardTest.php 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329
  1. <?php
  2. namespace Test\Integration;
  3. require_once dirname(__DIR__) . '/Setup.php';
  4. use Test;
  5. use Test\Braintree\CreditCardNumbers\CardTypeIndicators;
  6. use Test\Setup;
  7. use Braintree;
  8. class CreditCardTest extends Setup
  9. {
  10. public function testCreate()
  11. {
  12. $customer = Braintree\Customer::createNoValidate();
  13. $result = Braintree\CreditCard::create([
  14. 'customerId' => $customer->id,
  15. 'cardholderName' => 'Cardholder',
  16. 'number' => '5105105105105100',
  17. 'expirationDate' => '05/12'
  18. ]);
  19. $this->assertTrue($result->success);
  20. $this->assertEquals($customer->id, $result->creditCard->customerId);
  21. $this->assertEquals('510510', $result->creditCard->bin);
  22. $this->assertEquals('5100', $result->creditCard->last4);
  23. $this->assertEquals('Cardholder', $result->creditCard->cardholderName);
  24. $this->assertEquals('05/2012', $result->creditCard->expirationDate);
  25. $this->assertEquals(1, preg_match('/\A\w{32}\z/', $result->creditCard->uniqueNumberIdentifier));
  26. $this->assertFalse($result->creditCard->isVenmoSdk());
  27. $this->assertEquals(1, preg_match('/png/', $result->creditCard->imageUrl));
  28. }
  29. public function testGatewayCreate()
  30. {
  31. $customer = Braintree\Customer::createNoValidate();
  32. $gateway = new Braintree\Gateway([
  33. 'environment' => 'development',
  34. 'merchantId' => 'integration_merchant_id',
  35. 'publicKey' => 'integration_public_key',
  36. 'privateKey' => 'integration_private_key'
  37. ]);
  38. $result = $gateway->creditCard()->create([
  39. 'customerId' => $customer->id,
  40. 'cardholderName' => 'Cardholder',
  41. 'number' => '5105105105105100',
  42. 'expirationDate' => '05/12'
  43. ]);
  44. $this->assertTrue($result->success);
  45. $this->assertEquals($customer->id, $result->creditCard->customerId);
  46. $this->assertEquals('510510', $result->creditCard->bin);
  47. $this->assertEquals('5100', $result->creditCard->last4);
  48. $this->assertEquals('Cardholder', $result->creditCard->cardholderName);
  49. $this->assertEquals('05/2012', $result->creditCard->expirationDate);
  50. }
  51. public function testCreate_withDefault()
  52. {
  53. $customer = Braintree\Customer::createNoValidate();
  54. $card1 = Braintree\CreditCard::create([
  55. 'customerId' => $customer->id,
  56. 'cardholderName' => 'Cardholder',
  57. 'number' => '5105105105105100',
  58. 'expirationDate' => '05/12'
  59. ])->creditCard;
  60. $this->assertTrue($card1->isDefault());
  61. $card2 = Braintree\CreditCard::create([
  62. 'customerId' => $customer->id,
  63. 'cardholderName' => 'Cardholder',
  64. 'number' => '5105105105105100',
  65. 'expirationDate' => '05/12',
  66. 'options' => [
  67. 'makeDefault' => true
  68. ]
  69. ])->creditCard;
  70. $card1 = Braintree\CreditCard::find($card1->token);
  71. $this->assertFalse($card1->isDefault());
  72. $this->assertTrue($card2->isDefault());
  73. }
  74. public function testCreateWithVerificationAmount()
  75. {
  76. $customer = Braintree\Customer::createNoValidate();
  77. $result = Braintree\CreditCard::create([
  78. 'customerId' => $customer->id,
  79. 'cardholderName' => 'Cardholder',
  80. 'number' => '4111111111111111',
  81. 'expirationDate' => '05/12',
  82. 'options' => [
  83. 'verificationAmount' => '5.00',
  84. 'verifyCard' => true
  85. ]
  86. ]);
  87. $this->assertTrue($result->success);
  88. $this->assertEquals($customer->id, $result->creditCard->customerId);
  89. $this->assertEquals('411111', $result->creditCard->bin);
  90. $this->assertEquals('1111', $result->creditCard->last4);
  91. $this->assertEquals('Cardholder', $result->creditCard->cardholderName);
  92. $this->assertEquals('05/2012', $result->creditCard->expirationDate);
  93. $this->assertEquals(1, preg_match('/\A\w{32}\z/', $result->creditCard->uniqueNumberIdentifier));
  94. $this->assertFalse($result->creditCard->isVenmoSdk());
  95. $this->assertEquals(1, preg_match('/png/', $result->creditCard->imageUrl));
  96. }
  97. public function testAddCardToExistingCustomerUsingNonce()
  98. {
  99. $customer = Braintree\Customer::createNoValidate();
  100. $http = new HttpClientApi(Braintree\Configuration::$global);
  101. $nonce = $http->nonce_for_new_card([
  102. "credit_card" => [
  103. "number" => "4111111111111111",
  104. "expirationMonth" => "11",
  105. "expirationYear" => "2099"
  106. ],
  107. "share" => true
  108. ]);
  109. $result = Braintree\CreditCard::create([
  110. 'customerId' => $customer->id,
  111. 'paymentMethodNonce' => $nonce
  112. ]);
  113. $this->assertSame("411111", $result->creditCard->bin);
  114. $this->assertSame("1111", $result->creditCard->last4);
  115. }
  116. public function testCreate_withSecurityParams()
  117. {
  118. $customer = Braintree\Customer::createNoValidate();
  119. $result = Braintree\CreditCard::create([
  120. 'customerId' => $customer->id,
  121. 'deviceSessionId' => 'abc_123',
  122. 'fraudMerchantId' => '456',
  123. 'cardholderName' => 'Cardholder',
  124. 'number' => '5105105105105100',
  125. 'expirationDate' => '05/12'
  126. ]);
  127. $this->assertTrue($result->success);
  128. }
  129. public function testCreate_withExpirationMonthAndYear()
  130. {
  131. $customer = Braintree\Customer::createNoValidate();
  132. $result = Braintree\CreditCard::create([
  133. 'customerId' => $customer->id,
  134. 'cardholderName' => 'Cardholder',
  135. 'number' => '5105105105105100',
  136. 'expirationMonth' => '05',
  137. 'expirationYear' => '2011'
  138. ]);
  139. $this->assertTrue($result->success);
  140. $this->assertEquals($customer->id, $result->creditCard->customerId);
  141. $this->assertEquals('510510', $result->creditCard->bin);
  142. $this->assertEquals('5100', $result->creditCard->last4);
  143. $this->assertEquals('Cardholder', $result->creditCard->cardholderName);
  144. $this->assertEquals('05/2011', $result->creditCard->expirationDate);
  145. }
  146. public function testCreate_withSpecifyingToken()
  147. {
  148. $token = strval(rand());
  149. $customer = Braintree\Customer::createNoValidate();
  150. $result = Braintree\CreditCard::create([
  151. 'customerId' => $customer->id,
  152. 'number' => '5105105105105100',
  153. 'expirationDate' => '05/2011',
  154. 'token' => $token
  155. ]);
  156. $this->assertTrue($result->success);
  157. $this->assertEquals($token, $result->creditCard->token);
  158. $this->assertEquals($token, Braintree\CreditCard::find($token)->token);
  159. }
  160. public function testCreate_withDuplicateCardCheck()
  161. {
  162. $customer = Braintree\Customer::createNoValidate();
  163. $attributes = [
  164. 'customerId' => $customer->id,
  165. 'number' => '5105105105105100',
  166. 'expirationDate' => '05/2011',
  167. 'options' => ['failOnDuplicatePaymentMethod' => true]
  168. ];
  169. Braintree\CreditCard::create($attributes);
  170. $result = Braintree\CreditCard::create($attributes);
  171. $this->assertFalse($result->success);
  172. $errors = $result->errors->forKey('creditCard')->onAttribute('number');
  173. $this->assertEquals(Braintree\Error\Codes::CREDIT_CARD_DUPLICATE_CARD_EXISTS, $errors[0]->code);
  174. $this->assertEquals(1, preg_match('/Duplicate card exists in the vault\./', $result->message));
  175. }
  176. public function testCreate_withCardVerification()
  177. {
  178. $customer = Braintree\Customer::createNoValidate();
  179. $result = Braintree\CreditCard::create([
  180. 'customerId' => $customer->id,
  181. 'number' => '5105105105105100',
  182. 'expirationDate' => '05/2011',
  183. 'options' => ['verifyCard' => true]
  184. ]);
  185. $this->assertFalse($result->success);
  186. $this->assertEquals(Braintree\Result\CreditCardVerification::PROCESSOR_DECLINED, $result->creditCardVerification->status);
  187. $this->assertEquals('2000', $result->creditCardVerification->processorResponseCode);
  188. $this->assertEquals('Do Not Honor', $result->creditCardVerification->processorResponseText);
  189. $this->assertEquals('I', $result->creditCardVerification->cvvResponseCode);
  190. $this->assertEquals(null, $result->creditCardVerification->avsErrorResponseCode);
  191. $this->assertEquals('I', $result->creditCardVerification->avsPostalCodeResponseCode);
  192. $this->assertEquals('I', $result->creditCardVerification->avsStreetAddressResponseCode);
  193. $this->assertEquals(Braintree\CreditCard::PREPAID_UNKNOWN, $result->creditCardVerification->creditCard['prepaid']);
  194. }
  195. public function testCreate_withCardVerificationReturnsVerificationWithRiskData()
  196. {
  197. $gateway = Test\Helper::advancedFraudIntegrationMerchantGateway();
  198. $customer = $gateway->customer()->createNoValidate();
  199. $result = $gateway->creditCard()->create([
  200. 'customerId' => $customer->id,
  201. 'number' => '4111111111111111',
  202. 'expirationDate' => '05/2011',
  203. 'options' => ['verifyCard' => true],
  204. 'deviceSessionId' => 'abc123'
  205. ]);
  206. $this->assertTrue($result->success);
  207. $this->assertNotNull($result->creditCard->verification->riskData);
  208. $this->assertNotNull($result->creditCard->verification->riskData->decision);
  209. $this->assertNotNull($result->creditCard->verification->riskData->deviceDataCaptured);
  210. $this->assertNotNull($result->creditCard->verification->riskData->id);
  211. }
  212. public function testCreate_withCardVerificationAndOverriddenAmount()
  213. {
  214. $customer = Braintree\Customer::createNoValidate();
  215. $result = Braintree\CreditCard::create([
  216. 'customerId' => $customer->id,
  217. 'number' => '5105105105105100',
  218. 'expirationDate' => '05/2011',
  219. 'options' => ['verifyCard' => true, 'verificationAmount' => '1.02']
  220. ]);
  221. $this->assertFalse($result->success);
  222. $this->assertEquals(Braintree\Result\CreditCardVerification::PROCESSOR_DECLINED, $result->creditCardVerification->status);
  223. $this->assertEquals('1.02', $result->creditCardVerification->amount);
  224. $this->assertEquals('USD', $result->creditCardVerification->currencyIsoCode);
  225. $this->assertEquals('2000', $result->creditCardVerification->processorResponseCode);
  226. $this->assertEquals('Do Not Honor', $result->creditCardVerification->processorResponseText);
  227. $this->assertEquals('I', $result->creditCardVerification->cvvResponseCode);
  228. $this->assertEquals(null, $result->creditCardVerification->avsErrorResponseCode);
  229. $this->assertEquals('I', $result->creditCardVerification->avsPostalCodeResponseCode);
  230. $this->assertEquals('I', $result->creditCardVerification->avsStreetAddressResponseCode);
  231. $this->assertEquals(Braintree\CreditCard::PREPAID_UNKNOWN, $result->creditCardVerification->creditCard['prepaid']);
  232. }
  233. public function testCreate_withCardVerificationAndSpecificMerchantAccount()
  234. {
  235. $customer = Braintree\Customer::createNoValidate();
  236. $result = Braintree\CreditCard::create([
  237. 'customerId' => $customer->id,
  238. 'number' => '5105105105105100',
  239. 'expirationDate' => '05/2011',
  240. 'options' => ['verificationMerchantAccountId' => Test\Helper::nonDefaultMerchantAccountId(), 'verifyCard' => true],
  241. ]);
  242. $this->assertFalse($result->success);
  243. $this->assertEquals(Braintree\Result\CreditCardVerification::PROCESSOR_DECLINED, $result->creditCardVerification->status);
  244. $this->assertEquals('2000', $result->creditCardVerification->processorResponseCode);
  245. $this->assertEquals('Do Not Honor', $result->creditCardVerification->processorResponseText);
  246. $this->assertEquals('I', $result->creditCardVerification->cvvResponseCode);
  247. $this->assertEquals(null, $result->creditCardVerification->avsErrorResponseCode);
  248. $this->assertEquals('I', $result->creditCardVerification->avsPostalCodeResponseCode);
  249. $this->assertEquals('I', $result->creditCardVerification->avsStreetAddressResponseCode);
  250. }
  251. public function testCreate_withBillingAddress()
  252. {
  253. $customer = Braintree\Customer::createNoValidate();
  254. $result = Braintree\CreditCard::create([
  255. 'customerId' => $customer->id,
  256. 'cardholderName' => 'Peter Tomlin',
  257. 'number' => '5105105105105100',
  258. 'expirationDate' => '05/12',
  259. 'billingAddress' => [
  260. 'firstName' => 'Drew',
  261. 'lastName' => 'Smith',
  262. 'company' => 'Smith Co.',
  263. 'streetAddress' => '1 E Main St',
  264. 'extendedAddress' => 'Suite 101',
  265. 'locality' => 'Chicago',
  266. 'region' => 'IL',
  267. 'postalCode' => '60622',
  268. 'countryName' => 'Micronesia',
  269. 'countryCodeAlpha2' => 'FM',
  270. 'countryCodeAlpha3' => 'FSM',
  271. 'countryCodeNumeric' => '583'
  272. ]
  273. ]);
  274. $this->assertTrue($result->success);
  275. $this->assertEquals($customer->id, $result->creditCard->customerId);
  276. $this->assertEquals('510510', $result->creditCard->bin);
  277. $this->assertEquals('5100', $result->creditCard->last4);
  278. $this->assertEquals('Peter Tomlin', $result->creditCard->cardholderName);
  279. $this->assertEquals('05/2012', $result->creditCard->expirationDate);
  280. $address = $result->creditCard->billingAddress;
  281. $this->assertEquals('Drew', $address->firstName);
  282. $this->assertEquals('Smith', $address->lastName);
  283. $this->assertEquals('Smith Co.', $address->company);
  284. $this->assertEquals('1 E Main St', $address->streetAddress);
  285. $this->assertEquals('Suite 101', $address->extendedAddress);
  286. $this->assertEquals('Chicago', $address->locality);
  287. $this->assertEquals('IL', $address->region);
  288. $this->assertEquals('60622', $address->postalCode);
  289. $this->assertEquals('Micronesia', $address->countryName);
  290. $this->assertEquals('FM', $address->countryCodeAlpha2);
  291. $this->assertEquals('FSM', $address->countryCodeAlpha3);
  292. $this->assertEquals('583', $address->countryCodeNumeric);
  293. }
  294. public function testCreate_withExistingBillingAddress()
  295. {
  296. $customer = Braintree\Customer::createNoValidate();
  297. $existingAddress = Braintree\Address::createNoValidate([
  298. 'customerId' => $customer->id,
  299. 'firstName' => 'John'
  300. ]);
  301. $result = Braintree\CreditCard::create([
  302. 'customerId' => $customer->id,
  303. 'number' => '5105105105105100',
  304. 'expirationDate' => '05/12',
  305. 'billingAddressId' => $existingAddress->id
  306. ]);
  307. $this->assertTrue($result->success);
  308. $address = $result->creditCard->billingAddress;
  309. $this->assertEquals($existingAddress->id, $address->id);
  310. $this->assertEquals('John', $address->firstName);
  311. }
  312. public function testCreate_withValidationErrors()
  313. {
  314. $customer = Braintree\Customer::createNoValidate();
  315. $result = Braintree\CreditCard::create([
  316. 'expirationDate' => 'invalid',
  317. 'billingAddress' => [
  318. 'countryName' => 'Tuvalu',
  319. 'countryCodeAlpha2' => 'US'
  320. ]
  321. ]);
  322. $this->assertFalse($result->success);
  323. $errors = $result->errors->forKey('creditCard')->onAttribute('expirationDate');
  324. $this->assertEquals(Braintree\Error\Codes::CREDIT_CARD_EXPIRATION_DATE_IS_INVALID, $errors[0]->code);
  325. $this->assertEquals(1, preg_match('/Credit card number is required\./', $result->message));
  326. $this->assertEquals(1, preg_match('/Customer ID is required\./', $result->message));
  327. $this->assertEquals(1, preg_match('/Expiration date is invalid\./', $result->message));
  328. $errors = $result->errors->forKey('creditCard')->forKey('billingAddress')->onAttribute('base');
  329. $this->assertEquals(Braintree\Error\Codes::ADDRESS_INCONSISTENT_COUNTRY, $errors[0]->code);
  330. }
  331. public function testCreate_withVenmoSdkPaymentMethodCode()
  332. {
  333. $customer = Braintree\Customer::createNoValidate();
  334. $result = Braintree\CreditCard::create([
  335. 'customerId' => $customer->id,
  336. 'venmoSdkPaymentMethodCode' => Braintree\Test\VenmoSdk::generateTestPaymentMethodCode('378734493671000')
  337. ]);
  338. $this->assertTrue($result->success);
  339. $this->assertEquals("378734", $result->creditCard->bin);
  340. }
  341. public function testCreate_with_invalid_venmoSdkPaymentMethodCode()
  342. {
  343. $customer = Braintree\Customer::createNoValidate();
  344. $result = Braintree\CreditCard::create([
  345. 'customerId' => $customer->id,
  346. 'venmoSdkPaymentMethodCode' => Braintree\Test\VenmoSdk::getInvalidPaymentMethodCode(),
  347. ]);
  348. $this->assertFalse($result->success);
  349. $errors = $result->errors->forKey('creditCard')->onAttribute('venmoSdkPaymentMethodCode');
  350. $this->assertEquals($errors[0]->code, Braintree\Error\Codes::CREDIT_CARD_INVALID_VENMO_SDK_PAYMENT_METHOD_CODE);
  351. }
  352. public function testCreate_with_venmoSdkSession()
  353. {
  354. $customer = Braintree\Customer::createNoValidate();
  355. $result = Braintree\CreditCard::create([
  356. 'customerId' => $customer->id,
  357. 'number' => '5105105105105100',
  358. 'expirationDate' => '05/12',
  359. 'options' => [
  360. 'venmoSdkSession' => Braintree\Test\VenmoSdk::getTestSession()
  361. ]
  362. ]);
  363. $this->assertTrue($result->success);
  364. $this->assertFalse($result->creditCard->isVenmoSdk());
  365. }
  366. public function testCreate_with_invalidVenmoSdkSession()
  367. {
  368. $customer = Braintree\Customer::createNoValidate();
  369. $result = Braintree\CreditCard::create([
  370. 'customerId' => $customer->id,
  371. 'number' => '5105105105105100',
  372. 'expirationDate' => '05/12',
  373. 'options' => [
  374. 'venmoSdkSession' => Braintree\Test\VenmoSdk::getInvalidTestSession(),
  375. ]
  376. ]);
  377. $this->assertTrue($result->success);
  378. $this->assertFalse($result->creditCard->isVenmoSdk());
  379. }
  380. public function testCreateNoValidate_throwsIfValidationsFail()
  381. {
  382. $this->setExpectedException('Braintree\Exception\ValidationsFailed');
  383. $customer = Braintree\Customer::createNoValidate();
  384. Braintree\CreditCard::createNoValidate([
  385. 'expirationDate' => 'invalid',
  386. ]);
  387. }
  388. public function testCreateNoValidate_returnsCreditCardIfValid()
  389. {
  390. $customer = Braintree\Customer::createNoValidate();
  391. $creditCard = Braintree\CreditCard::createNoValidate([
  392. 'customerId' => $customer->id,
  393. 'cardholderName' => 'Cardholder',
  394. 'number' => '5105105105105100',
  395. 'expirationDate' => '05/12'
  396. ]);
  397. $this->assertEquals($customer->id, $creditCard->customerId);
  398. $this->assertEquals('510510', $creditCard->bin);
  399. $this->assertEquals('5100', $creditCard->last4);
  400. $this->assertEquals('Cardholder', $creditCard->cardholderName);
  401. $this->assertEquals('05/2012', $creditCard->expirationDate);
  402. }
  403. public function testCreateFromTransparentRedirect()
  404. {
  405. Test\Helper::suppressDeprecationWarnings();
  406. $customer = Braintree\Customer::createNoValidate();
  407. $queryString = $this->createCreditCardViaTr(
  408. [
  409. 'credit_card' => [
  410. 'number' => '5105105105105100',
  411. 'expiration_date' => '05/12'
  412. ]
  413. ],
  414. [
  415. 'creditCard' => [
  416. 'customerId' => $customer->id
  417. ]
  418. ]
  419. );
  420. $result = Braintree\CreditCard::createFromTransparentRedirect($queryString);
  421. $this->assertTrue($result->success);
  422. $this->assertEquals('510510', $result->creditCard->bin);
  423. $this->assertEquals('5100', $result->creditCard->last4);
  424. $this->assertEquals('05/2012', $result->creditCard->expirationDate);
  425. }
  426. public function testCreateFromTransparentRedirect_withDefault()
  427. {
  428. Test\Helper::suppressDeprecationWarnings();
  429. $customer = Braintree\Customer::createNoValidate();
  430. $queryString = $this->createCreditCardViaTr(
  431. [
  432. 'credit_card' => [
  433. 'number' => '5105105105105100',
  434. 'expiration_date' => '05/12',
  435. 'options' => ['make_default' => true]
  436. ]
  437. ],
  438. [
  439. 'creditCard' => [
  440. 'customerId' => $customer->id
  441. ]
  442. ]
  443. );
  444. $result = Braintree\CreditCard::createFromTransparentRedirect($queryString);
  445. $this->assertTrue($result->creditCard->isDefault());
  446. }
  447. public function testUpdateFromTransparentRedirect()
  448. {
  449. $customer = Braintree\Customer::createNoValidate();
  450. $creditCard = Braintree\CreditCard::createNoValidate([
  451. 'customerId' => $customer->id,
  452. 'number' => '5105105105105100',
  453. 'expirationDate' => '05/12'
  454. ]);
  455. $queryString = $this->updateCreditCardViaTr(
  456. [
  457. 'credit_card' => [
  458. 'number' => '4111111111111111',
  459. 'expiration_date' => '01/11'
  460. ]
  461. ],
  462. ['paymentMethodToken' => $creditCard->token]
  463. );
  464. $result = Braintree\CreditCard::updateFromTransparentRedirect($queryString);
  465. $this->assertTrue($result->success);
  466. $this->assertEquals('411111', $result->creditCard->bin);
  467. $this->assertEquals('1111', $result->creditCard->last4);
  468. $this->assertEquals('01/2011', $result->creditCard->expirationDate);
  469. }
  470. public function testUpdateFromTransparentRedirect_withDefault()
  471. {
  472. $customer = Braintree\Customer::createNoValidate();
  473. $card1 = Braintree\CreditCard::createNoValidate([
  474. 'customerId' => $customer->id,
  475. 'number' => '5105105105105100',
  476. 'expirationDate' => '05/12'
  477. ]);
  478. $card2 = Braintree\CreditCard::createNoValidate([
  479. 'customerId' => $customer->id,
  480. 'number' => '5105105105105100',
  481. 'expirationDate' => '05/12'
  482. ]);
  483. $this->assertFalse($card2->isDefault());
  484. $queryString = $this->updateCreditCardViaTr(
  485. [
  486. 'credit_card' => [
  487. 'options' => [
  488. 'make_default' => true
  489. ]
  490. ]
  491. ],
  492. ['paymentMethodToken' => $card2->token]
  493. );
  494. $result = Braintree\CreditCard::updateFromTransparentRedirect($queryString);
  495. $this->assertFalse(Braintree\CreditCard::find($card1->token)->isDefault());
  496. $this->assertTrue(Braintree\CreditCard::find($card2->token)->isDefault());
  497. }
  498. public function testUpdateFromTransparentRedirect_andUpdateExistingBillingAddress()
  499. {
  500. $customer = Braintree\Customer::createNoValidate();
  501. $card = Braintree\CreditCard::createNoValidate([
  502. 'customerId' => $customer->id,
  503. 'number' => '5105105105105100',
  504. 'expirationDate' => '05/12',
  505. 'billingAddress' => [
  506. 'firstName' => 'Drew',
  507. 'lastName' => 'Smith',
  508. 'company' => 'Smith Co.',
  509. 'streetAddress' => '123 Old St',
  510. 'extendedAddress' => 'Suite 101',
  511. 'locality' => 'Chicago',
  512. 'region' => 'IL',
  513. 'postalCode' => '60622',
  514. 'countryName' => 'United States of America'
  515. ]
  516. ]);
  517. $queryString = $this->updateCreditCardViaTr(
  518. [],
  519. [
  520. 'paymentMethodToken' => $card->token,
  521. 'creditCard' => [
  522. 'billingAddress' => [
  523. 'streetAddress' => '123 New St',
  524. 'locality' => 'St. Louis',
  525. 'region' => 'MO',
  526. 'postalCode' => '63119',
  527. 'options' => [
  528. 'updateExisting' => True
  529. ]
  530. ]
  531. ]
  532. ]
  533. );
  534. $result = Braintree\CreditCard::updateFromTransparentRedirect($queryString);
  535. $this->assertTrue($result->success);
  536. $card = $result->creditCard;
  537. $this->assertEquals(1, sizeof(Braintree\Customer::find($customer->id)->addresses));
  538. $this->assertEquals('123 New St', $card->billingAddress->streetAddress);
  539. $this->assertEquals('St. Louis', $card->billingAddress->locality);
  540. $this->assertEquals('MO', $card->billingAddress->region);
  541. $this->assertEquals('63119', $card->billingAddress->postalCode);
  542. }
  543. public function testSale_createsASaleUsingGivenToken()
  544. {
  545. $customer = Braintree\Customer::createNoValidate([
  546. 'creditCard' => [
  547. 'number' => '5105105105105100',
  548. 'expirationDate' => '05/12'
  549. ]
  550. ]);
  551. $creditCard = $customer->creditCards[0];
  552. $result = Braintree\CreditCard::sale($creditCard->token, [
  553. 'amount' => '100.00'
  554. ]);
  555. $this->assertTrue($result->success);
  556. $this->assertEquals('100.00', $result->transaction->amount);
  557. $this->assertEquals($customer->id, $result->transaction->customerDetails->id);
  558. $this->assertEquals($creditCard->token, $result->transaction->creditCardDetails->token);
  559. }
  560. public function testSaleNoValidate_createsASaleUsingGivenToken()
  561. {
  562. $customer = Braintree\Customer::createNoValidate([
  563. 'creditCard' => [
  564. 'number' => '5105105105105100',
  565. 'expirationDate' => '05/12'
  566. ]
  567. ]);
  568. $creditCard = $customer->creditCards[0];
  569. $transaction = Braintree\CreditCard::saleNoValidate($creditCard->token, [
  570. 'amount' => '100.00'
  571. ]);
  572. $this->assertEquals('100.00', $transaction->amount);
  573. $this->assertEquals($customer->id, $transaction->customerDetails->id);
  574. $this->assertEquals($creditCard->token, $transaction->creditCardDetails->token);
  575. }
  576. public function testSaleNoValidate_createsASaleUsingGivenTokenAndCvv()
  577. {
  578. $customer = Braintree\Customer::createNoValidate([
  579. 'creditCard' => [
  580. 'number' => '5105105105105100',
  581. 'expirationDate' => '05/12'
  582. ]
  583. ]);
  584. $creditCard = $customer->creditCards[0];
  585. $transaction = Braintree\CreditCard::saleNoValidate($creditCard->token, [
  586. 'amount' => '100.00',
  587. 'creditCard' => [
  588. 'cvv' => '301'
  589. ]
  590. ]);
  591. $this->assertEquals('100.00', $transaction->amount);
  592. $this->assertEquals($customer->id, $transaction->customerDetails->id);
  593. $this->assertEquals($creditCard->token, $transaction->creditCardDetails->token);
  594. $this->assertEquals('S', $transaction->cvvResponseCode);
  595. }
  596. public function testSaleNoValidate_throwsIfInvalid()
  597. {
  598. $customer = Braintree\Customer::createNoValidate([
  599. 'creditCard' => [
  600. 'number' => '5105105105105100',
  601. 'expirationDate' => '05/12'
  602. ]
  603. ]);
  604. $creditCard = $customer->creditCards[0];
  605. $this->setExpectedException('Braintree\Exception\ValidationsFailed');
  606. Braintree\CreditCard::saleNoValidate($creditCard->token, [
  607. 'amount' => 'invalid'
  608. ]);
  609. }
  610. public function testCredit_createsACreditUsingGivenToken()
  611. {
  612. $customer = Braintree\Customer::createNoValidate([
  613. 'creditCard' => [
  614. 'number' => '5105105105105100',
  615. 'expirationDate' => '05/12'
  616. ]
  617. ]);
  618. $creditCard = $customer->creditCards[0];
  619. $result = Braintree\CreditCard::credit($creditCard->token, [
  620. 'amount' => '100.00'
  621. ]);
  622. $this->assertTrue($result->success);
  623. $this->assertEquals('100.00', $result->transaction->amount);
  624. $this->assertEquals(Braintree\Transaction::CREDIT, $result->transaction->type);
  625. $this->assertEquals($customer->id, $result->transaction->customerDetails->id);
  626. $this->assertEquals($creditCard->token, $result->transaction->creditCardDetails->token);
  627. }
  628. public function testCreditNoValidate_createsACreditUsingGivenToken()
  629. {
  630. $customer = Braintree\Customer::createNoValidate([
  631. 'creditCard' => [
  632. 'number' => '5105105105105100',
  633. 'expirationDate' => '05/12'
  634. ]
  635. ]);
  636. $creditCard = $customer->creditCards[0];
  637. $transaction = Braintree\CreditCard::creditNoValidate($creditCard->token, [
  638. 'amount' => '100.00'
  639. ]);
  640. $this->assertEquals('100.00', $transaction->amount);
  641. $this->assertEquals(Braintree\Transaction::CREDIT, $transaction->type);
  642. $this->assertEquals($customer->id, $transaction->customerDetails->id);
  643. $this->assertEquals($creditCard->token, $transaction->creditCardDetails->token);
  644. }
  645. public function testCreditNoValidate_throwsIfInvalid()
  646. {
  647. $customer = Braintree\Customer::createNoValidate([
  648. 'creditCard' => [
  649. 'number' => '5105105105105100',
  650. 'expirationDate' => '05/12'
  651. ]
  652. ]);
  653. $creditCard = $customer->creditCards[0];
  654. $this->setExpectedException('Braintree\Exception\ValidationsFailed');
  655. Braintree\CreditCard::creditNoValidate($creditCard->token, [
  656. 'amount' => 'invalid'
  657. ]);
  658. }
  659. public function testExpired()
  660. {
  661. $collection = Braintree\CreditCard::expired();
  662. $this->assertTrue($collection->maximumCount() > 1);
  663. $arr = [];
  664. foreach($collection as $creditCard) {
  665. $this->assertTrue($creditCard->isExpired());
  666. array_push($arr, $creditCard->token);
  667. }
  668. $uniqueCreditCardTokens = array_unique(array_values($arr));
  669. $this->assertEquals($collection->maximumCount(), count($uniqueCreditCardTokens));
  670. }
  671. public function testExpiringBetween()
  672. {
  673. $collection = Braintree\CreditCard::expiringBetween(
  674. mktime(0, 0, 0, 1, 1, 2010),
  675. mktime(23, 59, 59, 12, 31, 2010)
  676. );
  677. $this->assertTrue($collection->maximumCount() > 1);
  678. $arr = [];
  679. foreach($collection as $creditCard) {
  680. $this->assertEquals('2010', $creditCard->expirationYear);
  681. array_push($arr, $creditCard->token);
  682. }
  683. $uniqueCreditCardTokens = array_unique(array_values($arr));
  684. $this->assertEquals($collection->maximumCount(), count($uniqueCreditCardTokens));
  685. }
  686. public function testExpiringBetween_parsesCreditCardDetailsUnderTransactionsCorrectly()
  687. {
  688. $collection = Braintree\CreditCard::expiringBetween(
  689. mktime(0, 0, 0, 1, 1, 2010),
  690. mktime(23, 59, 59, 12, 31, 2010)
  691. );
  692. $this->assertTrue($collection->maximumCount() > 1);
  693. foreach($collection as $creditCard) {
  694. foreach($creditCard->subscriptions as $subscription) {
  695. foreach($subscription->transactions as $transaction) {
  696. $this->assertNotNull($transaction->creditCardDetails->expirationMonth);
  697. }
  698. }
  699. }
  700. }
  701. public function testFind()
  702. {
  703. $customer = Braintree\Customer::createNoValidate();
  704. $result = Braintree\CreditCard::create([
  705. 'customerId' => $customer->id,
  706. 'cardholderName' => 'Cardholder',
  707. 'number' => '5105105105105100',
  708. 'expirationDate' => '05/12'
  709. ]);
  710. $this->assertTrue($result->success);
  711. $creditCard = Braintree\CreditCard::find($result->creditCard->token);
  712. $this->assertEquals($customer->id, $creditCard->customerId);
  713. $this->assertEquals('510510', $creditCard->bin);
  714. $this->assertEquals('5100', $creditCard->last4);
  715. $this->assertEquals('Cardholder', $creditCard->cardholderName);
  716. $this->assertEquals('05/2012', $creditCard->expirationDate);
  717. $this->assertEquals([], $creditCard->subscriptions);
  718. }
  719. public function testFindReturnsAssociatedSubscriptions()
  720. {
  721. $customer = Braintree\Customer::createNoValidate();
  722. $result = Braintree\CreditCard::create([
  723. 'customerId' => $customer->id,
  724. 'cardholderName' => 'Cardholder',
  725. 'number' => '5105105105105100',
  726. 'expirationDate' => '05/12',
  727. 'billingAddress' => [
  728. 'firstName' => 'Drew',
  729. 'lastName' => 'Smith',
  730. 'company' => 'Smith Co.',
  731. 'streetAddress' => '1 E Main St',
  732. 'extendedAddress' => 'Suite 101',
  733. 'locality' => 'Chicago',
  734. 'region' => 'IL',
  735. 'postalCode' => '60622',
  736. 'countryName' => 'United States of America'
  737. ]
  738. ]);
  739. $id = strval(rand());
  740. Braintree\Subscription::create([
  741. 'id' => $id,
  742. 'paymentMethodToken' => $result->creditCard->token,
  743. 'planId' => 'integration_trialless_plan',
  744. 'price' => '1.00'
  745. ]);
  746. $creditCard = Braintree\CreditCard::find($result->creditCard->token);
  747. $this->assertEquals($id, $creditCard->subscriptions[0]->id);
  748. $this->assertEquals('integration_trialless_plan', $creditCard->subscriptions[0]->planId);
  749. $this->assertEquals('1.00', $creditCard->subscriptions[0]->price);
  750. }
  751. public function testFind_throwsIfCannotBeFound()
  752. {
  753. $this->setExpectedException('Braintree\Exception\NotFound');
  754. Braintree\CreditCard::find('invalid-token');
  755. }
  756. public function testFind_throwsUsefulErrorMessagesWhenEmpty()
  757. {
  758. $this->setExpectedException('InvalidArgumentException', 'expected credit card id to be set');
  759. Braintree\CreditCard::find('');
  760. }
  761. public function testFind_throwsUsefulErrorMessagesWhenInvalid()
  762. {
  763. $this->setExpectedException('InvalidArgumentException', '@ is an invalid credit card token');
  764. Braintree\CreditCard::find('@');
  765. }
  766. public function testFromNonce()
  767. {
  768. $customer = Braintree\Customer::createNoValidate();
  769. $http = new HttpClientApi(Braintree\Configuration::$global);
  770. $nonce = $http->nonce_for_new_card([
  771. "credit_card" => [
  772. "number" => "4009348888881881",
  773. "expirationMonth" => "11",
  774. "expirationYear" => "2099"
  775. ],
  776. "customerId" => $customer->id
  777. ]);
  778. $creditCard = Braintree\CreditCard::fromNonce($nonce);
  779. $customer = Braintree\Customer::find($customer->id);
  780. $this->assertEquals($customer->creditCards[0], $creditCard);
  781. }
  782. public function testFromNonce_ReturnsErrorWhenNoncePointsToSharedCard()
  783. {
  784. $http = new HttpClientApi(Braintree\Configuration::$global);
  785. $nonce = $http->nonce_for_new_card([
  786. "credit_card" => [
  787. "number" => "4009348888881881",
  788. "expirationMonth" => "11",
  789. "expirationYear" => "2099"
  790. ],
  791. "share" => true
  792. ]);
  793. $this->setExpectedException('Braintree\Exception\NotFound', "not found");
  794. Braintree\CreditCard::fromNonce($nonce);
  795. }
  796. public function testFromNonce_ReturnsErrorWhenNonceIsConsumed()
  797. {
  798. $customer = Braintree\Customer::createNoValidate();
  799. $http = new HttpClientApi(Braintree\Configuration::$global);
  800. $nonce = $http->nonce_for_new_card([
  801. "credit_card" => [
  802. "number" => "4009348888881881",
  803. "expirationMonth" => "11",
  804. "expirationYear" => "2099"
  805. ],
  806. "customerId" => $customer->id
  807. ]);
  808. Braintree\CreditCard::fromNonce($nonce);
  809. $this->setExpectedException('Braintree\Exception\NotFound', "consumed");
  810. Braintree\CreditCard::fromNonce($nonce);
  811. }
  812. public function testUpdate()
  813. {
  814. $customer = Braintree\Customer::createNoValidate();
  815. $createResult = Braintree\CreditCard::create([
  816. 'customerId' => $customer->id,
  817. 'cardholderName' => 'Old Cardholder',
  818. 'number' => '5105105105105100',
  819. 'expirationDate' => '05/12'
  820. ]);
  821. $this->assertTrue($createResult->success);
  822. $updateResult = Braintree\CreditCard::update($createResult->creditCard->token, [
  823. 'cardholderName' => 'New Cardholder',
  824. 'number' => '4111111111111111',
  825. 'expirationDate' => '07/14'
  826. ]);
  827. $this->assertEquals($customer->id, $updateResult->creditCard->customerId);
  828. $this->assertEquals('411111', $updateResult->creditCard->bin);
  829. $this->assertEquals('1111', $updateResult->creditCard->last4);
  830. $this->assertEquals('New Cardholder', $updateResult->creditCard->cardholderName);
  831. $this->assertEquals('07/2014', $updateResult->creditCard->expirationDate);
  832. }
  833. public function testUpdate_withCardVerification()
  834. {
  835. $customer = Braintree\Customer::createNoValidate();
  836. $initialCreditCard = Braintree\CreditCard::create([
  837. 'customerId' => $customer->id,
  838. 'number' => '5105105105105100',
  839. 'expirationDate' => '05/12'
  840. ])->creditCard;
  841. $result = Braintree\CreditCard::update($initialCreditCard->token, [
  842. 'billingAddress' => [
  843. 'region' => 'IL'
  844. ],
  845. 'options' => ['verifyCard' => true]
  846. ]);
  847. $this->assertFalse($result->success);
  848. $this->assertEquals(Braintree\Result\CreditCardVerification::PROCESSOR_DECLINED, $result->creditCardVerification->status);
  849. $this->assertEquals('2000', $result->creditCardVerification->processorResponseCode);
  850. $this->assertEquals('Do Not Honor', $result->creditCardVerification->processorResponseText);
  851. $this->assertEquals('I', $result->creditCardVerification->cvvResponseCode);
  852. $this->assertEquals(null, $result->creditCardVerification->avsErrorResponseCode);
  853. $this->assertEquals('I', $result->creditCardVerification->avsPostalCodeResponseCode);
  854. $this->assertEquals('I', $result->creditCardVerification->avsStreetAddressResponseCode);
  855. $this->assertEquals(Test\Helper::defaultMerchantAccountId(), $result->creditCardVerification->merchantAccountId);
  856. }
  857. public function testUpdate_withCardVerificationAndSpecificMerchantAccount()
  858. {
  859. $customer = Braintree\Customer::createNoValidate();
  860. $initialCreditCard = Braintree\CreditCard::create([
  861. 'customerId' => $customer->id,
  862. 'number' => '5105105105105100',
  863. 'expirationDate' => '05/12'
  864. ])->creditCard;
  865. $result = Braintree\CreditCard::update($initialCreditCard->token, [
  866. 'billingAddress' => [
  867. 'region' => 'IL'
  868. ],
  869. 'options' => [
  870. 'verificationMerchantAccountId' => Test\Helper::nonDefaultMerchantAccountId(),
  871. 'verifyCard' => true
  872. ]
  873. ]);
  874. $this->assertFalse($result->success);
  875. $this->assertEquals(Braintree\Result\CreditCardVerification::PROCESSOR_DECLINED, $result->creditCardVerification->status);
  876. $this->assertEquals(Test\Helper::nonDefaultMerchantAccountId(), $result->creditCardVerification->merchantAccountId);
  877. }
  878. public function testUpdate_createsNewBillingAddressByDefault()
  879. {
  880. $customer = Braintree\Customer::createNoValidate();
  881. $initialCreditCard = Braintree\CreditCard::create([
  882. 'customerId' => $customer->id,
  883. 'number' => '5105105105105100',
  884. 'expirationDate' => '05/12',
  885. 'billingAddress' => [
  886. 'streetAddress' => '123 Nigeria Ave'
  887. ]
  888. ])->creditCard;
  889. $updatedCreditCard = Braintree\CreditCard::update($initialCreditCard->token, [
  890. 'billingAddress' => [
  891. 'region' => 'IL'
  892. ]
  893. ])->creditCard;
  894. $this->assertEquals('IL', $updatedCreditCard->billingAddress->region);
  895. $this->assertNull($updatedCreditCard->billingAddress->streetAddress);
  896. $this->assertNotEquals($initialCreditCard->billingAddress->id, $updatedCreditCard->billingAddress->id);
  897. }
  898. public function testUpdate_updatesExistingBillingAddressIfUpdateExistingOptionIsTrue()
  899. {
  900. $customer = Braintree\Customer::createNoValidate();
  901. $initialCreditCard = Braintree\CreditCard::create([
  902. 'customerId' => $customer->id,
  903. 'number' => '5105105105105100',
  904. 'expirationDate' => '05/12',
  905. 'billingAddress' => [
  906. 'countryName' => 'Turkey',
  907. 'countryCodeAlpha2' => 'TR',
  908. 'countryCodeAlpha3' => 'TUR',
  909. 'countryCodeNumeric' => '792',
  910. ]
  911. ])->creditCard;
  912. $updatedCreditCard = Braintree\CreditCard::update($initialCreditCard->token, [
  913. 'billingAddress' => [
  914. 'countryName' => 'Thailand',
  915. 'countryCodeAlpha2' => 'TH',
  916. 'countryCodeAlpha3' => 'THA',
  917. 'countryCodeNumeric' => '764',
  918. 'options' => [
  919. 'updateExisting' => True
  920. ]
  921. ]
  922. ])->creditCard;
  923. $this->assertEquals('Thailand', $updatedCreditCard->billingAddress->countryName);
  924. $this->assertEquals('TH', $updatedCreditCard->billingAddress->countryCodeAlpha2);
  925. $this->assertEquals('THA', $updatedCreditCard->billingAddress->countryCodeAlpha3);
  926. $this->assertEquals('764', $updatedCreditCard->billingAddress->countryCodeNumeric);
  927. $this->assertEquals($initialCreditCard->billingAddress->id, $updatedCreditCard->billingAddress->id);
  928. }
  929. public function testUpdate_canChangeToken()
  930. {
  931. $oldToken = strval(rand());
  932. $newToken = strval(rand());
  933. $customer = Braintree\Customer::createNoValidate();
  934. $createResult = Braintree\CreditCard::create([
  935. 'customerId' => $customer->id,
  936. 'token' => $oldToken,
  937. 'number' => '5105105105105100',
  938. 'expirationDate' => '05/12'
  939. ]);
  940. $this->assertTrue($createResult->success);
  941. $updateResult = Braintree\CreditCard::update($oldToken, [
  942. 'token' => $newToken
  943. ]);
  944. $this->assertEquals($customer->id, $updateResult->creditCard->customerId);
  945. $this->assertEquals($newToken, $updateResult->creditCard->token);
  946. $this->assertEquals($newToken, Braintree\CreditCard::find($newToken)->token);
  947. }
  948. public function testUpdateNoValidate()
  949. {
  950. $customer = Braintree\Customer::createNoValidate();
  951. $creditCard = Braintree\CreditCard::createNoValidate([
  952. 'customerId' => $customer->id,
  953. 'cardholderName' => 'Old Cardholder',
  954. 'number' => '5105105105105100',
  955. 'expirationDate' => '05/12'
  956. ]);
  957. $updatedCard = Braintree\CreditCard::updateNoValidate($creditCard->token, [
  958. 'cardholderName' => 'New Cardholder',
  959. 'number' => '4111111111111111',
  960. 'expirationDate' => '07/14'
  961. ]);
  962. $this->assertEquals($customer->id, $updatedCard->customerId);
  963. $this->assertEquals('411111', $updatedCard->bin);
  964. $this->assertEquals('1111', $updatedCard->last4);
  965. $this->assertEquals('New Cardholder', $updatedCard->cardholderName);
  966. $this->assertEquals('07/2014', $updatedCard->expirationDate);
  967. }
  968. public function testUpdateNoValidate_throwsIfInvalid()
  969. {
  970. $customer = Braintree\Customer::createNoValidate();
  971. $creditCard = Braintree\CreditCard::createNoValidate([
  972. 'customerId' => $customer->id,
  973. 'cardholderName' => 'Old Cardholder',
  974. 'number' => '5105105105105100',
  975. 'expirationDate' => '05/12'
  976. ]);
  977. $this->setExpectedException('Braintree\Exception\ValidationsFailed');
  978. Braintree\CreditCard::updateNoValidate($creditCard->token, [
  979. 'number' => 'invalid',
  980. ]);
  981. }
  982. public function testUpdate_withDefault()
  983. {
  984. $customer = Braintree\Customer::createNoValidate();
  985. $card1 = Braintree\CreditCard::create([
  986. 'customerId' => $customer->id,
  987. 'cardholderName' => 'Cardholder',
  988. 'number' => '5105105105105100',
  989. 'expirationDate' => '05/12'
  990. ])->creditCard;
  991. $card2 = Braintree\CreditCard::create([
  992. 'customerId' => $customer->id,
  993. 'cardholderName' => 'Cardholder',
  994. 'number' => '5105105105105100',
  995. 'expirationDate' => '05/12'
  996. ])->creditCard;
  997. $this->assertTrue($card1->isDefault());
  998. $this->assertFalse($card2->isDefault());
  999. Braintree\CreditCard::update($card2->token, [
  1000. 'options' => ['makeDefault' => true]
  1001. ])->creditCard;
  1002. $this->assertFalse(Braintree\CreditCard::find($card1->token)->isDefault());
  1003. $this->assertTrue(Braintree\CreditCard::find($card2->token)->isDefault());
  1004. }
  1005. public function testDelete_deletesThePaymentMethod()
  1006. {
  1007. $customer = Braintree\Customer::createNoValidate([]);
  1008. $creditCard = Braintree\CreditCard::createNoValidate([
  1009. 'customerId' => $customer->id,
  1010. 'number' => '5105105105105100',
  1011. 'expirationDate' => '05/12'
  1012. ]);
  1013. Braintree\CreditCard::find($creditCard->token);
  1014. Braintree\CreditCard::delete($creditCard->token);
  1015. $this->setExpectedException('Braintree\Exception\NotFound');
  1016. Braintree\CreditCard::find($creditCard->token);
  1017. }
  1018. public function testGatewayRejectionOnCVV()
  1019. {
  1020. $old_merchant_id = Braintree\Configuration::merchantId();
  1021. $old_public_key = Braintree\Configuration::publicKey();
  1022. $old_private_key = Braintree\Configuration::privateKey();
  1023. Braintree\Configuration::merchantId('processing_rules_merchant_id');
  1024. Braintree\Configuration::publicKey('processing_rules_public_key');
  1025. Braintree\Configuration::privateKey('processing_rules_private_key');
  1026. $customer = Braintree\Customer::createNoValidate();
  1027. $result = Braintree\CreditCard::create([
  1028. 'customerId' => $customer->id,
  1029. 'number' => '4111111111111111',
  1030. 'expirationDate' => '05/2011',
  1031. 'cvv' => '200',
  1032. 'options' => ['verifyCard' => true]
  1033. ]);
  1034. Braintree\Configuration::merchantId($old_merchant_id);
  1035. Braintree\Configuration::publicKey($old_public_key);
  1036. Braintree\Configuration::privateKey($old_private_key);
  1037. $this->assertFalse($result->success);
  1038. $this->assertEquals(Braintree\Transaction::CVV, $result->creditCardVerification->gatewayRejectionReason);
  1039. }
  1040. public function testGatewayRejectionIsNullOnProcessorDecline()
  1041. {
  1042. $old_merchant_id = Braintree\Configuration::merchantId();
  1043. $old_public_key = Braintree\Configuration::publicKey();
  1044. $old_private_key = Braintree\Configuration::privateKey();
  1045. Braintree\Configuration::merchantId('processing_rules_merchant_id');
  1046. Braintree\Configuration::publicKey('processing_rules_public_key');
  1047. Braintree\Configuration::privateKey('processing_rules_private_key');
  1048. $customer = Braintree\Customer::createNoValidate();
  1049. $result = Braintree\CreditCard::create([
  1050. 'customerId' => $customer->id,
  1051. 'number' => '5105105105105100',
  1052. 'expirationDate' => '05/2011',
  1053. 'cvv' => '200',
  1054. 'options' => ['verifyCard' => true]
  1055. ]);
  1056. Braintree\Configuration::merchantId($old_merchant_id);
  1057. Braintree\Configuration::publicKey($old_public_key);
  1058. Braintree\Configuration::privateKey($old_private_key);
  1059. $this->assertFalse($result->success);
  1060. $this->assertNull($result->creditCardVerification->gatewayRejectionReason);
  1061. }
  1062. public function createCreditCardViaTr($regularParams, $trParams)
  1063. {
  1064. $trData = Braintree\TransparentRedirect::createCreditCardData(
  1065. array_merge($trParams, ["redirectUrl" => "http://www.example.com"])
  1066. );
  1067. return Test\Helper::submitTrRequest(
  1068. Braintree\CreditCard::createCreditCardUrl(),
  1069. $regularParams,
  1070. $trData
  1071. );
  1072. }
  1073. public function updateCreditCardViaTr($regularParams, $trParams)
  1074. {
  1075. $trData = Braintree\TransparentRedirect::updateCreditCardData(
  1076. array_merge($trParams, ["redirectUrl" => "http://www.example.com"])
  1077. );
  1078. return Test\Helper::submitTrRequest(
  1079. Braintree\CreditCard::updateCreditCardUrl(),
  1080. $regularParams,
  1081. $trData
  1082. );
  1083. }
  1084. public function testPrepaidCard()
  1085. {
  1086. $customer = Braintree\Customer::createNoValidate();
  1087. $result = Braintree\CreditCard::create([
  1088. 'customerId' => $customer->id,
  1089. 'cardholderName' => 'Cardholder',
  1090. 'number' => CardTypeIndicators::PREPAID,
  1091. 'expirationDate' => '05/12',
  1092. 'options' => ['verifyCard' => true]
  1093. ]);
  1094. $this->assertEquals(Braintree\CreditCard::PREPAID_YES, $result->creditCard->prepaid);
  1095. }
  1096. public function testCommercialCard()
  1097. {
  1098. $customer = Braintree\Customer::createNoValidate();
  1099. $result = Braintree\CreditCard::create([
  1100. 'customerId' => $customer->id,
  1101. 'cardholderName' => 'Cardholder',
  1102. 'number' => CardTypeIndicators::COMMERCIAL,
  1103. 'expirationDate' => '05/12',
  1104. 'options' => ['verifyCard' => true]
  1105. ]);
  1106. $this->assertEquals(Braintree\CreditCard::COMMERCIAL_YES, $result->creditCard->commercial);
  1107. }
  1108. public function testDebitCard()
  1109. {
  1110. $customer = Braintree\Customer::createNoValidate();
  1111. $result = Braintree\CreditCard::create([
  1112. 'customerId' => $customer->id,
  1113. 'cardholderName' => 'Cardholder',
  1114. 'number' => CardTypeIndicators::DEBIT,
  1115. 'expirationDate' => '05/12',
  1116. 'options' => ['verifyCard' => true]
  1117. ]);
  1118. $this->assertEquals(Braintree\CreditCard::DEBIT_YES, $result->creditCard->debit);
  1119. }
  1120. public function testPayrollCard()
  1121. {
  1122. $customer = Braintree\Customer::createNoValidate();
  1123. $result = Braintree\CreditCard::create([
  1124. 'customerId' => $customer->id,
  1125. 'cardholderName' => 'Cardholder',
  1126. 'number' => CardTypeIndicators::PAYROLL,
  1127. 'expirationDate' => '05/12',
  1128. 'options' => ['verifyCard' => true]
  1129. ]);
  1130. $this->assertEquals(Braintree\CreditCard::PAYROLL_YES, $result->creditCard->payroll);
  1131. $this->assertEquals('MSA', $result->creditCard->productId);
  1132. }
  1133. public function testHealthCareCard()
  1134. {
  1135. $customer = Braintree\Customer::createNoValidate();
  1136. $result = Braintree\CreditCard::create([
  1137. 'customerId' => $customer->id,
  1138. 'cardholderName' => 'Cardholder',
  1139. 'number' => CardTypeIndicators::HEALTHCARE,
  1140. 'expirationDate' => '05/12',
  1141. 'options' => ['verifyCard' => true]
  1142. ]);
  1143. $this->assertEquals(Braintree\CreditCard::HEALTHCARE_YES, $result->creditCard->healthcare);
  1144. $this->assertEquals('J3', $result->creditCard->productId);
  1145. }
  1146. public function testDurbinRegulatedCard()
  1147. {
  1148. $customer = Braintree\Customer::createNoValidate();
  1149. $result = Braintree\CreditCard::create([
  1150. 'customerId' => $customer->id,
  1151. 'cardholderName' => 'Cardholder',
  1152. 'number' => CardTypeIndicators::DURBIN_REGULATED,
  1153. 'expirationDate' => '05/12',
  1154. 'options' => ['verifyCard' => true]
  1155. ]);
  1156. $this->assertEquals(Braintree\CreditCard::DURBIN_REGULATED_YES, $result->creditCard->durbinRegulated);
  1157. }
  1158. public function testCountryOfIssuanceCard()
  1159. {
  1160. $customer = Braintree\Customer::createNoValidate();
  1161. $result = Braintree\CreditCard::create([
  1162. 'customerId' => $customer->id,
  1163. 'cardholderName' => 'Cardholder',
  1164. 'number' => CardTypeIndicators::COUNTRY_OF_ISSUANCE,
  1165. 'expirationDate' => '05/12',
  1166. 'options' => ['verifyCard' => true]
  1167. ]);
  1168. $this->assertEquals("USA", $result->creditCard->countryOfIssuance);
  1169. }
  1170. public function testIssuingBankCard()
  1171. {
  1172. $customer = Braintree\Customer::createNoValidate();
  1173. $result = Braintree\CreditCard::create([
  1174. 'customerId' => $customer->id,
  1175. 'cardholderName' => 'Cardholder',
  1176. 'number' => CardTypeIndicators::ISSUING_BANK,
  1177. 'expirationDate' => '05/12',
  1178. 'options' => ['verifyCard' => true]
  1179. ]);
  1180. $this->assertEquals("NETWORK ONLY", $result->creditCard->issuingBank);
  1181. }
  1182. public function testNegativeCardTypeIndicators()
  1183. {
  1184. $customer = Braintree\Customer::createNoValidate();
  1185. $result = Braintree\CreditCard::create([
  1186. 'customerId' => $customer->id,
  1187. 'cardholderName' => 'Cardholder',
  1188. 'number' => CardTypeIndicators::NO,
  1189. 'expirationDate' => '05/12',
  1190. 'options' => ['verifyCard' => true]
  1191. ]);
  1192. $this->assertEquals(Braintree\CreditCard::PREPAID_NO, $result->creditCard->prepaid);
  1193. $this->assertEquals(Braintree\CreditCard::DURBIN_REGULATED_NO, $result->creditCard->durbinRegulated);
  1194. $this->assertEquals(Braintree\CreditCard::PAYROLL_NO, $result->creditCard->payroll);
  1195. $this->assertEquals(Braintree\CreditCard::DEBIT_NO, $result->creditCard->debit);
  1196. $this->assertEquals(Braintree\CreditCard::HEALTHCARE_NO, $result->creditCard->healthcare);
  1197. $this->assertEquals(Braintree\CreditCard::COMMERCIAL_NO, $result->creditCard->commercial);
  1198. $this->assertEquals('MSB', $result->creditCard->productId);
  1199. }
  1200. public function testUnknownCardTypeIndicators()
  1201. {
  1202. $customer = Braintree\Customer::createNoValidate();
  1203. $result = Braintree\CreditCard::create([
  1204. 'customerId' => $customer->id,
  1205. 'cardholderName' => 'Cardholder',
  1206. 'number' => CardTypeIndicators::UNKNOWN,
  1207. 'expirationDate' => '05/12',
  1208. 'options' => ['verifyCard' => true]
  1209. ]);
  1210. $this->assertEquals(Braintree\CreditCard::PREPAID_UNKNOWN, $result->creditCard->prepaid);
  1211. $this->assertEquals(Braintree\CreditCard::DURBIN_REGULATED_UNKNOWN, $result->creditCard->durbinRegulated);
  1212. $this->assertEquals(Braintree\CreditCard::PAYROLL_UNKNOWN, $result->creditCard->payroll);
  1213. $this->assertEquals(Braintree\CreditCard::DEBIT_UNKNOWN, $result->creditCard->debit);
  1214. $this->assertEquals(Braintree\CreditCard::HEALTHCARE_UNKNOWN, $result->creditCard->healthcare);
  1215. $this->assertEquals(Braintree\CreditCard::COMMERCIAL_UNKNOWN, $result->creditCard->commercial);
  1216. $this->assertEquals(Braintree\CreditCard::COUNTRY_OF_ISSUANCE_UNKNOWN, $result->creditCard->countryOfIssuance);
  1217. $this->assertEquals(Braintree\CreditCard::ISSUING_BANK_UNKNOWN, $result->creditCard->issuingBank);
  1218. $this->assertEquals(Braintree\CreditCard::PRODUCT_ID_UNKNOWN, $result->creditCard->productId);
  1219. }
  1220. }