【问题标题】:Why is code not executing after response received为什么收到响应后代码不执行
【发布时间】:2014-08-14 18:13:59
【问题描述】:

我正在运行下面的代码,它将用户带到 PayPal 进行付款,然后按预期将它们返回到return_url。但是代码不会进一步执行,也不会执行付款。

我的代码基于https://github.com/paypal/rest-api-sdk-python:

class PayPalHandler(tornado.web.RequestHandler):

    def get(self):

        logging.basicConfig(level=logging.INFO)

        paypal.configure({
                             "mode": PAYPAL_MODE, 
                             "client_id": PAYPAL_CLIENT_ID,
                             "client_secret": PAYPAL_CLIENT_SECRET})



        payment = paypal.Payment({
            "intent":  "sale",


            "payer":  {
                 "payment_method":  "paypal" },


            "redirect_urls": {
                 "return_url": "http://127.0.0.1:8000/ty",
                  "cancel_url": "http://127.0.0.1:8000/" },


            "transactions":  [ {

                 "item_list": {
                      "items": [{
                                 "name": "membership",
                                 "price": "2.00",
                                 "currency": "GBP",
                                 "quantity": 1 }]},


                      "amount":  {
                            "total":  "2.00",
                             "currency":  "GBP" },
                             "description":  "One of membership fee." } ] } )

        redirect_url = ""

        if payment.create():
            print("Payment[%s] created successfully"%(payment.id))

            for link in payment.links:
                if link.method == "REDIRECT":
                    redirect_url = link.href
            print("Redirect for approval: %s"%(redirect_url))
            return self.redirect(redirect_url)

        else:
            print("Error while creating payment.")
            print(payment.error)


        response = payment.to_dict()
        print response
        payment = paypal.Payment.find(payment.id)

        if payment.execute({"payer_id": response['payer_id']}):              
            print ("Payment executed successfully")
        else:
            print(payment.error) # Error Hash

        print payment.to_dict()

        print userData

所以在https://devtools-paypal.com/guide/pay_paypal/python?success=true&token=EC-8JL96732FP068791F&PayerID=QQGSRNHDACTLJ 的示例中。步骤 5 未发生且 PayPal 未发送响应?

【问题讨论】:

    标签: python paypal tornado paypal-sandbox


    【解决方案1】:

    这是来自 PayPal 的 Avi。我对 Tornado 不是很熟悉,但是在您的代码中出现 return self.redirect(redirect_url) 行之后,并将用户返回到 return_url,在 payment.execute({"payer_id": response['payer_id']}) 中,您是否正确获取了 payer_id? Payer_id 作为http://<return_url>?token=EC-60U79048BN7719609&PayerID=7E7MGXCWTTKK2 格式的参数之一附加到return_url 返回。还有,你执行payment = paypal.Payment.find(payment.id)后的付款状态如何。我的另一个建议是查看print payment.error 是否打印出有用的调试消息和 debug_id,paypal 商家技术服务可以使用它来查看问题。

    【讨论】:

    • 嗨,Avi,感谢您回来。我上面的代码可以获取返回 url:200 GET /ty?token=EC-94017452W19149239&PayerID=QQGSRNHDACTLJ。之后似乎没有任何代码被执行。我在 `payment = paypal.Payment.find(payment.id). But no statement is printed. But I do get redirected to the return_url' 定义后输入了print paypal.Payment.error
    • 所以如果你打印 response['payer_id'] ,那会为你正确打印 QQGSRNHDACTLJ 吗?如果确实如此,我的调试建议是 get an access token 然后通过 curl 调用 execute payment 检查发生了什么。
    【解决方案2】:

    您需要支付成功时 papypal 重定向的其他 URL,您将在其中收到令牌和 PayerID。在那个GET方法中,可以放这部分代码(伪代码):

     payerid_param = request.get('PayerID')
     payment = paypal.Payment.find(db_payment.id)
    
     if payment.execute({"payer_id": payerid_param}):              
        print ("Payment executed successfully")
     else:
        print(payment.error) # Error Hash
    

    您需要在两次通话之间保存 payment_id。

    【讨论】:

      【解决方案3】:

      你为什么使用

      return self.redirect(redirect_url)
      

      我认为你可以只使用

      self.redirect(redirect_url)
      

      我从未在 Tornado 处理程序中看到 return 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-03
        • 1970-01-01
        相关资源
        最近更新 更多