123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| # ==================================================================
 | |
| # Gossamer Links - enhanced directory management system
 | |
| #
 | |
| #   Website  : http://gossamer-threads.com/
 | |
| #   Support  : http://gossamer-threads.com/scripts/support/
 | |
| #   CVS Info : 087,071,086,086,085      
 | |
| #   Revision : $Id: 2CheckOut.pm,v 1.13 2006/08/22 23:07:53 brewt Exp $
 | |
| # 
 | |
| # Copyright (c) 2003 Gossamer Threads Inc.  All Rights Reserved.
 | |
| # Redistribution in part or in whole strictly prohibited.  Please
 | |
| # see LICENSE file for full details.
 | |
| # ==================================================================
 | |
| #
 | |
| # Glue between Gossamer Links and 2CheckOut payment interface
 | |
| 
 | |
| package Links::Payment::Remote::2CheckOut;
 | |
| use strict;
 | |
| 
 | |
| # Make sure the payment module is available
 | |
| use GT::Payment::Remote::2CheckOut;
 | |
| use Links qw/:objects/;
 | |
| use Links::Payment qw/:status :log/;
 | |
| use Links::SiteHTML;
 | |
| use vars qw/%INVALID %EMPTY/;
 | |
| 
 | |
| sub required {
 | |
| # -----------------------------------------------------------------------------
 | |
| # Returns a list of required field names.  Each field name will be looked for
 | |
| # in the language file, prefixed with 'PAYMENT_REMOTE_2CheckOut_', for the
 | |
| # title of the field, and 'PAYMENT_REMOTE_DESC_2CheckOut_' for a description of
 | |
| # the field's contents.
 | |
| # Note that these are just required SETUP fields, so things like credit card
 | |
| # number, billing name, etc. are NOT included.
 | |
| 
 | |
|     return
 | |
|         seller_id => { type => 'TEXT', valid => '^\d{1,10}$' },
 | |
|         secret_word => { type => 'TEXT', valid => '^(?!tango$).+$' };
 | |
| }
 | |
| 
 | |
| sub optional {
 | |
| # -----------------------------------------------------------------------------
 | |
|     return
 | |
|         demo => { type => 'YESNO' };
 | |
| }
 | |
| 
 | |
| sub payment_info {
 | |
| # -----------------------------------------------------------------------------
 | |
| # Returns a hashref of payment hints
 | |
| #
 | |
|     my @fields = qw/seller_id secret_word demo/;
 | |
|     my $ret = {
 | |
|         fields => \@fields
 | |
|     };
 | |
|     if (my $info = $CFG->{payment}->{remote}->{used}->{'2CheckOut'}) {
 | |
|         for (@fields) {
 | |
|             $ret->{$_} = $info->{$_};
 | |
|         }
 | |
|     }
 | |
|     return $ret;
 | |
| }
 | |
| 
 | |
| sub verify {
 | |
| # -----------------------------------------------------------------------------
 | |
| # Checks that $IN, combined with the saved admin settings, makes up all of the
 | |
| # required information.  Returns 1 on success, or an array ref of invalid keys
 | |
| # on failure.  For Remote payment methods, this has no real effect.
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| sub postback {
 | |
| # -----------------------------------------------------------------------------
 | |
| 
 | |
|     my $pay = $DB->table('Payments');
 | |
|     my $log = $DB->table('PaymentLogs');
 | |
| 
 | |
|     my $unique = $IN->param('cart_order_id');
 | |
|     my $payment = $pay->select({ payments_id => $unique })->fetchrow_hashref
 | |
|         or return; # Whatever it is, we didn't create it.
 | |
| 
 | |
|     GT::Payment::Remote::2CheckOut::process(
 | |
|         param => $IN,
 | |
|         sellerid => $CFG->{payment}->{remote}->{used}->{'2CheckOut'}->{seller_id},
 | |
|         password => $CFG->{payment}->{remote}->{used}->{'2CheckOut'}->{secret_word},
 | |
|         demo => $CFG->{payment}->{remote}->{used}->{'2CheckOut'}->{demo},
 | |
|         on_valid => sub {
 | |
|             return unless $IN->param('total') >= $payment->{payments_amount};
 | |
| 
 | |
|             return if $payment->{payments_status} == COMPLETED;
 | |
| 
 | |
|             my $cond = GT::SQL::Condition->new();
 | |
|             $cond->add(paylogs_payments_id => '=' => $unique);
 | |
|             $cond->add(paylogs_type => '=' => LOG_ACCEPTED);
 | |
|             $cond->add(paylogs_text => LIKE => "%\n2CheckOut order number: " . $IN->param('order_number') . "%\n");
 | |
|             my $found = $log->count($cond);
 | |
|             return if $found;
 | |
| 
 | |
|             $pay->update(
 | |
|                 { payments_status => COMPLETED, payments_last => time },
 | |
|                 { payments_id => $payment->{payments_id} }
 | |
|             );
 | |
| 
 | |
|             $log->insert({
 | |
|                 paylogs_payments_id => $payment->{payments_id},
 | |
|                 paylogs_type => LOG_ACCEPTED,
 | |
|                 paylogs_time => time,
 | |
|                 paylogs_text => (
 | |
|                     sprintf(Links::language('PAYMENT_REMOTE_APPROVED') => '2CheckOut') . "\n" .
 | |
|                     "2CheckOut order number: " . $IN->param('order_number') . "\n" .
 | |
|                     "Amount: $payment->{payments_amount}\n"
 | |
|                 )
 | |
|             });
 | |
| 
 | |
|             Links::Payment::process_payment($payment->{payments_linkid}, $payment->{payments_term});
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     print $IN->header;
 | |
|     print Links::SiteHTML::display('payment_success');
 | |
|     1;
 | |
| }
 | |
| 
 | |
| 1;
 | 
