2013-10-14 2 views
2

Im новый для cakephp и реализовал Snipcart решения для веб-магазина. Когда заказ обрабатывается snipcart, они отправляют webhook на наш сайт. Webhook выглядит следующим образом в соответствии с их документацией:cakephp and Webhooks

{ 
    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: "[email protected]", 
      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 
     } 
} 

И истреблю webhooks выглядит следующим образом:

<?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'); 

    } 
} 
+0

@CharlesOuellet, это не так, как работает переполнение стека. Если вы собираетесь участвовать в сообществе, отправьте свой ответ здесь, а не по электронной почте. – Charles

ответ

4

единственное, что я хотел бы добавить к вашему ответу является несколько более «пирога» способы делать некоторые вещи.

public function webhooks(){ 

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

if (empty($json) or empty($json['eventName'])) { 
    throw new BadRequestException('Invalid JSON Information'); 
} 
//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']; 

    $shop = $this->Shop->find('first', array(
     'conditions' => array(
       'Shop.id' => $id, 
     ), 
     'fields' => array(
       'Shop.stock', 
     ), 
    )); 
    if (empty($shop)) { 
     throw new NotFoundException(__('Invalid Shop Content')); 
    } 
    $stock = $shop['Shop']['stock']; 

    $stock = $stock - $quantity; 
$this->Shop->id = $id; 
$this->Shop->saveField('stock', $stock); 
break; 

    }