Square Connect - 当字段作为数组发送时出现 OrdersApi 错误 EXPECTED_ARRAY

Square Connect - OrdersApi Error EXPECTED_ARRAY when field was sent as an array

我一直在使用 square-connect api,但我在尝试创建订单时遇到了问题。我有 followed the docs 用于创建订单。下面是有问题的代码。

$api = new \SquareConnect\Api\OrdersApi();
    $location = $this->get_location();
    if (!empty($items)) {
        if (is_string($items)) {
            $items = json_decode($items);
        }
        // print_r($items);
        if (!is_array($items)) {
            // echo "Items is not an array -- exiting now";
            return false;
        }
        $order_data = [];
        $order_data['idempotency_key'] = uniqid();
        $order_data['line_items'] = [];
        foreach ($items as $key => $li) {
            $order_data['line_items'][] = [
                'name' => $li->name,
                'base_price_money' => ['amount' => ($li->price * 100)],
                'quantity' => $li->qty
            ];
        }
        $order_data['taxes'] = [
            'type' => 'ADDITIVE',
            'name' => 'State Sales Tax',
            'percentage' => '7'
        ];
        print_r($order_data);
        // exit;
        $apiResponse = $api->createOrder($location, new  \SquareConnect\Model\CreateOrderRequest($order_data));
        $order = $apiResponse->getOrder();
        print_r($apiResponse);
        print_r($order);
    } 

当我发出请求时,出现以下错误

Message: [HTTP/1.1 400 Bad Request] {"errors":[{"category":"INVALID_REQUEST_ERROR","code":"EXPECTED_ARRAY","detail":"Expected an array.","field":"taxes"}]}

我检查过 taxes 字段是一个数组

["taxes"]=>
  array(3) {
    ["type"]=>
    string(8) "ADDITIVE"
    ["name"]=>
    string(15) "State Sales Tax"
    ["percentage"]=>
    string(1) "7"
  }

如有任何帮助,我们将不胜感激

编辑:print_r($items) 输出

Array
(
    [0] => stdClass Object
        (
            [id] => 24
            [square_id] => L7PCKMIEDQFDR34IZ3E3VIDO
            [variation_id] => SUJCAPZJQLM7VGAILP66NMMM
            [variation_name] => Regular
            [qty] => 1
            [price] => 3.99
            [name] => Ham & Cheese
        )

    [1] => stdClass Object
        (
            [id] => 4
            [square_id] => 37RNDFXRVJPLR4UT7UXS5QOO
            [variation_id] => 27Z5H3V6ZRHW2X5LVNGXOARY
            [variation_name] => Starbucks DOUBLESHOT Expresso
            [qty] => 1
            [price] => 2.5
            [name] => Starbucks DOUBLESHOT Expresso
        )

)

var_dump(order_data)...

array(3) {
  ["idempotency_key"]=>
  string(13) "59c138b7a67e2"
  ["line_items"]=>
  array(2) {
    [0]=>
    array(3) {
      ["name"]=>
      string(12) "Ham & Cheese"
      ["base_price_money"]=>
      array(1) {
        ["amount"]=>
        float(399)
      }
      ["quantity"]=>
      string(1) "1"
    }
    [1]=>
    array(3) {
      ["name"]=>
      string(29) "Starbucks DOUBLESHOT Expresso"
      ["base_price_money"]=>
      array(1) {
        ["amount"]=>
        float(250)
      }
      ["quantity"]=>
      string(1) "1"
    }
  }
  ["taxes"]=>
  array(3) {
    ["type"]=>
    string(8) "ADDITIVE"
    ["name"]=>
    string(15) "State Sales Tax"
    ["percentage"]=>
    string(1) "7"
  }
}

这里的问题是您需要提供一个税对象数组,这很令人困惑,因为您使用的是带有 PHP 数组的 SDK 的隐式对象创建功能。在 JSON,您的税金如下:

"taxes":[
  {
    "type":"additive"
    ...
  }
]

(注意这是一个对象数组),您提供:

"taxes":{
  "type":"additive"
  ...
}

因此,如果您只想快速更改代码,您应该这样做:

    $order_data['taxes'] =array(array(
        'type' => 'ADDITIVE',
        'name' => 'State Sales Tax',
        'percentage' => '7'
    ));

如果你想在你的代码中更加冗长,你可以这样做:

$order_data = new \SquareConnect\Model\CreateOrderRequest();
$taxes = \SquareConnect\Model\CreateOrderRequestTax();
$taxes->setType('ADDITIVE');
...
$order_data->setTaxes($taxes);

显然隐式数组方式更简单一些,但在 PHP 中可能会造成混淆。有帮助吗?