下面小编就为大家分享一篇微信小程序之支付后调用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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:微信小程序之支付后调用SDK的异步通知及验证处理订单方法
基础教程推荐
猜你喜欢
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- PHP中的错误及其处理机制 2023-06-04
- PHP命名空间简单用法示例 2022-12-01
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- 使用PHP开发留言板功能 2023-03-13
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- php array分组,PHP中array数组的分组排序 2022-08-01
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02