Hi Simon,

I've got a live system working with PayPal. Here's my handler:

def ipn_handler():
    parameters = request.vars
    if len(request.vars.keys()) > 0:
        params = "cmd=_notify-validate&" + urllib.urlencode(parameters)
        headers = {"Content-type": "application/x-www-form-urlencoded",
                   "Content-Length": "%s" % (len(params))}
        
        r1 = None
        try:
            conn = httplib.HTTPSConnection("www.paypal.com")
            conn.request("POST", "/cgi-bin/webscr", params, headers )
            r1 = conn.getresponse()
        except:
            ... handle error ...
            return
        if parameters['payment_status'] == "Completed":
            ... do stuff ...

It is adapted from code in the web2py cookbook. To be honest, I've never 
thought about the order of the URL. However, all I can say is that the 
above code has been running for about a year now without a problem.

Neil

On Thursday, 18 July 2013 21:02:03 UTC+1, SimonD wrote:
>
> OK, I think I have stumbled on a solution. Which I thought would be useful 
> to share here.
>
> Playing with request.env, I noted that this too was Storage.
>
> Hence: request.env.query_string appears to give me exactly what I need. 
> i.e. it is essentially the "raw" string of vars. Unaltered and in the 
> original order, just as PayPal wants to see.
> So, anyone planning to deploy PayPal's IPN, might like to make a note.
>
> This doesn't appear to be detailed  anywhere ??  If it is, then I have 
> overlooked a useful source of API information (that might have led me this 
> answer a lot earlier and not wasted forum space). If anyone knows where I 
> would have found this detailed, I would really appreciate the URLs 
> please......
>
> Thanks
> Simon
>
> On Thursday, July 18, 2013 5:46:23 PM UTC+1, SimonD wrote:
>>
>> Hello, I would be sure that someone has come across this already. I hope 
>> so.
>> I am writing a handler for PayPal IPN. Actually, a little easier that I 
>> thought it would be except for one issue: -
>>
>> request.vars creates a Storage object, but the key:value pairs are not in 
>> the same sequence as they are in the URL. It almost seems to be a 
>> randomised order.
>> For 99.9% of occasions this is OK. However, as part of the  IPN handler 
>> authentication, PayPal expects to receive the URL (var) string back exactly 
>> as they posted it to my application, specifically with the vars in the same 
>> order. Their documentation re-states this requirement in multiple places !.
>> I suspect (although I don't know), that PayPal is simply matching the 
>> return var string to the one it posts. i.e. not actually wasting server 
>> cycles with intelligent var matching :-(
>> I am also not on a LIVE server so, although PayPal have a test sandbox, 
>> it is not a lot of use at this point.
>>
>> I cannot identify any other function in web2py to pull the raw URL 
>> string. I think the only function is request.vars.
>> I note that request.args has an index method (i.e.  request.args(i) ) so 
>> that the args can be pulled in sequence. But request.vars does not have 
>> this method.
>>
>> To test my random order theory, here is a test function()
>>
>> import urllib
>> def sample():
>> #sample of ipn_handler code
>>     getvars=request.vars
>>     test1=urllib.urlencode(dict(getvars))
>>     
>>     getvars=request.vars
>>     test2=''
>>     for item in getvars:
>>         test2=CAT(test2,'&',item,'=',getvars[item])
>>     
>>     test3=request.vars
>>     
>>     return dict(test1=test1,test2=test2,test3=test3)
>>
>> and the view (extract)....
>> test1: {{=test1}}<br />
>> test2: {{=test2}}<br />
>> test3: {{=test3}}<br />
>>
>> So, if my url vars are as follows:-
>> ?a=11&b=22&c=33&d=44&e=55&f=66&g=77&h=88
>>
>> ...this is what the view shows.
>> test1: a=11&c=33&b=22&e=55&d=44&g=77&f=66&h=88
>> test2: &a=11&c=33&b=22&e=55&d=44&g=77&f=66&h=88
>> test3: <Storage {'a': '11', 'c': '33', 'b': '22', 'e': '55', 'd': '44', 
>> 'g': '77', 'f': '66', 'h': '88'}>
>>
>> You can see that I have testing two ways to create a return var string 
>> (test1 and test2), and also shown the Storage object (test3)
>> test1, test2 and test3 show an identical sequence. But it is different to 
>> the actual posted URL var sequence.
>> BTW - the actual IPN string is not determiistic, so it is not like I can 
>> manually build a return string.
>>
>> Thanks!
>> Simon
>>
>>
>>
>> I note that on web2pyslices, there are (I see) two slices (for PayPal 
>> IPN) that also appear to generate a randomised return string. According to 
>> the PayPal docs, that string will be rejected.
>>
>> So, what on earth am I doing wrong? Or perhaps there is another way to 
>> pull the vars from the URL? (request.url doesn't pass the vars)
>> Or has someone a different way to recreate the URL for PayPal IPN?
>>
>> Thanks
>> Simon
>>
>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to