下面小編就為大家分享一篇小程式之支付後調用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產生驗證碼實現登入