kavo

微信小程序之支付后调用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();
    }



posted on   下雨天唱情歌  阅读(5)  评论(0编辑  收藏  举报  

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示