【问题标题】:PayPal REST API: how to do an immediate payment and without asking for shipping addressPayPal REST API:如何在不询问收货地址的情况下立即付款
【发布时间】:2014-08-19 21:52:33
【问题描述】:

我正在尝试使用 PayPal REST API 而不是 PayPal Classic API,但似乎 REST API 缺少 Classic API 所具有的两个功能:

  1. 立即付款:当用户进入 PayPal 页面时,向他显示“立即付款”按钮而不是“继续”按钮和“您快完成了。您将在...确认您的付款”短语。李>
  2. 没有送货地址:避免在 PayPal 页面上要求用户确认他的送货地址(如果我没记错的话,在 Classic API 中使用 NOSHIPPING=1 参数完成)

所以我的问题是:是否可以在不使用 REST API 询问送货地址的情况下立即付款?我必须回到 Classic API 吗?

我在这里提供了一些关于我如何使用 PayPal REST API 的更多信息。 我正在使用 PayPal REST Java SDK。 这是一个示例请求:

{
  "intent": "sale",
  "payer": {
    "payment_method": "paypal"
  },
  "transactions": [
    {
      "amount": {
        "currency": "USD",
        "total": "5",
        "details": {
          "subtotal": "5"
        }
      },
      "description": "This is the payment transaction description.",
      "item_list": {
        "items": [
          {
            "quantity": "1",
            "name": "Item 1",
            "price": "5",
            "currency": "USD"
          }
        ]
      }
    }
  ],
  "redirect_urls": {
    "return_url": "http://XXX/handlePayment.jsp?guid\u003dXXX",
    "cancel_url": "http://XXX/cancelPayment.jsp?guid\u003dXXX"
  }
}

及其回应:

{
    "id": "XXX",
    "create_time": "2014-06-29T08:52:55Z",
    "update_time": "2014-06-29T08:52:55Z",
    "state": "created",
    "intent": "sale",
    "payer": {
        "payment_method": "paypal",
        "payer_info": {
            "shipping_address": {}
        }
    },
    "transactions": [
        {
            "amount": {
                "total": "5.00",
                "currency": "USD",
                "details": {
                    "subtotal": "5.00"
                }
            },
            "description": "This is the payment transaction description.",
            "item_list": {
                "items": [
                    {
                        "name": "Item 1",
                        "price": "5.00",
                        "currency": "USD",
                        "quantity": "1"
                    }
                ]
            }
        }
    ],
    "links": [
        {
            "href": "https://api.sandbox.paypal.com/v1/payments/payment/XXX",
            "rel": "self",
            "method": "GET"
        },
        {
            "href": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=XXX",
            "rel": "approval_url",
            "method": "REDIRECT"
        },
        {
            "href": "https://api.sandbox.paypal.com/v1/payments/payment/XXX/execute",
            "rel": "execute",
            "method": "POST"
        }
    ]
}

【问题讨论】:

    标签: paypal paypal-rest-sdk


    【解决方案1】:

    在研究 REST API 时,我遇到了 this

    我相信这意味着您不必像这样创建任何“个人资料”,只需将它们与付款电话一起传递...

    根据要求提供进一步的解释:)

    以下是使用客户端 JS 方法进行快速结帐传递 PayPal 体验参数以及特定付款调用的示例。

            payment: function(data, actions) {
            return actions.payment.create({
                payment: {
                    transactions: [
                        {
                            amount: { total: '1.00', currency: 'USD' }
                        }
                    ]
                },
    
                experience: {
                    input_fields: {
                        no_shipping: 1
                    }
                }
            });
        },
    

    希望这对你们来说足够有意义! :)

    【讨论】:

    • 未来用户可能无法使用外部链接。请在您的回答中解释您的发现。
    • 不错的一个!添加这些行实际上会删除送货地址,您根本不需要做任何其他事情。这应该被标记为解决方案
    【解决方案2】:

    不幸的是,REST API 在其提供的功能方面仍然落后于经典 API。您提到的这些功能是我见过的很多东西,据我所知,REST 服务还没有这些功能。

    我个人一直坚持使用 Classic,因为它们提供了一切,我真的认为自己使用 REST 没有任何优势。如果您碰巧在使用 PHP(我总是这样做),您可能会对我的 class library for PayPal 感兴趣。它使所有 Classic API 调用对您来说都非常快速和轻松,它是 available on Packagist,因此您可以轻松地与 Composer 一起使用。

    【讨论】:

    • 谢谢 Andrew,恐怕你说得对:PayPal REST API 远远落后于 Classic API。我找到了一种强制立即付款的棘手方法,它似乎正在工作:将“&useraction=commit”附加到approval_url 没有送货仍然是一个悬而未决的问题,如此处所述:github.com/paypal/rest-api-sdk-python/wiki/… 可悲的是,PayPal 做了我浪费时间,因为 afaik 他们没有明确说明 paypal rest 不像 paypal 经典那样完整(除了前面提到的链接不容易找到)
    • 是的,这可能令人沮丧。他们必须发布类似的东西才能与 Stripe 竞争,如果他们试图确保它完全赶上 Classic,后者继续获得更新和改进,它可能永远不会发布。不过,再一次,您切换到经典版不会花很长时间,然后您以后就不会遇到这些问题了。
    【解决方案3】:

    REST API 现在支持使用Payment Experience APIs 不发货。

    您需要创建一个网络体验配置文件并提供 no_shipping 作为输入字段。然后在创建付款时使用个人资料 ID。

    配置文件 ID 不需要每次都重新创建。

    【讨论】:

    • 如果管理控制台有一些 UI 来设置这些配置文件以简化开发,那就太好了...
    • 两年后管理控制台仍然没有用户界面来设置这些配置文件
    【解决方案4】:

    感谢这篇文章有一段时间没有任何活动,但是......

    我遇到了完全相同的问题,并使用这篇文章作为我自己问题的起点:

    paypal api: take immediate payment without a shipping address

    它经过了一些试验和错误,但我可以创建一个一次性的网络配置文件,将“no_shipping”设置为 1,存储它创建的 ID,然后将其传递给不需要运输的未来付款地址。

    仍然没有弄清楚如何摆脱'你快完成了。您将在 xxx 确认您的付款。但我的付款流程比以前好多了!

    希望这对那里的人有所帮助,因为很多人似乎都在使用 paypal api 来解决这个不发货问题...

    【讨论】:

      【解决方案5】:

      我尝试使用 API 的体验部分,除了仍然无法强制使用区域设置代码之外,我还能够禁用发货并直接进行结算:

      payment: {
          transactions: [{
              invoice_number: document.getElementById("ReqTxt").value,
              amount: {
                  total:  document.getElementById("InvoiceAmt").innerText,
                  currency: document.getElementById("Currency").innerText 
              }
          }]
      },
      experience: {
          input_fields: {
              no_shipping: 1
          },
          flow_config: {
              landing_page_type:'billing'
          }
      }
      

      you can also see this page。也可以在flow_config 部分设置用户操作

      【讨论】:

        【解决方案6】:

        对于 Paypal 上的“立即付款”而不是“继续”,我在批准网址中使用了一个特殊参数:

        $approvalUrl = $payment->getApprovalLink().'&useraction=commit';
        

        结果:

        https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=TOKEN&useraction=commit
        

        【讨论】:

          猜你喜欢
          • 2015-05-11
          • 2013-08-29
          • 2014-05-29
          • 2016-08-03
          • 2017-02-09
          • 2013-09-20
          • 2016-12-17
          • 2013-10-30
          • 2013-06-05
          相关资源
          最近更新 更多