微信小程序之支付后调用SDK的异步通知及验证处理订单方法
程序员文章站
2022-04-29 12:38:10
小程序之后的异步验证和订单处理
小程序之后的异步验证和订单处理
<?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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: js中的事件委托或是事件代理使用详解