Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Interchange: users

custom payment module

 

 

Interchange users RSS feed   Index | Next | Previous | View Threaded


glenn at bnetmd

Aug 10, 2009, 10:35 AM

Post #1 of 12 (1202 views)
Permalink
custom payment module

Here's the situation:

We've got several stores running Interchange V5.2.0 It does the job! Been
using it for years.

A new client (big one, of course) wants us to process the charges for their
store through their own credit card system that they already use for
contributions. They also want us to pass order item detail to them in an
XML type structure so they can maintain their own merged database when
people have both made a contribution and a store purchase. The sequence
would be
- we take the order using the IC checkout page
-- send the charge/item info to our client
-- get their response on the charge
- we show the customer receipt.

They have provided a Perl routine that works, meaning I can run it from the
command line with a $1.00 amount and the charge gets processed by them OK.

SO!
How do you turn this into a payment module? I've perused the Payment.pm and
Payment module directory and am having trouble seeing how they interact, how
it gets called, where the "OK" or "refused" is returned to the checkout
process, etc. It looks like things get mapped/translated into things which
get mapped/translated into other things where they get mapped once again,
and somehow somewhere an "OK" signal is returned. Is there a HowTo or a
reference on this somewhere?

Thanks!
Glenn.



_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


gert at 3edge

Aug 10, 2009, 12:33 PM

Post #2 of 12 (1138 views)
Permalink
Re: custom payment module [In reply to]

> -----Original Message-----
> From: interchange-users-bounces [at] icdevgroup [mailto:interchange-
> users-bounces [at] icdevgroup] On Behalf Of Glenn McCalley
> Sent: Monday, August 10, 2009 8:36 PM
> To: interchange-users [at] icdevgroup
> Subject: [ic] custom payment module
>
> Here's the situation:
>
> We've got several stores running Interchange V5.2.0 It does the job!
> Been
> using it for years.
>
> A new client (big one, of course) wants us to process the charges for
> their
> store through their own credit card system that they already use for
> contributions. They also want us to pass order item detail to them in
> an
> XML type structure so they can maintain their own merged database when
> people have both made a contribution and a store purchase. The
> sequence
> would be
> - we take the order using the IC checkout page
> -- send the charge/item info to our client
> -- get their response on the charge
> - we show the customer receipt.
>
> They have provided a Perl routine that works, meaning I can run it from
> the
> command line with a $1.00 amount and the charge gets processed by them
> OK.
>
> SO!
> How do you turn this into a payment module? I've perused the
> Payment.pm and
> Payment module directory and am having trouble seeing how they
> interact, how
> it gets called, where the "OK" or "refused" is returned to the checkout
> process, etc. It looks like things get mapped/translated into things
> which
> get mapped/translated into other things where they get mapped once
> again,
> and somehow somewhere an "OK" signal is returned. Is there a HowTo or
> a
> reference on this somewhere?

The HowTo I did:
- copy one of the existing payment modules
- bash it , smack it, whack it, tweak it, until it says 'transaction OK' and
the (pre) authorization ended up in the banks cc transaction backoffice ...

