douzhi2017 2013-10-14 18:01
浏览 17

cakephp和Webhooks

Im new to cakephp and have implemented the Webshop Solution Snipcart. When an order is processed by snipcart they send a webhook to our site. The webhook looks like this according to their documentation:

    {
    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
      }
}

And the consume the webhooks looks like this:

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

My question is, how do I do this in CakePHP version 2.4. I've been looking for days now on the internet for a solution, but tho i'm inexperienced I can't find a proper solution.

Solved it:

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

    }
}
  • 写回答

1条回答 默认 最新

  • dsyct08008 2013-11-16 21:13
    关注

    the only thing I would add to your answer is a few more "cake" ways of doing some things.

    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;
    
        }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 Error in check.length("fill") : 'gpar'成分'fill'的长度不能为零
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导