def handle_payment(self, order_number, total, **kwargs): # Make request to DataCash - if there any problems (eg bankcard # not valid / request refused by bank) then an exception would be # raised and handled) facade = Facade() # Use The3rdMan - so build a dict of data to pass # email = None # if not self.request.user.is_authenticated(): # email = self.checkout_session.get_guest_email() # fraud_data = the3rdman.build_data_dict( # request=self.request, # email=email, # order_number=order_number, # shipping_address=kwargs['shipping_address']) # We're not using 3rd-man by default bankcard = kwargs['bankcard_form'].bankcard datacash_ref = facade.pre_authorise(order_number, total.incl_tax, bankcard) # Request was successful - record the "payment source". As this # request was a 'pre-auth', we set the 'amount_allocated' - if we had # performed an 'auth' request, then we would set 'amount_debited'. source_type, _ = SourceType.objects.get_or_create(name='Datacash') source = Source(source_type=source_type, currency=settings.DATACASH_CURRENCY, amount_allocated=total.incl_tax, reference=datacash_ref) self.add_payment_source(source) # Also record payment event self.add_payment_event('pre-auth', total.incl_tax)
def handle_payment(self, order_number, total, **kwargs): # Make request to DataCash - if there any problems (eg bankcard # not valid / request refused by bank) then an exception would be # raised and handled) facade = Facade() # Use The3rdMan - so build a dict of data to pass # email = None # if not self.request.user.is_authenticated(): # email = self.checkout_session.get_guest_email() # fraud_data = the3rdman.build_data_dict( # request=self.request, # email=email, # order_number=order_number, # shipping_address=kwargs['shipping_address']) # We're not using 3rd-man by default bankcard = kwargs['bankcard_form'].bankcard datacash_ref = facade.pre_authorise( order_number, total.incl_tax, bankcard) # Request was successful - record the "payment source". As this # request was a 'pre-auth', we set the 'amount_allocated' - if we had # performed an 'auth' request, then we would set 'amount_debited'. source_type, _ = SourceType.objects.get_or_create(name='Datacash') source = Source(source_type=source_type, currency=settings.DATACASH_CURRENCY, amount_allocated=total.incl_tax, reference=datacash_ref) self.add_payment_source(source) # Also record payment event self.add_payment_event('pre-auth', total.incl_tax)
def handle_payment(self, order_number, total_incl_tax, **kwargs): # Make request to DataCash - if there any problems (eg bankcard # not valid / request refused by bank) then an exception would be # raised ahd handled) facade = Facade() datacash_ref = facade.pre_authorise(order_number, total_incl_tax, kwargs['bankcard']) # Request was successful - record the "payment source". As this # request was a 'pre-auth', we set the 'amount_allocated' - if we had # performed an 'auth' request, then we would set 'amount_debited'. source_type, _ = SourceType.objects.get_or_create(name='Datacash') source = Source(source_type=source_type, currency=settings.DATACASH_CURRENCY, amount_allocated=total_incl_tax, reference=datacash_ref) self.add_payment_source(source) # Also record payment event self.add_payment_event('pre-auth', total_incl_tax)
def handle_payment(self, order_number, total_incl_tax, **kwargs): # Make request to DataCash - if there any problems (eg bankcard # not valid / request refused by bank) then an exception would be # raised ahd handled) facade = Facade() datacash_ref = facade.pre_authorise( order_number, total_incl_tax, kwargs['bankcard']) # Request was successful - record the "payment source". As this # request was a 'pre-auth', we set the 'amount_allocated' - if we had # performed an 'auth' request, then we would set 'amount_debited'. source_type, _ = SourceType.objects.get_or_create(name='Datacash') source = Source(source_type=source_type, currency=settings.DATACASH_CURRENCY, amount_allocated=total_incl_tax, reference=datacash_ref) self.add_payment_source(source) # Also record payment event self.add_payment_event('pre-auth', total_incl_tax)
def setUp(self): self.facade = Facade()
class FacadeTests(TestCase, XmlTestingMixin): def setUp(self): self.facade = Facade() def test_unicode_handling(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard(card_number='1000350000000007', expiry_date='10/13', cvv='345') self.facade.pre_authorise( '1234', D('10.00'), card, the3rdman_data={ 'customer_info': { 'surname': u'Smörgåsbord' } }) def test_second_fulfill_has_merchant_ref(self): # Initial pre-auth self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.pre_authorise('1234', D('100.00'), card) txn = OrderTransaction.objects.get(datacash_reference=ref) # First fulfill self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_SUCCESSFUL_FULFILL_RESPONSE) self.facade.fulfill_transaction('1234', D('50.00'), txn.datacash_reference, txn.auth_code) self.facade.fulfill_transaction('1234', D('40.00'), txn.datacash_reference, txn.auth_code) fulfill_txn = OrderTransaction.objects.get( order_number='1234', amount=D('40.00') ) self.assertTrue('merchantreference' in fulfill_txn.request_xml) def test_zero_amount_for_pre_raises_exception(self): card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.pre_authorise('1234', D('0.00'), card) def test_zero_amount_for_auth_raises_exception(self): card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.authorise('1234', D('0.00'), card) def test_auth_request_creates_txn_model(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') self.facade.authorise('100001', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100001')[0] self.assertEquals('auth', txn.method) self.assertEquals(D('123.22'), txn.amount) self.assertTrue(len(txn.request_xml) > 0) self.assertTrue(len(txn.response_xml) > 0) def test_auth_request_with_integer_cvv(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv=345) self.facade.authorise('100001', D('123.22'), card) def test_pre_request_creates_txn_model(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') self.facade.pre_authorise('100001', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100001')[0] self.assertEquals('pre', txn.method) self.assertEquals(D('123.22'), txn.amount) self.assertTrue(len(txn.request_xml) > 0) self.assertTrue(len(txn.response_xml) > 0) def test_pre_request_uses_billing_address_fields(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock card = Bankcard('1000350000000007', '10/13', cvv='345') address = MockBillingAddress(line1='1 Egg Street', line2='Farmville', line4='Greater London', postcode='N1 8RT') self.facade.pre_authorise('100001', D('123.22'), card, billing_address=address) request_xml = mock.call_args[0][0] self.assertXmlElementEquals(request_xml, '1 Egg Street', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1') self.assertXmlElementEquals(request_xml, 'Farmville', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2') self.assertXmlElementEquals(request_xml, 'N1 8RT', 'Request.Transaction.CardTxn.Card.Cv2Avs.postcode') def test_auth_request_uses_billing_address_fields(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock card = Bankcard('1000350000000007', '10/13', cvv='345') address = MockBillingAddress(line1='1 Egg Street', line2='Farmville', line4='Greater London', postcode='N1 8RT') self.facade.authorise('100001', D('123.22'), card, billing_address=address) request_xml = mock.call_args[0][0] self.assertXmlElementEquals(request_xml, '1 Egg Street', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1') self.assertXmlElementEquals(request_xml, 'Farmville', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2') self.assertXmlElementEquals(request_xml, 'N1 8RT', 'Request.Transaction.CardTxn.Card.Cv2Avs.postcode') def test_refund_request_doesnt_include_currency_attribute(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock self.facade.refund_transaction('100001', D('123.22'), txn_reference='12345') request_xml = mock.call_args[0][0] self.assertTrue('currency' not in request_xml) def test_auth_request_returns_datacash_ref(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.authorise('100001', D('123.22'), card) self.assertEquals('3000000088888888', ref) def test_auth_request_using_previous_txn_ref(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.authorise('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_request(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.refund('100005', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100005')[0] self.assertEquals('refund', txn.method) def test_pre_auth_using_history_txn(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.pre_authorise('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_using_historic_txn(self): self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.refund('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.refund('100001', D('123.22')) def test_pre_auth_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.pre_authorise('100001', D('123.22')) def test_auth_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.authorise('100001', D('123.22')) def test_successful_cancel_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>4900200000000001</datacash_reference> <merchantreference>4900200000000001</merchantreference> <mode>TEST</mode> <reason>CANCELLED OK</reason> <status>1</status> <time>1151567456</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml) ref = self.facade.cancel_transaction('100001', '3000000088888888') self.assertEquals('4900200000000001', ref) def test_successful_fulfill_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>3900200000000001</datacash_reference> <merchantreference>3900200000000001</merchantreference> <mode>LIVE</mode> <reason>FULFILLED OK</reason> <status>1</status> <time>1071567356</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml) self.facade.fulfill_transaction('100002', D('45.00'), '3000000088888888', '1234') txn = OrderTransaction.objects.filter(order_number='100002')[0] self.assertEquals('fulfill', txn.method) def test_successful_refund_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>4000000088889999</datacash_reference> <HistoricTxn> <authcode>896876</authcode> </HistoricTxn> <merchantreference>4100000088888888</merchantreference> <mode>LIVE</mode> <reason>ACCEPTED</reason> <status>1</status> <time>1071567375</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml) self.facade.refund_transaction('100003', D('45.00'), '3000000088888888') txn = OrderTransaction.objects.filter(order_number='100003')[0] self.assertEquals('txn_refund', txn.method) def test_transaction_declined_exception_raised_for_decline(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <CardTxn> <authcode>DECLINED</authcode> <card_scheme>Mastercard</card_scheme> <country>United Kingdom</country> </CardTxn> <datacash_reference>4400200045583767</datacash_reference> <merchantreference>AA004630</merchantreference> <mode>TEST</mode> <reason>DECLINED</reason> <status>7</status> <time>1169223906</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml) card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.pre_authorise('100001', D('123.22'), card) def test_invalid_request_exception_raised_for_error(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>21859999000005679</datacash_reference> <information>This vTID is not configured to process pre-registered card transactions.</information> <merchantreference>123403</merchantreference> <reason>Prereg: Merchant Not Subscribed</reason> <status>251</status> <time>1074692433</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml) card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(InvalidGatewayRequestError): self.facade.pre_authorise('100001', D('123.22'), card)
class FacadeTests(TestCase, XmlTestingMixin): def setUp(self): self.facade = Facade() def test_unicode_handling(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard(card_number='1000350000000007', expiry_date='10/13', cvv='345') self.facade.pre_authorise( '1234', D('10.00'), card, the3rdman_data={'customer_info': { 'surname': u'Smörgåsbord' }}) def test_second_fulfill_has_merchant_ref(self): # Initial pre-auth self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.pre_authorise('1234', D('100.00'), card) txn = OrderTransaction.objects.get(datacash_reference=ref) # First fulfill self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_SUCCESSFUL_FULFILL_RESPONSE) self.facade.fulfill_transaction('1234', D('50.00'), txn.datacash_reference, txn.auth_code) self.facade.fulfill_transaction('1234', D('40.00'), txn.datacash_reference, txn.auth_code) fulfill_txn = OrderTransaction.objects.get(order_number='1234', amount=D('40.00')) self.assertTrue('merchantreference' in fulfill_txn.request_xml) def test_zero_amount_for_pre_raises_exception(self): card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.pre_authorise('1234', D('0.00'), card) def test_zero_amount_for_auth_raises_exception(self): card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.authorise('1234', D('0.00'), card) def test_auth_request_creates_txn_model(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') self.facade.authorise('100001', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100001')[0] self.assertEquals('auth', txn.method) self.assertEquals(D('123.22'), txn.amount) self.assertTrue(len(txn.request_xml) > 0) self.assertTrue(len(txn.response_xml) > 0) def test_auth_request_with_integer_cvv(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv=345) self.facade.authorise('100001', D('123.22'), card) def test_pre_request_creates_txn_model(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') self.facade.pre_authorise('100001', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100001')[0] self.assertEquals('pre', txn.method) self.assertEquals(D('123.22'), txn.amount) self.assertTrue(len(txn.request_xml) > 0) self.assertTrue(len(txn.response_xml) > 0) def test_pre_request_uses_billing_address_fields(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock card = Bankcard('1000350000000007', '10/13', cvv='345') address = MockBillingAddress(line1='1 Egg Street', line2='Farmville', line4='Greater London', postcode='N1 8RT') self.facade.pre_authorise('100001', D('123.22'), card, billing_address=address) request_xml = mock.call_args[0][0] self.assertXmlElementEquals( request_xml, '1 Egg Street', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1') self.assertXmlElementEquals( request_xml, 'Farmville', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2') self.assertXmlElementEquals( request_xml, 'N1 8RT', 'Request.Transaction.CardTxn.Card.Cv2Avs.postcode') def test_auth_request_uses_billing_address_fields(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock card = Bankcard('1000350000000007', '10/13', cvv='345') address = MockBillingAddress(line1='1 Egg Street', line2='Farmville', line4='Greater London', postcode='N1 8RT') self.facade.authorise('100001', D('123.22'), card, billing_address=address) request_xml = mock.call_args[0][0] self.assertXmlElementEquals( request_xml, '1 Egg Street', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1') self.assertXmlElementEquals( request_xml, 'Farmville', 'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2') self.assertXmlElementEquals( request_xml, 'N1 8RT', 'Request.Transaction.CardTxn.Card.Cv2Avs.postcode') def test_refund_request_doesnt_include_currency_attribute(self): mock = Mock(return_value=fixtures.SAMPLE_RESPONSE) self.facade.gateway._fetch_response_xml = mock self.facade.refund_transaction('100001', D('123.22'), txn_reference='12345') request_xml = mock.call_args[0][0] self.assertTrue('currency' not in request_xml) def test_auth_request_returns_datacash_ref(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.authorise('100001', D('123.22'), card) self.assertEquals('3000000088888888', ref) def test_auth_request_using_previous_txn_ref(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.authorise('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_request(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) card = Bankcard('1000350000000007', '10/13', cvv='345') ref = self.facade.refund('100005', D('123.22'), card) txn = OrderTransaction.objects.filter(order_number='100005')[0] self.assertEquals('refund', txn.method) def test_pre_auth_using_history_txn(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.pre_authorise('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_using_historic_txn(self): self.facade.gateway._fetch_response_xml = Mock( return_value=fixtures.SAMPLE_RESPONSE) ref = self.facade.refund('100001', D('123.22'), txn_reference='3000000088888888') self.assertEquals('3000000088888888', ref) def test_refund_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.refund('100001', D('123.22')) def test_pre_auth_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.pre_authorise('100001', D('123.22')) def test_auth_without_source_raises_exception(self): with self.assertRaises(ValueError): ref = self.facade.authorise('100001', D('123.22')) def test_successful_cancel_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>4900200000000001</datacash_reference> <merchantreference>4900200000000001</merchantreference> <mode>TEST</mode> <reason>CANCELLED OK</reason> <status>1</status> <time>1151567456</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock( return_value=response_xml) ref = self.facade.cancel_transaction('100001', '3000000088888888') self.assertEquals('4900200000000001', ref) def test_successful_fulfill_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>3900200000000001</datacash_reference> <merchantreference>3900200000000001</merchantreference> <mode>LIVE</mode> <reason>FULFILLED OK</reason> <status>1</status> <time>1071567356</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock( return_value=response_xml) self.facade.fulfill_transaction('100002', D('45.00'), '3000000088888888', '1234') txn = OrderTransaction.objects.filter(order_number='100002')[0] self.assertEquals('fulfill', txn.method) def test_successful_refund_request(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>4000000088889999</datacash_reference> <HistoricTxn> <authcode>896876</authcode> </HistoricTxn> <merchantreference>4100000088888888</merchantreference> <mode>LIVE</mode> <reason>ACCEPTED</reason> <status>1</status> <time>1071567375</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock( return_value=response_xml) self.facade.refund_transaction('100003', D('45.00'), '3000000088888888') txn = OrderTransaction.objects.filter(order_number='100003')[0] self.assertEquals('txn_refund', txn.method) def test_transaction_declined_exception_raised_for_decline(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <CardTxn> <authcode>DECLINED</authcode> <card_scheme>Mastercard</card_scheme> <country>United Kingdom</country> </CardTxn> <datacash_reference>4400200045583767</datacash_reference> <merchantreference>AA004630</merchantreference> <mode>TEST</mode> <reason>DECLINED</reason> <status>7</status> <time>1169223906</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock( return_value=response_xml) card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(UnableToTakePayment): self.facade.pre_authorise('100001', D('123.22'), card) def test_invalid_request_exception_raised_for_error(self): response_xml = """<?xml version="1.0" encoding="UTF-8"?> <Response> <datacash_reference>21859999000005679</datacash_reference> <information>This vTID is not configured to process pre-registered card transactions.</information> <merchantreference>123403</merchantreference> <reason>Prereg: Merchant Not Subscribed</reason> <status>251</status> <time>1074692433</time> </Response>""" self.facade.gateway._fetch_response_xml = Mock( return_value=response_xml) card = Bankcard('1000350000000007', '10/13', cvv='345') with self.assertRaises(InvalidGatewayRequestError): self.facade.pre_authorise('100001', D('123.22'), card)