【问题标题】:PHP Paypal MALFORMED_REQUEST_JSON although JSON seems to be well formattedPHP Paypal MALFORMED_REQUEST_JSON 虽然 JSON 似乎格式正确
【发布时间】:2022-01-17 10:48:53
【问题描述】:

我尝试在网站上实施贝宝快速结帐流程。

用户必须在使用 paypal 登录并选择付款方式后才能调整订单。

为此,我使用贝宝创建订单,意图为“AUTHORIZE”,用户操作为“CONTINUE”。它被创建,用户被送回我们的网站,我可以使用创建的(订单)ID 获取订单和付款人信息。

但是,当付款人完成检查和调整一些最终参数并单击“立即购买”按钮时,我想发送此处引用的更新订单调用: https://developer.paypal.com/api/orders/v2/#orders_patch

我创建有效负载的方式与创建订单的方式完全相同,但这次的意图是“CAPTURE”和 user_action="PAY_NOW"。我将它修补到正确的路径,但我不断收到失败消息 "MALFORMED_REQUEST_JSON" 。

然而,JSON 本身是一个有效的 JSON,在创建过程中不会抛出任何错误。这是一个示例:

{
    "intent": "CAPTURE",
    "application_context": {
        "landing_page": "NO_PREFERENCE",
        "shipping_preference": "SET_PROVIDED_ADDRESS",
        "user_action": "PAY_NOW"
    },
    "purchase_units": [{
        "reference_id": "2289256",
        "description": "Your order at site",
        "custom_id": "order id 2289256",
        "soft_descriptor": "site name",
        "invoice_id": "2289256",
        "amount": {
            "currency_code": "EUR",
            "value": 59.98,
            "breakdown": {
                "item_total": {
                    "currency_code": "EUR",
                    "value": 50.41
                },
                "shipping": {
                    "currency_code": "EUR",
                    "value": 0
                },
                "discount": {
                    "currency_code": "EUR",
                    "value": 0
                },
                "tax_total": {
                    "currency_code": "EUR",
                    "value": 9.57
                }
            }
        },
        "items": [{
            "name": "Product 1",
            "description": "Product 1 Description",
            "sku": "1019879",
            "unit_amount": {
                "currency_code": "EUR",
                "value": 16.8
            },
            "tax": {
                "currency_code": "EUR",
                "value": 3.19
            },
            "quantity": "1",
            "category": "PHYSICAL_GOODS"
        }, {
            "name": "Product 2",
            "description": "Product 2 Description",
            "sku": "1024593",
            "unit_amount": {
                "currency_code": "EUR",
                "value": 33.61
            },
            "tax": {
                "currency_code": "EUR",
                "value": 6.38
            },
            "quantity": "1",
            "category": "PHYSICAL_GOODS"
        }],
        "shipping": {
            "name": {
                "full_name": "John Doe"
            },
            "address": {
                "address_line_1": "Badensche Str. 24",
                "address_line_2": "",
                "admin_area_2": "Berlin(Berlin)",
                "postal_code": "10715",
                "country_code": "DE"
            }
        }
    }]
}

这是贝宝的回复

{
    name: "INVALID_REQUEST",
    message: "Request is not well-formed, syntactically incorrect, or violates schema.",
    debug_id: "c315ce9eb90b4",
    details: [{
        field: "/",
        location: "body",
        issue: "MALFORMED_REQUEST_JSON",
        description: "The request JSON is not well formed.",
    }],
    links: [{
        href: "https://developer.paypal.com/docs/api/orders/v2/#error-MALFORMED_REQUEST_JSON",
        rel: "information_link",
        encType: "application/json",
    }],
}

我只是无法找出问题所在。我试图删除整个 application_context、purchase_units、intent 并查看这些参数中是否存在问题。没有改变。这个调用到底有什么问题?

【问题讨论】:

    标签: php json paypal


    【解决方案1】:

    补丁操作不是这样工作的。补丁操作的 JSON 负载必须类似于 API 参考中的示例:

    '[
      {
        "op": "replace",
        "path": "/purchase_units/@reference_id==\'default\'/shipping/address",
        "value": {
          "address_line_1": "123 Townsend St",
          "address_line_2": "Floor 6",
          "admin_area_2": "San Francisco",
          "admin_area_1": "CA",
          "postal_code": "94107",
          "country_code": "US"
        }
      }
    ]'
    

    但是,根据所提供的信息,不清楚您为什么要尝试使用 PATCH,因为您没有列出任何与补丁相关的字段。

    意图授权和意图捕获用于创建订单。使用一个或另一个,永远不要同时用于同一事务。要捕获使用意图捕获创建的订单,请使用捕获 API 调用。要授权使用意图授权创建的订单,请使用授权 API 调用。相关 API 端点将在您创建订单时出现在 API 响应中,或者您可以阅读文档。

    由于您的预期结果似乎是捕获的付款(而不是授权),因此意图授权与您的用例无关。

    【讨论】:

    • 哦,好的。谢谢你。关于“PATCH”的整个事情对我来说都是新的。由于参数列表还包括“意图”,我认为这最终会再次发送带有调整的订单有效负载......您是否知道一个更详细的示例来修补整个订单(还有位置和值?)路径可以是只是 ""/purchase_units/@reference_id=='default'/" 然后像上面一样使用整个身体?
    猜你喜欢
    • 2014-01-25
    • 2013-09-23
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2020-10-08
    • 2015-12-02
    相关资源
    最近更新 更多