You probably need to figure out some stuff, such as:
- what is the protocol used to communicate with the payment system (often
https)
- are there authentication key/values (username/password/secrect keys) that
you need to set up the transaction, the you usually stick
In your catalog.cfg (see the one from standard for example:
Route authorizenet id "__MV_PAYMENT_ID__"
Route authorizenet secret "__MV_PAYMENT_SECRET__"
Route authorizenet host "__MV_PAYMENT_HOST__"
Route authorizenet referer "__MV_PAYMENT_REFERER__"
- do you build a xml document to send (like I had to do), or you send some
key/value pairs?
- what do they return after your request?

This you will have to extract from your existing perl module ...

If I remember correctly once you do a request like this in your
OwnPaymentModule.pm:
my $thing = post_data($opt, \%query);

The \%query contains whatever you have to tell the cc processing end
$thing will contain the answer in one form or another ...

Then you parse that and extract the main information in a hash with keys
like:
MStatus (success,denied)
MErrMsg (could put in an error message provided from the cc company or
some other 'oopsies failed' message)
order-id the ID for your succesfull order ..

You probably have to look for the %type_map hash as that contains a mapping
for transaction types ... might need some tweaking.

And then in Payment.pm you have the 'sub charge' which is where I believe
things are going down, looking down until :
# This is the return from all routines
my %result;

there is where then the OwnPaymentModule.pm comes to play ...


Perhaps a simple approach could be to set up OwnPaymentModule.pm and at the
point where it has 'post_data()' you just call that existing Perl script,
retrieve the response from that script and set the MStatus/MErrMsg/order-id
..

Oh and then in the standard store, the whole payment process starts from
etc/log_transaction and I believe etc/receipt holds the content of the page
shown after successful order processing ... there you can show the
ordernumber I think with [value mv_order_number]


So (unless someone will correct me, quite likely as all is done by head):
- checkout page, creditcard details added (standard fields
mv_credit_card_xxx)
- click checkout - field validation checks, then goes to etc/log_transaction
(depending on how your routes are set up)
- in log_transaction you have somewhere something like: [charge route="[var
MV_PAYMENT_MODE]"] where MV_PAYMENT_MODE is the your modulename, without
.pm
- that charge is calling Payment.pm which used your module...
- if all goes well it updates your database and anything else you want it to
do and uses etc/receipt.html to show the notice that the order has been
processed ...

Anyway good luck and let us know how you have sorted it in the end!

CU,

Gert





_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


glenn at bnetmd

Aug 17, 2009, 9:54 AM

Post #3 of 12 (1109 views)
Permalink
Re: custom payment module [In reply to]

----- Original Message -----
From: "Gert van der Spoel" <gert [at] 3edge>
To: <interchange-users [at] icdevgroup>
Sent: Monday, August 10, 2009 3:33 PM
Subject: Re: [ic] custom payment module


>> SO!
>> How do you turn this into a payment module? I've perused the
>> Payment.pm and Payment module directory and am having trouble seeing how
>> they
>> interact, how it gets called, where the "OK" or "refused" is returned to
>> the checkout
>> process, etc. It looks like things get mapped/translated into things
>> which get mapped/translated into other things where they get mapped once
>> again, and somehow somewhere an "OK" signal is returned. Is there a
>> HowTo or a reference on this somewhere?
>
> The HowTo I did:
> - copy one of the existing payment modules
> - bash it , smack it, whack it, tweak it, until it says 'transaction OK'
> and
> the (pre) authorization ended up in the banks cc transaction backoffice
> ...
>
>
> there is where then the OwnPaymentModule.pm comes to play ...
>
>
> Perhaps a simple approach could be to set up OwnPaymentModule.pm and at
> the
> point where it has 'post_data()' you just call that existing Perl script,
> retrieve the response from that script and set the
> MStatus/MErrMsg/order-id
> Anyway good luck and let us know how you have sorted it in the end!
>
> CU,
> Gert
>

OK, decided to try your suggestion to replace the "post_data()" routine with
the perl program that can already talk with the payment processor, so I've
created:
Payment/CDMI.pm which contains
sub CDMI { hack of authorizenet.pm }
and:
Payment/post_cdmi.pm which contains
sub post_cdmi { perl to/from payment processor }

CDMI contains the "post_data()" statement you mentioned which is now
"post_cdmi()"

I had to manually edit variable.txt for
MV_Payment_Mode CDMI Payment
...as CDMI did not show up as a payment mode in the UI.

Processing checkout returns an error as I would expect,
(Payment process): There was an error accepting payment: Real-time charge
failed. Reason: No account id
Credit Card Information: No account id

Both my modules contain debug statements such as:
::logDebug("CDMI CDMI start");
::logDebug("CDMI post_cdmi start");
and these are not showing up in the debug/error logs. That would seem to
indicate that the new payment module is not running at all? Now do I get it
to run? When I restart IC I see the successful "Require" messages so IC is
finding them but does not seem to recognize the payment mode.

THank you for suggestions,
Glenn.
>
>
>
>
> _______________________________________________
> interchange-users mailing list
> interchange-users [at] icdevgroup
> http://www.icdevgroup.org/mailman/listinfo/interchange-users
>
>



_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


gert at 3edge

Aug 17, 2009, 1:16 PM

Post #4 of 12 (1112 views)
Permalink
Re: custom payment module [In reply to]

> -----Original Message-----
> From: interchange-users-bounces [at] icdevgroup [mailto:interchange-
> users-bounces [at] icdevgroup] On Behalf Of Glenn McCalley
> Sent: Monday, August 17, 2009 7:55 PM
> To: interchange-users [at] icdevgroup
> Subject: Re: [ic] custom payment module
>
> ----- Original Message -----
> From: "Gert van der Spoel" <gert [at] 3edge>
> To: <interchange-users [at] icdevgroup>
> Sent: Monday, August 10, 2009 3:33 PM
> Subject: Re: [ic] custom payment module
>
>
> >> SO!
> >> How do you turn this into a payment module? I've perused the
> >> Payment.pm and Payment module directory and am having trouble seeing
> how
> >> they
> >> interact, how it gets called, where the "OK" or "refused" is
> returned to
> >> the checkout
> >> process, etc. It looks like things get mapped/translated into
> things
> >> which get mapped/translated into other things where they get mapped
> once
> >> again, and somehow somewhere an "OK" signal is returned. Is there a
> >> HowTo or a reference on this somewhere?
> >
> > The HowTo I did:
> > - copy one of the existing payment modules
> > - bash it , smack it, whack it, tweak it, until it says 'transaction
> OK'
> > and
> > the (pre) authorization ended up in the banks cc transaction
> backoffice
> > ...
> >
> >
> > there is where then the OwnPaymentModule.pm comes to play ...
> >
> >
> > Perhaps a simple approach could be to set up OwnPaymentModule.pm and
> at
> > the
> > point where it has 'post_data()' you just call that existing Perl
> script,
> > retrieve the response from that script and set the
> > MStatus/MErrMsg/order-id
> > Anyway good luck and let us know how you have sorted it in the end!
> >
> > CU,
> > Gert
> >
>
> OK, decided to try your suggestion to replace the "post_data()" routine
> with
> the perl program that can already talk with the payment processor, so
> I've
> created:
> Payment/CDMI.pm which contains
> sub CDMI { hack of authorizenet.pm }
> and:
> Payment/post_cdmi.pm which contains
> sub post_cdmi { perl to/from payment processor }
>
> CDMI contains the "post_data()" statement you mentioned which is now
> "post_cdmi()"
>
> I had to manually edit variable.txt for
> MV_Payment_Mode CDMI Payment
> ...as CDMI did not show up as a payment mode in the UI.
>
> Processing checkout returns an error as I would expect,
> (Payment process): There was an error accepting payment: Real-time
> charge
> failed. Reason: No account id
> Credit Card Information: No account id
>
> Both my modules contain debug statements such as:
> ::logDebug("CDMI CDMI start");
> ::logDebug("CDMI post_cdmi start");
> and these are not showing up in the debug/error logs. That would seem
> to
> indicate that the new payment module is not running at all? Now do I
> get it
> to run? When I restart IC I see the successful "Require" messages so
> IC is
> finding them but does not seem to recognize the payment mode.

Have you tried putting debug statements in Payment.pm to see if you can find
the place where things might be breaking before reaching the modules you
created?

CU,

Gert


_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


glenn at bnetmd

Aug 17, 2009, 5:48 PM

Post #5 of 12 (1102 views)
Permalink
Re: custom payment module [In reply to]

----- Original Message -----
From: "Gert van der Spoel" <gert [at] 3edge>
To: <interchange-users [at] icdevgroup>
Sent: Monday, August 17, 2009 4:16 PM
Subject: Re: [ic] custom payment module

>> Both my modules contain debug statements such as:
>> ::logDebug("CDMI CDMI start");
>> ::logDebug("CDMI post_cdmi start");
>> and these are not showing up in the debug/error logs. That would seem
>> to
>> indicate that the new payment module is not running at all? Now do I
>> get it
>> to run? When I restart IC I see the successful "Require" messages so
>> IC is
>> finding them but does not seem to recognize the payment mode.
>
> Have you tried putting debug statements in Payment.pm to see if you can
> find
> the place where things might be breaking before reaching the modules you
> created?
>
> CU,
>
> Gert
>
Did that and didn't find much, but what did the trick was realizing there
HAD to be a table somewhere that equated payment mode names with file names
Payment lib modules.

CDMI = CDMI.pm.

Found that table, did the entry, and lo! it executes.
Turned the original command line code into a subroutine and it's talking to
the card processor system. Working out the variable name map and that
should do it. I'll do a summary when it -really- works.
Hey Gert thanks for the pointers, it was your first reply that got me on the
track. I haven't had to hack IC much, it's so flexible anyway.
Glenn.
>
> _______________________________________________
> interchange-users mailing list
> interchange-users [at] icdevgroup
> http://www.icdevgroup.org/mailman/listinfo/interchange-users
>
>



_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


glenn at bnetmd

Aug 21, 2009, 9:40 AM

Post #6 of 12 (1053 views)
Permalink
Re: custom payment module works [In reply to]

So I wrote a custom payment module!
Learned a lot about IC in the process.
Thanks to Gert van der Spoel for several suggestions that triggered things
to try. Beer owed.

I started with the AuthorizeNet module (copied AuthorizeNet.pm to CMDI.pm)
as the processor I needed to use would accept a name=value array. Not sure
where this would have gone if they needed XML.

I had a Perl program that could be executed from the command line and would
successfully process a payment. That was a huge benefit as I was able to
see what their responses look like using that. Changed the code to make
that program into a subroutine (sub post_cmdi ) which I added to CMDI.pm.
This replaced the use of Payment.pm to actually process the payment.
Changed the line "post_data()" (the original call to Payment.pm) to
"post_cmdi()".

Then had to parse CMDI's response (which is far simpler than AuthNet's which
allowed a bunch of code to be ripped out), and used that result to set
MStatus as 'success' or 'failure' just like before. Parsed out an error
code that they supply and added a short hash of messages indexed by the
error code to set ErrorMsg so it will show up on the checkout page in the
case of failure.

