微信小程序之支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單方法
更新時間:2018年01月02日 14:03:44 作者:myarche
下面小編就為大家分享一篇微信小程序之支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單方法,具有很好的參考價值,希望對大家有所幫助
小程序之后的異步驗(yàn)證和訂單處理
<?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
{
//判斷訂單狀態(tài)
//在這里可以進(jìn)行對數(shù)據(jù)庫進(jìn)行所機(jī)制
//簡單說,當(dāng)一個執(zhí)行sql語句的事務(wù)想要操作表記錄之前,先向數(shù)據(jù)庫發(fā)出請求,對你訪問的記錄集加鎖
//在這個事務(wù)釋放這個鎖之前,其他事務(wù)不能對這些數(shù)據(jù)進(jìn)行更新操作
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);
//如果庫存量有,更新訂單狀態(tài),以及減去商品庫存
if ($stockStatus['pass']) {
$this->updateOrderStatus($order->id, true);
$this->reduceStock($stockStatus);
//如果沒有庫存,訂單狀態(tài)修改為已支付,但訂單未處理
} else {
$this->updateOrderStatus($order->id, false);
}
}
Db::commit();
//返回給微信
return true;
}catch (Exception $e){
Db::rollback();
return fasle;
}
}else{
//如果微信返回失敗的處理信息,那我們這里依然返回true,向微信表明態(tài)度
return true;
}
}
//支付成功,減去商品庫存
private function reduceStock($stockStatus)
{
//遍歷減去
foreach ($stockStatus['pStatusArray'] as $v) {
//使用tp5的setDec方法
Product::where(['id'=>$v['id']])->setDec('stock',$v['count']);
}
}
//success為真,則訂單修改為PAID,如果為假則修改為已支付,但訂單未處理的狀態(tài),對應(yīng)枚舉信息修改
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狀態(tài)
//3:減庫存
//如果成功處理,返回成功處理信息,否則返回沒有成功處理信息
$notify = new WxNotify();
$notify->handle();
}
以上這篇微信小程序之支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 微信小程序中使用Async-await方法異步請求變?yōu)橥秸埱蠓椒?/a>
- 詳解將微信小程序接口Promise化并使用async函數(shù)
- 微信小程序 緩存(本地緩存、異步緩存、同步緩存)詳解
- 詳解微信小程序 同步異步解決辦法
- 微信小程序異步處理詳解
- 微信小程序 wx.request方法的異步封裝實(shí)例詳解
- 微信小程序onLaunch異步,首頁onLoad先執(zhí)行?
- 微信小程序中使用ECharts 異步加載數(shù)據(jù)的方法
- 微信小程序中使用Promise進(jìn)行異步流程處理的實(shí)例詳解
- 微信小程序 es6-promise.js封裝請求與處理異步進(jìn)程
- 微信小程序利用co處理異步流程的方法教程
- 微信小程序中使用 async/await的方法實(shí)例分析
相關(guān)文章
Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法
這篇文章主要介紹了Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
php視頻拍照上傳頭像功能實(shí)現(xiàn)代碼分享
現(xiàn)在手機(jī)拍照很火,那么如何使用手機(jī)拍照并上傳頭像呢?原因很簡單,就是數(shù)據(jù)傳遞,首先手機(jī)傳遞照片信息,既不是post傳遞也不是get函數(shù)傳遞,這個另外一種數(shù)據(jù)格式傳遞,使用的是$GLOBALS ['HTTP_RAW_POST_DATA'],需要的朋友可以參考下2015-10-10
ThinkPHP3.2.3實(shí)現(xiàn)分頁的方法詳解
這篇文章主要介紹了ThinkPHP3.2.3實(shí)現(xiàn)分頁的方法,詳細(xì)分析了thinkPHP3.2.3分頁操作的相關(guān)技巧,包括分頁類的引用、數(shù)據(jù)庫查詢操作、分頁參數(shù)設(shè)置及前端視圖界面設(shè)計等,需要的朋友可以參考下2016-06-06
PHP中使用register_shutdown_function函數(shù)截獲fatal error示例
這篇文章主要介紹了PHP中使用register_shutdown_function函數(shù)截獲fatal error示例,需要的朋友可以參考下2015-04-04
解決php用mysql方式連接數(shù)據(jù)庫出現(xiàn)Deprecated報錯問題
這篇文章主要介紹了php用mysql方式連接數(shù)據(jù)庫出現(xiàn)Deprecated報錯,需要的朋友可以參考下2019-12-12

