微信小程式之支付後調用SDK的非同步通知及驗證處理訂單方法的詳解

來源:互聯網
上載者:User
下面小編就為大家分享一篇小程式之支付後調用SDK的非同步通知及驗證處理訂單方法,具有很好的參考價值,希望對大家有所協助

小程式之後的非同步驗證和訂單處理

<?php/** * Created by YuanPan. * User: YuanPan * Date: 2017/12/21 * Time: 15:15 */namespace app\api\service;use app\api\model\Product;use app\lib\enum\OrderStatusEnum;use think\Db;use think\Exception;use think\Loader;use app\api\model\Order;//在這裡依然引入WxPay.API.php即可完成引入Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php');class WxNotify extends \WxPayNotify{  //繼承了父類,所以直接重寫方法  public function NotifyProcess($data, &$msg)  {    //如果返回支付成功資訊    if($data['return_code'] = 'SUCCESS'){      $orderNo = $data['out_trade_no'];      Db::startTrans();      try      {        //判斷訂單狀態        //在這裡可以進行對資料庫進行所機制        //簡單說,當一個執行sql語句的事務想要動作表記錄之前,先向資料庫發出請求,對你訪問的記錄集加鎖        //在這個事務釋放這個鎖之前,其他事務不能對這些資料進行更新操作        Order::where(['order_no'=>$orderNo])->lock(true)->find();//        $order = Order::get(['order_no'=>$orderNo]);        //如果未支付        if ($order->status == 1) {          $service = new \app\api\service\Order();          //查詢到該訂單號的商品和庫存量資訊          $stockStatus = $service->checkOrderStock($order->id);          //如果庫存量有,更新訂單狀態,以及減去商品庫存          if ($stockStatus['pass']) {            $this->updateOrderStatus($order->id, true);            $this->reduceStock($stockStatus);            //如果沒有庫存,訂單狀態修改為已支付,但訂單未處理          } else {            $this->updateOrderStatus($order->id, false);          }        }        Db::commit();        //返回給        return true;      }catch (Exception $e){        Db::rollback();        return fasle;      }    }else{      //如果返回失敗的處理資訊,那我們這裡依然返回true,向表明態度      return true;    }  }  //支付成功,減去商品庫存  private function reduceStock($stockStatus)  {    //遍曆減去    foreach ($stockStatus['pStatusArray'] as $v) {      //使用tp5的setDec方法      Product::where(['id'=>$v['id']])->setDec('stock',$v['count']);    }  }  //success為真,則訂單修改為PAID,如果為假則修改為已支付,但訂單未處理的狀態,對應枚舉資訊修改  private function updateOrderStatus($orderID,$success)  {    $status = $success?OrderStatusEnum::PAID:OrderStatusEnum::PAID_BUT_OUT_OF;    Order::where(['id'=>$orderID])->update(['status'=>$status]);  }}

控制器中如下:

  public function receiveNotify()  {    //1:檢查庫存量防止超賣    //2:更新status狀態    //3:減庫存    //如果成功處理,返回成功處理資訊,否則返回沒有成功處理資訊    $notify = new WxNotify();    $notify->handle();  }

以上這篇小程式之支付後調用SDK的非同步通知及驗證處理訂單方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援php中文網。

您可能感興趣的文章:

PHP 使用Echarts產生資料統計報表的實現

PHP根據手機號判斷電訊廠商

Laravel5.2使用Captcha產生驗證碼實現登入

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.