无法使用 v2 API 版本创建草稿 PayPal 发票

Posted

技术标签:

【中文标题】无法使用 v2 API 版本创建草稿 PayPal 发票【英文标题】:Unable to create draft PayPal invoice using v2 API version 【发布时间】:2020-12-17 06:56:45 【问题描述】:

我正在我的 Ruby on Rails 应用程序中将 PayPal Invoicing 功能从 v1 升级到 v2(因为 v1 已弃用)。

由于没有支持 v2 发票的官方库/gem,所以我决定按照此处的官方文档构建所有内容:https://developer.paypal.com/docs/api/invoicing/v2。

流程是这样的:

    系统将根据ClientIDClientSecret 获得access-token

    从这个access-token,我将通过向https://api.sandbox.paypal.com/v2/invoicing/generate-next-invoice-number发送curl请求来生成一个新的invoice_number:https://api.sandbox.paypal.com/v2/invoicing/generate-next-invoice-number

    收到invoice_number 后,我将发送 curl 请求以创建包含所有必需数据的草稿发票端点

    curl -v -X POST https://api.sandbox.paypal.com/v2/invoicing/invoice
    

我面临的问题是最后一点。我收到来自创建草稿发票端点的201 created 响应,但端点没有返回完整的发票对象和发票 ID。

这是我得到的:

"201"
"rel"=>"self", "href"=>"https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-Z3K7-Y79X-36EM-ZQX8", "method"=>"GET"

如果您尝试打开此链接,您会看到:


  "name":"AUTHENTICATION_FAILURE",
  "message":"Authentication failed due to invalid authentication credentials or a missing Authorization header.",
  "links": [
    
      "href":"https://developer.paypal.com/docs/api/overview/#error",
      "rel":"information_link"
    
  ]

不确定我在这里缺少什么!

以下是参考代码:

require 'net/http'
require 'uri'
require 'json'

class PaypalInvoice
  def initialize order
    @order = order
    @client_id = ENV['PAYPAL_CLIENT_ID']
    @client_secret = ENV['PAYPAL_CLIENT_SECRET']
    @base_url = ENV['AD_PP_ENV'] == 'sandbox' ? 'https://api.sandbox.paypal.com' : 'https://api.paypal.com'
    @paypal_access_token_identifier = 'paypal_access_token'
    @request_id ||= SecureRandom.uuid
  end

  def create_draft_invoice
    raise "Paypal token not found" unless Rails.cache.exist?(@paypal_access_token_identifier)

    invoice_number = "#141"
    sleep 5
    try = 0

    uri = URI.parse(@base_url + "/v2/invoicing/invoices")
    request = Net::HTTP::Post.new(uri)
    request['X-PAYPAL-SANDBOX-EMAIL-ADDRESS'] = ENV['PAYPAL_CLIENT_EMAIL']
    request['Authorization'] = "Bearer #Rails.cache.fetch(@paypal_access_token_identifier)['access_token']"
    request['Content-Type'] = 'application/json'
    request['PayPal-Request-Id'] = @request_id.to_s

    request.body = JSON.dump(
      "detail" => get_detail(invoice_number),
      "invoicer" => get_invoicer,
      "primary_recipients" => get_primary_recipients,
      "items" => items_info,
      "configuration" => 
        "partial_payment" => 
          "allow_partial_payment" => false,
        ,
        "allow_tip" => false,
        "tax_calculated_after_discount" => true,
        "tax_inclusive" => true
      
    )

    req_options = 
      use_ssl: uri.scheme == "https",
    

    response = Net::HTTP.start(uri.host, uri.port, req_options) do |http|
      http.request(request)
    end

    p 'method: create_draft_invoice. response: '
    p response.code
    p JSON.parse(response.body)

    raise "Paypal token expired" if response.code.to_s == '401'

  rescue RuntimeError => error
    p "#error.to_s"
    try += 1
    access_token_response_status = get_new_access_token
    retry if access_token_response_status.to_s == '200' and try <= 1
  end
end

【问题讨论】:

【参考方案1】:

这个:

"rel"=>"self", "href"=>"https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-Z3K7-Y79X-36EM-ZQX8", "方法"=>"GET"

是 API 调用的端点,特别是“显示发票详细信息”:https://developer.paypal.com/docs/api/invoicing/v2/#invoices_get

在没有Authorization: Bearer &lt;Access-Token&gt; 标头的浏览器中加载它会产生AUTHENTICATION_FAILURE。


目前沙盒中存在未确认电子邮件的错误,因此请确保您的沙盒电子邮件are confirmed

【讨论】:

这是您分享的非常重要的信息@preston-phx,它帮助我解决了我的问题。但是我想分享几点(1)创建草稿发票的端点不会发送完整的发票对象 - 成功。 (2) 端点返回发票 URL,我们必须发送另一个 GET curl 请求来显示发票端点(从发票 URL 中提取发票 ID)以获取完整的发票对象。

以上是关于无法使用 v2 API 版本创建草稿 PayPal 发票的主要内容,如果未能解决你的问题,请参考以下文章

paypal api v2 - 每月订阅

无法使用 Paypal API 退款订单

用户批准后如何取消Paypal订单? (API v2)

贝宝 Rest API SDK v2

PayPal Orders v2 在传递金额折扣时创建返回 422(无法处理的实体)

通过 REST API 创建的发票导致 PayPal 后端出错