So now payments process through these jokers.
Then they call and say "that's great and oh by the way can you also pass us
the items and quantities with the charge, we'd like to track that". Here's
an XML construct to put into a name/value pair to do that. Damn, never had
to work with cart detail.

Google is my friend, found an 8 year old post by "Chris and Ben" on this
list that talked about $Vend::Session{carts}{main}[n]{code} and bashed that
into a cart listing routine out of which comes an XML string to do the job.

So it works, now to get on to the auto-add item at checkout to round up a
purchase to the next even $10.00 as a contribution to the cause. I think
I'll take Saturday off though.

Glenn.





_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


peter at pajamian

Aug 21, 2009, 10:05 AM

Post #7 of 12 (1061 views)
Permalink
Re: custom payment module works [In reply to]

On 08/21/2009 09:40 AM, Glenn McCalley wrote:
> So I wrote a custom payment module!
>
> Google is my friend, found an 8 year old post by "Chris and Ben" on this
> list that talked about $Vend::Session{carts}{main}[n]{code} and bashed that
> into a cart listing routine out of which comes an XML string to do the job.

Use $Vend::Items instead of $Vend::Session{carts}{main}.

Can you contribute the payment module back to Interchange?

Peter


_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


glenn at bnetmd

Aug 21, 2009, 10:39 AM

