NAME Business::OnlinePayment::CyberSource - CyberSource backend for Business::OnlinePayment VERSION version 2.01 SYNOPSIS use Business::OnlinePayment; #### # One step transaction, the simple case. #### my $tx = Business::OnlinePayment->new("CyberSource", conf_file => '/path/to/cybs.ini'"); $tx->content( type => 'VISA', action => 'Normal Authorization', invoice_number => '00000001', items => [{'number' => 0, 'name' => 'Test 1', 'quantity' => 1, 'unit_price' => '25.00'}, {'number' => 1, 'name' => 'Test 2', 'quantity' => 1, 'unit_price' => '50.00'}, {'number' => 3, 'name' => '$5 off', 'type' => 'COUPON', 'quantity' => 1, 'unit_price' => '5.00'}, ], first_name => 'Peter', last_name => 'Bowen', address => '123 Anystreet', city => 'Orem', state => 'UT', zip => '84097', country => 'US', email => 'foo@bar.net', card_number => '4111 1111 1111 1111', expiration => '0906', cvv2 => '1234', #optional referer => 'http://valid.referer.url/', user => 'cybesource_user', fraud_check => 'true', fraud_threshold => '90', ); $tx->submit(); if($tx->is_success()) { print "Card processed successfully: ".$tx->authorization."\n"; } else { print "Card was rejected: ".$tx->error_message."\n"; } #### # Two step transaction, authorization and capture. # If you don't need to review order before capture, you can # process in one step as above. #### my $tx = Business::OnlinePayment->new("CyberSource", conf_file => '/path/to/cybs.ini'"); $tx->content( type => 'VISA', action => 'Authorization Only', invoice_number => '00000001', items => [{'number' => 0, 'name' => 'iPod Mini', 'quantity' => 1, 'unit_price' => '25.00'}, {'number' => 1, 'name' => 'Extended Warranty', 'quantity' => 1, 'unit_price' => '50.00'}, ], first_name => 'Peter', last_name => 'Bowen', address => '123 Anystreet', city => 'Orem', state => 'UT', zip => '84097', country => 'US', email => 'foo@bar.net', card_number => '4111 1111 1111 1111', expiration => '0906', cvv2 => '1234', #optional referer => 'http://valid.referer.url/', user => 'cybesource_user', fraud_check => 'true', fraud_threshold => '90', ); $tx->submit(); if($tx->is_success()) { # get information about authorization $authorization = $tx->authorization $order_number = $tx->order_number; $security_key = $tx->security_key; $avs_code = $tx->avs_code; # AVS Response Code $cvv2_response = $tx->cvv2_response; # CVV2/CVC2/CID Response Code $cavv_response = $tx->cavv_response; # Cardholder Authentication # Verification Value (CAVV) Response # Code # now capture transaction my $capture = new Business::OnlinePayment("CyberSource"); $capture->content( action => 'Post Authorization', order_number => $order_number, merchant_descriptor => 'IPOD MINI', amount => '75.00', security_key => $security_key, ); $capture->submit(); if($capture->is_success()) { print "Card captured successfully: ".$capture->authorization."\n"; } else { print "Card was rejected: ".$capture->error_message."\n"; } } else { print "Card was rejected: ".$tx->error_message."\n"; } DESCRIPTION For detailed information see Business::OnlinePayment. API "load_config()" loads "cybs.ini" "map_fields" "request_merge" "set_defaults" SUPPORTED TRANSACTION TYPES Visa, MasterCard, American Express, Discover Content required: type, login, action, amount, first_name, last_name, card_number, expiration. Checks Currently not supported (TODO) NOTE cybs.ini The cybs.ini default home is /etc/cybs.ini - if you would prefer it to live someplace else specify that in the new. A few notes on cybs.ini - most settings can be overwritten by the submit call - except for the following exceptions: sendToProduction From a systems perspective, this should be hard so that there is NO confusion as to which server the request goes against. You can set the business rules from the ini - the following rules are supported businessRules_declineAVSFlags businessRules_ignoreAVSResult businessRules_ignoreCVResult Full Name vs. First & Last Unlike Business::OnlinePayment, Business::OnlinePayment::CyberSource requires separate first_name and last_name fields. I should probably Just split them apart. If you feel industrious... Settling To settle an authorization-only transaction (where you set action to 'Authorization Only'), submit the request ID code in the field "order_number" with the action set to "Post Authorization". You can get the transaction id from the authorization by calling the order_number method on the object returned from the authorization. You must also submit the amount field with a value less than or equal to the amount specified in the original authorization. Items Item fields map as follows: * productCode -> type (adult_content, coupon, default, electronic_good, electronic_software, gift_certificate, handling_only, service, shipping_and_handling, shipping_only, stored_value, subscription) * productSKU -> SKU * productName -> name * quantity -> quantity * taxAmount -> tax * unitPrice -> unit_price See the Cybersource documentation for the significance of these fields (type can be confusing) COMPATIBILITY This module implements the Simple Order API 1.x from Cybersource. THANK YOU Jason Kohles For writing BOP - I didn't have to create my own framework. Ivan Kohler Tested the first pre-release version and fixed a number of bugs. He also encouraged me to add better error reporting for system errors. He also added failure_status support. Jason (Jayce^) Hall Adding Request Token Requirements (Among other significant improvements... ) SEE ALSO perl(1). Business::OnlinePayment. TODO Full Documentation Electronic Checks Pay Pal Full support including Level III descriptors AUTHORS * Peter Bowen * Caleb Cushing COPYRIGHT AND LICENSE This software is Copyright (c) 2011 by Caleb Cushing. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible)