小程序之后的异步验证和订单处理
<?php
/**
* created by yuanpan.
* user: yuanpan
* date: 2017/12/21
* time: 15:15
*/
namespace appapiservice;
use appapimodelproduct;
use applibenumorderstatusenum;
use thinkdb;
use thinkexception;
use thinkloader;
use appapimodelorder;
//在这里依然引入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 appapiserviceorder();
//查询到该订单号的商品和库存量信息
$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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持硕编程。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!