Post #8 of 12 (1063 views)
Permalink
Re: custom payment module works [In reply to]

----- Original Message -----
From: "Peter" <peter [at] pajamian>
To: <interchange-users [at] icdevgroup>
Sent: Friday, August 21, 2009 1:05 PM
Subject: Re: [ic] custom payment module works


> On 08/21/2009 09:40 AM, Glenn McCalley wrote:
>
> Use $Vend::Items instead of $Vend::Session{carts}{main}.
>
> Can you contribute the payment module back to Interchange?
>
> Peter
>

Thanks for the tip Peter, I'll look at that when the smoke clears.

I don't think the module would be useful (other than as an example of
marginal coding skills) as no one else would ever use it. The guys at the
other end aren't a real gateway, they just push the charge through to a real
credit card gateway and send me the go/no go that they get back. The
requirement was more a matter of them wanting to get the money without
opening a new gateway account or share an ID/PW and enable them to capture
the sales data into a system they already have, merging it into a larger
database for later use.

Glenn.

>
> _______________________________________________
> interchange-users mailing list
> interchange-users [at] icdevgroup
> http://www.icdevgroup.org/mailman/listinfo/interchange-users
>
>



_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


lyn at zolotek

Sep 12, 2011, 6:26 AM

Post #9 of 12 (136 views)
Permalink
Re: custom payment module [In reply to]

