无法使用 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。
流程是这样的:
系统将根据ClientID
和ClientSecret
获得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 <Access-Token>
标头的浏览器中加载它会产生AUTHENTICATION_FAILURE。
目前沙盒中存在未确认电子邮件的错误,因此请确保您的沙盒电子邮件are confirmed
【讨论】:
这是您分享的非常重要的信息@preston-phx,它帮助我解决了我的问题。但是我想分享几点(1)创建草稿发票的端点不会发送完整的发票对象 - 成功。 (2) 端点返回发票 URL,我们必须发送另一个 GET curl 请求来显示发票端点(从发票 URL 中提取发票 ID)以获取完整的发票对象。以上是关于无法使用 v2 API 版本创建草稿 PayPal 发票的主要内容,如果未能解决你的问题,请参考以下文章