Maybe you got it solved already, but here is some of my stuff (which works ;-):

I looked into PloneMall, but it's code is in some closed CVS and looked very complex. I decided to create my own shop starting from the product Simple Cart Item (by Aaron). In the end it was much expanded.



This is the code that does the PayPal checkout - largely stolen from the product Simple Cart Item:

from Products.PythonScripts.standard import urlencode

'''This is the digester for the cart string. Currently this digester formats a string to be sent to a Pay Pal gateway, but could be modifed for other gateways'''

portal_props=context.portal_properties
shop_props = portal_props.mshop_properties
shop_tool = context.mshop_tool

r= context.REQUEST
s = r.SESSION

# retrieve the cartList
cartlist=s.get("cartList", [])

# calculate items total
cart_total = 0.0
for item in cartlist:
    item_total = item['item_total']
    cart_total += item_total

# calculate payment costs (depends on items bought)
shipping= shop_tool.getPaymentCosts("paypal", cart_total)
shipping += shop_props.shipping


#cart preamble
cart_commands = {"cmd"           : "_cart",
                 "upload"        : "1",
                 "business"      : shop_props.paypal_business,
                 "currency_code" : "EUR",
                 "invoice"       : DateTime(),
                 "no_shipping"   : "0",
                 "handling_cart" : shipping,
"cancel_return" : context.portal_url() + '/sys/pp_cancel_callback', "return" : context.portal_url() + '/sys/pp_success_callback', "image_url" : context.portal_url() + '/pp_shoplogo.gif',
                 "notify_url"    : context.portal_url() + '/pp_ipn',
                 }


# formats cart items
l = 0

for item in cartlist:
    cart_item = item
    l+=1
    d ={'item_name_%d' % l : cart_item['name'],
        'on0_%d' % l       : 'variant',
        'os0_%d' % l       : cart_item['variant'],
        'on1_%d' % l       : 'maat',
        'os1_%d' % l       : cart_item['item_size'],
        'amount_%d' % l    : cart_item['price'],
        'quantity_%d' % l  : cart_item['quantity']
        }

    cart_commands.update(d)

#points to (sandbox) paypal account
if shop_props.paypal_use_sandbox:
    url = shop_props.paypal_sandbox_url
else:
    url = shop_props.paypal_url

context.plone_log("Commands send to paypal url (%s):%s" % (url, str(cart_commands)))

redirect_url = '%s?%s' % (url, urlencode(cart_commands))

state.setNextAction('redirect_to:string:'+redirect_url)
return state


=======================
This script calls into a plone tool (MShopTool): it is only a script to handle the callback from PayPal:

# MShopTool does the real work
mst = context.mshop_tool
result = mst.handlePayPalIpn(context.REQUEST)

=======================
This is the relevant code from the tool MShopTool:


    def handlePayPalIpn(self, request):
        log("Starting PayPal IPN")
        portal_props=getToolByName(self, 'portal_properties')
        shop_props = portal_props.mshop_properties

        #points to (sandbox) paypal account
        if shop_props.paypal_use_sandbox:
            url = shop_props.paypal_sandbox_url
        else:
            url = shop_props.paypal_url

        # copy the incoming form vars
        formvars = request.form
        # append validation command
        formvars['cmd']='_notify-validate'
        # remove Zope funny var:
        if '-C' in formvars:
            del formvars['-C']
        data = urllib.urlencode(formvars)

        response = urllib.urlopen(url,data).read()
        if response=="VERIFIED":
log("PayPal IPN verification call: VERIFIED response. \n", formvars )
            self.notifyShopPayPalResult(formvars)
elif (response=="INVALID" or formvars['receiver_email']!=shop_props.paypal_business): # message compromised or not intended for us logerror("PayPal IPN verification call: INVALID response. \n", formvars )
        else:
logerror("PayPal IPN verification call failed. \n", formvars )


HTH


M.J. Maré
WebToTheMax

On 23-jun-05, at 19:47, Ed Colmar wrote:

I found the Bastion Ledger and Bastion Paypal connection, but it is way way overkill for what I want to do.
Does anyone have a simple(r) IPN script they can point me towards?

TIA!

-e-
_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope-dev )


M.J. Maré
WebToTheMax

T +31-20-4 100 242
F +31-20-4 100 243
W www.webtothemax.com
E [EMAIL PROTECTED]
J [EMAIL PROTECTED]


_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to