On Sunday 11 September 2011 20:48:40 Dan Bergan wrote:
> I am creating a custom payment module (using Lyn's PayPal Express and
> WorldPay modules as starting points.) I'm having a strange problem
> and I can't figure out what I'm doing wrong.
>
> A user is sent to the payment provider's web site to enter their
> billing address and payment info. After the credit card is processed,
> the payment site posts data back to interchange (which I save to the
> database), then redirects the user back to my ic site where I submit
> the order, the payment module grabs the previously saved information
> (billing address, payment result) and saves that information to the
> user's Values space.
>
> All this seems to work just fine -- log_transaction saves the order
> just fine, and the customer information in the Values space (that I
> retrieved in the payment module) are available, but in the receipt
> page, email receipt and my order report, those values are not present.
>
> Is that expected behavior, or I am making a mistake somewhere?
>
> Thanks -
> Dan Bergan

The most likely scenario is that you're dropping the session at the point
where you change to send the emails and display the receipt. Check this first
by displaying the session id on the page at various points.

--
Lyn St George

_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


dan at berganconsulting

Sep 12, 2011, 9:08 AM

Post #10 of 12 (136 views)
Permalink
Re: custom payment module [In reply to]

On Mon, Sep 12, 2011 at 7:26 AM, Lyn St George <lyn [at] zolotek> wrote:
> On Sunday 11 September 2011 20:48:40 Dan Bergan wrote:
>> I am creating a custom payment module (using Lyn's PayPal Express and
>> WorldPay modules as starting points.)  I'm having a strange problem
>> and I can't figure out what I'm doing wrong.
>>
>> A user is sent to the payment provider's web site to enter their
>> billing address and payment info. After the credit card is processed,
>> the payment site posts data back to interchange (which I save to the
>> database), then redirects the user back to my ic site where I submit
>> the order, the payment module grabs the previously saved information
>> (billing address, payment result) and saves that information to the
>> user's Values space.
>>
>> All this seems to work just fine -- log_transaction saves the order
>> just fine, and the customer information in the Values space (that I
>> retrieved in the payment module) are available, but in the receipt
>> page, email receipt and my order report, those values are not present.
>>
>> Is that expected behavior, or I am making a mistake somewhere?
>>
>> Thanks -
>> Dan Bergan
>
> The most likely scenario is that you're dropping the session at the point
> where you change to send the emails and display the receipt. Check this first
> by displaying the session id on the page at various points.
>

Values that were set before the payment module and Scratch values that
were set inside the payment module are available at every step, so I
think the session is being maintained.

I did some digging into the code, and I found that in route_order in
Order.pm, and I see near the beginning:
my $value_save = { %{$::Values} };

And then near the end of the function:
$Vend::Interpolate::Values = $::Values = $value_save;

So, am I right in thinking that saving data to the values space in an
order route won't work for me? I assume that I will have to put my
payment processing outside of the order route:
[charge route="mypaymentroute"]
and then submit the order after that.

Dan

_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


lyn at zolotek

Sep 13, 2011, 1:14 PM

Post #11 of 12 (135 views)
Permalink
Re: custom payment module [In reply to]

