2

Cakephp は初めてで、Webshop Solution Snipcart を実装しました。注文が snipcart によって処理されると、サイトに Webhook が送信されます。ドキュメントによると、Webhook は次のようになります。

    {
    eventName: "order:completed",
      mode: "Live",
      createdOn: "2013-07-04T04:18:44.5538768Z",
      content: {
          token: "22808196-0eff-4a6e-b136-3e4d628b3cf5",
          creationDate: "2013-07-03T19:08:28.993Z",
          modificationDate: "2013-07-04T04:18:42.73Z",
          status: "Processed",
          paymentMethod: "CreditCard",
          email: "customer@snipcart.com",
          cardHolderName: "Nicolas Cage",
          billingAddressName: "Nicolas Cage",
          billingAddressCompanyName: "Company name",
          billingAddressAddress1: "888 The street",
          billingAddressAddress2: "",
          billingAddressCity: "Québec",
          billingAddressCountry: "CA",
          billingAddressProvince: "QC",
          billingAddressPostalCode: "G1G 1G1",
          billingAddressPhone: "(888) 888-8888",
          shippingAddressName: "Nicolas Cage",
          shippingAddressCompanyName: "Company name",
          shippingAddressAddress1: "888 The street",
          shippingAddressAddress2: "",
          shippingAddressCity: "Québec",
          shippingAddressCountry: "CA",
          shippingAddressProvince: "QC",
          shippingAddressPostalCode: "G1G 1G1",
          shippingAddressPhone: "(888) 888-8888",
          shippingAddressSameAsBilling: true,
          finalGrandTotal: 310.00,
          shippingAddressComplete: true,
          creditCardLast4Digits: "4242",
          shippingFees: 10.00,
          shippingMethod: "Livraison",
          items: [{
              uniqueId: "eb4c9dae-e725-4dad-b7ae-a5e48097c831",
              token: "22808196-0eff-4a6e-b136-3e4d628b3cf5",
              id: "1",
              name: "Movie",
              price: 300.00,
              originalPrice: 300.00,
              quantity: 1,
              url: "https://snipcart.com",
              weight: 10.00,
              description: "Something",
              image: "http://placecage.com/50/50",
              customFieldsJson: "[]",
              stackable: true,
              maxQuantity: null,
              totalPrice: 300.0000,
              totalWeight: 10.00
          }],
          subtotal: 610.0000,
          totalWeight: 20.00,
          hasPromocode: false,
          promocodes: [],
          willBePaidLater: false
      }
}

Webhook の消費は次のようになります。

    <?php

$json = file_get_contents('php://input');
$body = json_decode($json, true);

if (is_null($body) or !isset($body['eventName'])) {
    // When something goes wrong, return an invalid status code
    // such as 400 BadRequest.
    header('HTTP/1.1 400 Bad Request');
    return;
}

switch ($body['eventName']) {
    case 'order:completed':
        // This is an order:completed event
        // do what needs to be done here.
        break;
}

// Return a valid status code such as 200 OK.
header('HTTP/1.1 200 OK');

私の質問は、CakePHP バージョン 2.4 でこれを行うにはどうすればよいかということです。インターネットで解決策を探していましたが、経験が浅いため、適切な解決策が見つかりません。

それを解決しました:

  public function webhooks(){

  //check if POST
  if ($this->request->is('post')) {
  //Allow raw POST's
  $url = 'php://input';
  //decode
  $json = json_decode(file_get_contents($url), true);

  if (is_null($json) or !isset($json['eventName'])) {
    // When something goes wrong, return an invalid status code
    // such as 400 BadRequest.
    header('HTTP/1.1 400 Bad Request');
    return;
}
  //do whatever needs to be done, in this case remove the quantity ordered from the stock in db.
    switch ($json['eventName']) {
    case 'order:completed':

        $id = $json['content']['items'][0]['id']; 
        $quantity = $json['content']['items'][0]['quantity']; 

        $query = $this->Shop->findById($id, 'Shop.stock');

        $stock = $query['Shop']['stock'];

        $stock = $stock - $quantity;

    $this->Shop->updateAll(array('Shop.stock' => $stock), array('Shop.id' => $id));

    break;

        }

        header('HTTP/1.1 200 OK');

    }
}
4

1 に答える 1