2010-06-27 2 views
2

Je développe maintenant mon site en utilisant django. En intégrant mon site avec paypal, j'utilise l'application enfichable "http://github.com/johnboxall/django-paypal". Bien que le document est très clair pour "Utilisation de PayPal Payments Pro (WPP)", mais j'ai encore quelques questions, en particulier la relation entre "returnurl" et "confirm_template". Lorsque je clique sur le bouton "continuer" sur le site paypal, il me redirige vers "returnurl". Ici, est mon problème, je ne sais pas comment faire face à ce retour. À mon avis, je devrais aussi écrire une fonction pour le rendre confirmation.html. Ai-je raison? Si oui, comment écrire cette fonction. Vraiment reconnaissant pour toute aide et instructions.comment faire face à returnurl dans django-paypal pour paypal WPP

Répondre

1

La documentation n'est pas bonne pour django-paypal. La réponse courte est que votre returnurl devrait être quel que soit l'URL de votre méthode buy_my_item. Voici quelques exemples tirés de quelque chose que j'ai travaillé IRL. Notez que j'utilise l'option "useraction = commit" de PayPal pour réduire le nombre d'étapes dans leur paiement Express.

Dans votre urls.py:

url(r'^pay-now/', views.pay_now, name='pay_now'), 
url(r'^purchase-thanks/$', views.purchase_thanks, name='pay_success'), 
url(r'^purchase-cancelled/$', views.purchase_thanks, name='pay_cancel'), 

Dans votre views.py:

""" User payment method endpoint for rendering and processing forms. """ 
@csrf_exempt 
def pay_now(request): 
    # Override django-paypal library endpoints to include 'useraction=commit' 
    # which changed PayPal's review page to be a 'pay now' page. 
    # This is ugly but I didn't want to subclass. 
    from paypal.pro import views as pro_views 
    pro_views.EXPRESS_ENDPOINT = "https://www.paypal.com/webscr?cmd=_express-checkout&useraction=commit&%s" 
    pro_views.SANDBOX_EXPRESS_ENDPOINT = "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&useraction=commit&%s" 

    # ...because we use 'useraction=commit', there's no need to show the confirm page. 
    # So let's change the request to show the confirmation form into a request to 
    # approve it. It just so happens that the arguments are the same -- the difference 
    # is between the GET and the POST. 
    # <input type="hidden" name="token" value="EC-485941126E653491T" id="id_token"/> 
    # <input type="hidden" name="PayerID" value="78W69D3FEVWJBC" id="id_PayerID"/> 
    if request.method == 'GET' and 'token' in request.GET and 'PayerID' in request.GET: 
     request.method = 'POST' 
     request.POST = request.GET # Crudely convert GET to POST 

    item = { 
     'amt':   99.99, # Amount to charge for item 
     'currencycode': 'usd', 
     #'inv':   1, # Unique tracking variable paypal - must be a number. 
     #'desc':   'Your product name', # Deprecated by PayPal, don't bother 
               # (you'll get the name twice in your statement otherwise) 
     'custom':  'custom1', # Custom tracking variable for you. Realistically you have to pass 
            # this if you're specifying basket contents to PayPal as django-paypal 
            # won't be given `item_name` in the IPN, only `item_name1` etc. 
            # which it cannot interpret. 
     'cancelurl':  'http://%s%s' % DYNAMIC_URL, reverse('pay_cancel')), # Express checkout cancel url 
     'returnurl':  'http://%s%s' % (DYNAMIC_URL, reverse('pay_now')), # Express checkout return url 
     'allownote':  0, # Disable "special instructions for seller" 
     'l_name0':  'Your product name', 
     #'l_number0': 1234, 
     #'l_desc0':  'longer description', 
     'l_amt0':  99.99, 
     'l_qty0':  1, 
     'itemamt':  99.99, 
     #'taxamt':  0.00, 
     #'shippingamt': 0.00, 
     #'handlingamt': 0.00, 
     #'shipdiscamt': 0.00, 
     #'insuranceamt': 0.00, 
    } 

    kw = { 
     'item': item, 
     'payment_template': 'cms/register.html', # Template name for payment 
     'confirm_template': 'cms/paypal-confirmation.html', # Template name for confirmation 
     'success_url':  reverse('pay_success'), # Ultimate return URL 
    } 

    ppp = PayPalPro(**kw) 
    return ppp(request) 

Vous pouvez avoir un tas d'autres questions, comme « comment puis-je faire la différence entre un CE et un paiement WPP quand j'arrive à la page de confirmation de paiement? ", mais je vais sauvegarder cela jusqu'à ce qu'on me le demande! django-paypal n'est pas mauvais, mais il peut être assez frustrant de le faire fonctionner, en particulier lorsque vous voulez passer des valeurs supplémentaires à vos modèles, et la documentation (même sur les fourches que j'ai vues) n'est pas très bonne.

Notez que cet exemple fait référence à HTTP plutôt qu'aux URL HTTPS. En production, en utilisant WPP, vous voudrez certainement utiliser HTTPS. En outre, la distribution principale du produit est obsolète et vous devrez corriger le point de terminaison IPN avec @csrf_exempt pour le faire fonctionner.

+0

Je vais aller de l'avant et demander. Comment puis-je faire la différence entre EC et un paiement WPP? Aussi, ai-je besoin de définir le point de terminaison ipn n'importe où ici? – joshcartme

+0

Oh et après confirmation de l'utilisateur sur mon site, suis-je assuré que le paiement a été reçu? – joshcartme

+1

Si request.POST.has_key ['email'] alors c'est un WPP, sinon c'est EC. Vous devez trouver un autre moyen de transmettre l'adresse e-mail d'un utilisateur avec les paiements EC, ce qui peut être pénible. Oui, vous pouvez être sûr que le paiement a été effectué de cette manière. Cependant, j'ai tendance à attendre le rappel IPN. Et non, l'adresse IPN est définie dans votre configuration PayPal. Cela est vraiment irritant, et signifie que vous ne pouvez pas changer dynamiquement le point de terminaison IPN. Si vous utilisez les formulaires Web de PayPal pour traiter le paiement, vous le pouvez, mais qui veut les utiliser? – afit

Questions connexes