On Monday 12 September 2011 17:08:37 Dan Bergan wrote:
> On Mon, Sep 12, 2011 at 7:26 AM, Lyn St George <lyn [at] zolotek> wrote:
> > On Sunday 11 September 2011 20:48:40 Dan Bergan wrote:
> >> I am creating a custom payment module (using Lyn's PayPal Express and
> >> WorldPay modules as starting points.) I'm having a strange problem
> >> and I can't figure out what I'm doing wrong.
> >>
> >> A user is sent to the payment provider's web site to enter their
> >> billing address and payment info. After the credit card is processed,
> >> the payment site posts data back to interchange (which I save to the
> >> database), then redirects the user back to my ic site where I submit
> >> the order, the payment module grabs the previously saved information
> >> (billing address, payment result) and saves that information to the
> >> user's Values space.
> >>
> >> All this seems to work just fine -- log_transaction saves the order
> >> just fine, and the customer information in the Values space (that I
> >> retrieved in the payment module) are available, but in the receipt
> >> page, email receipt and my order report, those values are not present.
> >>
> >> Is that expected behavior, or I am making a mistake somewhere?
> >>
> >> Thanks -
> >> Dan Bergan
> >
> > The most likely scenario is that you're dropping the session at the point
> > where you change to send the emails and display the receipt. Check this
> > first by displaying the session id on the page at various points.
>
> Values that were set before the payment module and Scratch values that
> were set inside the payment module are available at every step, so I
> think the session is being maintained.
>
> I did some digging into the code, and I found that in route_order in
> Order.pm, and I see near the beginning:
> my $value_save = { %{$::Values} };
>
> And then near the end of the function:
> $Vend::Interpolate::Values = $::Values = $value_save;
>
> So, am I right in thinking that saving data to the values space in an
> order route won't work for me? I assume that I will have to put my
> payment processing outside of the order route:
> [charge route="mypaymentroute"]
> and then submit the order after that.
>
> Dan

The values hash should be available if it's retrieved at the point that you
want to use it - I'm not totally clear on the precise process happening here
but perhaps you have an extra step before using the retrieved values? Losing
the session is really the only way you're going to lose any values in the
session in this procedure, so perhaps you could double check that with
explicit debugging points?

--
Lyn St George

_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users


dan at berganconsulting

Sep 16, 2011, 4:17 PM

Post #12 of 12 (128 views)
Permalink
Re: custom payment module [In reply to]

snip
> >
> > Values that were set before the payment module and Scratch values that
> > were set inside the payment module are available at every step, so I
> > think the session is being maintained.
> >
> > I did some digging into the code, and I found that in route_order in
> > Order.pm, and I see near the beginning:
> > my $value_save = { %{$::Values} };
> >
> > And then near the end of the function:
> > $Vend::Interpolate::Values = $::Values = $value_save;
> >
> > So, am I right in thinking that saving data to the values space in an
> > order route won't work for me?  I assume that I will have to put my
> > payment processing outside of the order route:
> > [charge route="mypaymentroute"]
> > and then submit the order after that.
> >
> > Dan
>
> The values hash should be available if it's retrieved at the point that you
> want to use it - I'm not totally clear on the precise process happening here
> but perhaps you have an extra step before using the retrieved values? Losing
> the session is really the only way you're going to lose any values in the
> session in this procedure, so perhaps you could double check that with
> explicit debugging points?
>

Sorry, maybe I wasn't clear enough in my explanation -- the Values
hash is available, the problem was that in the payment processing
during the order route, I was adding new values to the hash -- those
values are not available in subsequent order routes ("main",
"copy_user"). But, I know the session is maintained because if I add
a scratch value, that is available during all steps.

So, I moved my payment route to separate step -- I call [charge
route="mypaymentroute"] then I bounce to a url to do the final submit
of the order. That seems to be working just fine.

Dan

_______________________________________________
interchange-users mailing list
interchange-users [at] icdevgroup
http://www.icdevgroup.org/mailman/listinfo/interchange-users

Interchange users RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.