?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]);
}
}