/** Tests failed and successful payment for ACH */ @Test public void testAchFakePayments() { UserWS user = buildUser(PRANCING_PONY_ACCOUNT_TYPE); // remove payment instruments and add only ACH payment instrument user.getPaymentInstruments().clear(); user.getPaymentInstruments() .add( PaymentMethodHelper.createACH( ACH_PAYMENT_TYPE, "Frodo Baggins", "Shire Financial Bank", "123456789", "123456789", PRANCING_PONY_ACCOUNT_TYPE)); System.out.println("Creating user with ACH record and no CC..."); user.setId(api.createUser(user)); // get ach PaymentInformationWS ach = user.getPaymentInstruments().get(0); System.out.println("Testing ACH payment with even amount (should pass)"); PaymentWS payment = new PaymentWS(); payment.setAmount(new BigDecimal("15.00")); payment.setIsRefund(new Integer(0)); payment.setMethodId(Constants.PAYMENT_METHOD_ACH); payment.setPaymentDate(Calendar.getInstance().getTime()); payment.setResultId(Constants.RESULT_ENTERED); payment.setCurrencyId(CURRENCY_USD); payment.setUserId(user.getId()); payment.setPaymentNotes("Notes"); payment.setPaymentPeriod(PAYMENT_PERIOD); payment.getPaymentInstruments().add(ach); PaymentAuthorizationDTOEx resultOne = api.processPayment(payment, null); assertEquals( "ACH payment with even amount should pass", Constants.RESULT_OK, api.getPayment(resultOne.getPaymentId()).getResultId()); System.out.println("Testing ACH payment with odd amount (should fail)"); payment = new PaymentWS(); payment.setAmount(new BigDecimal("15.01")); payment.setIsRefund(new Integer(0)); payment.setMethodId(Constants.PAYMENT_METHOD_ACH); payment.setPaymentDate(Calendar.getInstance().getTime()); payment.setResultId(Constants.RESULT_ENTERED); payment.setCurrencyId(CURRENCY_USD); payment.setUserId(user.getId()); payment.setPaymentNotes("Notes"); payment.setPaymentPeriod(PAYMENT_PERIOD); payment.getPaymentInstruments().add(ach); PaymentAuthorizationDTOEx resultTwo = api.processPayment(payment, null); assertEquals( "ACH payment with odd amount should fail", Constants.RESULT_FAIL, api.getPayment(resultTwo.getPaymentId()).getResultId()); // cleanup api.deletePayment(resultTwo.getPaymentId()); api.deletePayment(resultOne.getPaymentId()); api.deleteUser(user.getId()); }
/** Tests processPayment API call. */ @Test public void testProcessPayment() { // setup UserWS user = buildUser(PRANCING_PONY_ACCOUNT_TYPE, "4111111111111111"); user.setId(api.createUser(user)); ItemTypeWS itemType = buildItemType(); itemType.setId(api.createItemCategory(itemType)); ItemDTOEx item = buildItem(itemType.getId(), api.getCallerCompanyId()); item.setId(api.createItem(item)); // first, create two unpaid invoices OrderWS order = buildOrder(user.getId(), Arrays.asList(item.getId()), new BigDecimal("10.00")); Integer invoiceId1 = api.createOrderAndInvoice( order, OrderChangeBL.buildFromOrder(order, ORDER_CHANGE_STATUS_APPLY)); Integer invoiceId2 = api.createOrderAndInvoice( order, OrderChangeBL.buildFromOrder(order, ORDER_CHANGE_STATUS_APPLY)); // create the payment PaymentWS payment = new PaymentWS(); payment.setAmount(new BigDecimal("5.00")); payment.setIsRefund(new Integer(0)); payment.setMethodId(Constants.PAYMENT_METHOD_VISA); payment.setPaymentDate(Calendar.getInstance().getTime()); payment.setCurrencyId(CURRENCY_USD); payment.setUserId(user.getId()); // try a credit card number that fails // note that creating a payment with a NEW credit card will save it and associate // it with the user who made the payment. Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, 5); PaymentInformationWS cc = PaymentMethodHelper.createCreditCard( CC_PAYMENT_TYPE, "Frodo Baggins", "4111111111111111", cal.getTime()); cc.setPaymentMethodId(Constants.PAYMENT_METHOD_VISA); payment.getPaymentInstruments().add(cc); System.out.println("processing payment."); PaymentAuthorizationDTOEx authInfo = api.processPayment(payment, null); // check payment failed assertNotNull("Payment result not null", authInfo); assertFalse( "Payment Authorization result should be FAILED", authInfo.getResult().booleanValue()); // check payment has zero balance PaymentWS lastPayment = api.getLatestPayment(user.getId()); assertNotNull("payment can not be null", lastPayment); assertNotNull("auth in payment can not be null", lastPayment.getAuthorizationId()); assertEquals("correct payment amount", new BigDecimal("5"), lastPayment.getAmountAsDecimal()); assertEquals("correct payment balance", BigDecimal.ZERO, lastPayment.getBalanceAsDecimal()); // check invoices still have balance InvoiceWS invoice1 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", new BigDecimal("10.0"), invoice1.getBalanceAsDecimal()); InvoiceWS invoice2 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", new BigDecimal("10.0"), invoice2.getBalanceAsDecimal()); // do it again, but using the credit card on file // which is also 4111111111111111 payment.getPaymentInstruments().clear(); System.out.println("processing payment."); authInfo = api.processPayment(payment, null); // check payment has zero balance PaymentWS lastPayment2 = api.getLatestPayment(user.getId()); assertNotNull("payment can not be null", lastPayment2); assertNotNull("auth in payment can not be null", lastPayment2.getAuthorizationId()); assertEquals("correct payment amount", new BigDecimal("5"), lastPayment2.getAmountAsDecimal()); assertEquals("correct payment balance", BigDecimal.ZERO, lastPayment2.getBalanceAsDecimal()); assertFalse("Payment is not the same as preiouvs", lastPayment2.getId() == lastPayment.getId()); // check invoices still have balance invoice1 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", new BigDecimal("10"), invoice1.getBalanceAsDecimal()); invoice2 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", new BigDecimal("10"), invoice2.getBalanceAsDecimal()); // do a successful payment of $5 cc = PaymentMethodHelper.createCreditCard( CC_PAYMENT_TYPE, "Frodo Baggins", "4111111111111152", cal.getTime()); cc.setPaymentMethodId(Constants.PAYMENT_METHOD_VISA); payment.getPaymentInstruments().add(cc); System.out.println("processing payment."); authInfo = api.processPayment(payment, null); // check payment successful assertNotNull("Payment result not null", authInfo); assertNotNull("Auth id not null", authInfo.getId()); assertTrue("Payment Authorization result should be OK", authInfo.getResult().booleanValue()); // check payment was made lastPayment = api.getLatestPayment(user.getId()); assertNotNull("payment can not be null", lastPayment); assertNotNull("auth in payment can not be null", lastPayment.getAuthorizationId()); assertEquals("payment ids match", lastPayment.getId(), authInfo.getPaymentId().intValue()); assertEquals("correct payment amount", new BigDecimal("5"), lastPayment.getAmountAsDecimal()); assertEquals("correct payment balance", BigDecimal.ZERO, lastPayment.getBalanceAsDecimal()); // check invoice 1 was partially paid (balance 5) invoice1 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", new BigDecimal("5.0"), invoice1.getBalanceAsDecimal()); // check invoice 2 wan't paid at all invoice2 = api.getInvoiceWS(invoiceId2); assertEquals("correct invoice balance", new BigDecimal("10.0"), invoice2.getBalanceAsDecimal()); // another payment for $10, this time with the user's credit card // update the credit card to the one that is good user = api.getUserWS(user.getId()); com.sapienter.jbilling.server.user.WSTest.updateMetaField( user.getPaymentInstruments().iterator().next().getMetaFields(), PaymentMethodHelper.CC_MF_NUMBER, "4111111111111152"); api.updateUser(user); // process a payment without an attached credit card // should try and use the user's saved credit card payment.getPaymentInstruments().clear(); payment.setAmount(new BigDecimal("10.00")); System.out.println("processing payment."); authInfo = api.processPayment(payment, null); // check payment successful assertNotNull("Payment result not null", authInfo); assertTrue("Payment Authorization result should be OK", authInfo.getResult().booleanValue()); // check payment was made lastPayment = api.getLatestPayment(user.getId()); assertNotNull("payment can not be null", lastPayment); assertNotNull("auth in payment can not be null", lastPayment.getAuthorizationId()); assertEquals("correct payment amount", new BigDecimal("10"), lastPayment.getAmountAsDecimal()); assertEquals("correct payment balance", BigDecimal.ZERO, lastPayment.getBalanceAsDecimal()); // check invoice 1 is fully paid (balance 0) invoice1 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", BigDecimal.ZERO, invoice1.getBalanceAsDecimal()); // check invoice 2 was partially paid (balance 5) invoice2 = api.getInvoiceWS(invoiceId2); assertEquals("correct invoice balance", new BigDecimal("5"), invoice2.getBalanceAsDecimal()); // another payment for $10 payment.getPaymentInstruments().add(cc); payment.setAmount(new BigDecimal("10.00")); System.out.println("processing payment."); authInfo = api.processPayment(payment, null); // check payment successful assertNotNull("Payment result not null", authInfo); assertTrue("Payment Authorization result should be OK", authInfo.getResult().booleanValue()); // check payment was made lastPayment = api.getLatestPayment(user.getId()); assertNotNull("payment can not be null", lastPayment); assertNotNull("auth in payment can not be null", lastPayment.getAuthorizationId()); assertEquals("correct payment amount", new BigDecimal("10"), lastPayment.getAmountAsDecimal()); assertEquals( "correct payment balance", new BigDecimal("5"), lastPayment.getBalanceAsDecimal()); // check invoice 1 balance is unchanged invoice1 = api.getInvoiceWS(invoiceId1); assertEquals("correct invoice balance", BigDecimal.ZERO, invoice1.getBalanceAsDecimal()); // check invoice 2 is fully paid (balance 0) invoice2 = api.getInvoiceWS(invoiceId2); assertEquals("correct invoice balance", BigDecimal.ZERO, invoice2.getBalanceAsDecimal()); // cleanup System.out.println("Deleting invoices and orders."); api.deleteInvoice(invoice1.getId()); api.deleteInvoice(invoice2.getId()); api.deleteOrder(invoice1.getOrders()[0]); api.deleteOrder(invoice2.getOrders()[0]); api.deleteItem(item.getId()); api.deleteItemCategory(itemType.getId()); api.deleteUser(user.getId()); }