Maison >Applet WeChat >Développement de mini-programmes >Méthode de notification asynchrone et d'ordre de vérification pour appeler le SDK après le paiement dans l'applet WeChat

Méthode de notification asynchrone et d'ordre de vérification pour appeler le SDK après le paiement dans l'applet WeChat

不言
不言original
2018-06-27 11:58:062550parcourir

Ce qui suit est une applet WeChat qui utilise la méthode de notification et de vérification asynchrone du SDK pour traiter les commandes après le paiement. Elle a une bonne valeur de référence et j'espère qu'elle sera utile à tout le monde

Vérification asynchrone et traitement des commandes après l'applet

<?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(&#39;WxPay.WxPay&#39;,EXTEND_PATH,&#39;.Api.php&#39;);

class WxNotify extends \WxPayNotify
{
  //继承了父类,所以直接重写方法
  public function NotifyProcess($data, &$msg)
  {
    //如果返回支付成功信息
    if($data[&#39;return_code&#39;] = &#39;SUCCESS&#39;){
      $orderNo = $data[&#39;out_trade_no&#39;];
      Db::startTrans();
      try
      {
        //判断订单状态
        //在这里可以进行对数据库进行所机制
        //简单说,当一个执行sql语句的事务想要操作表记录之前,先向数据库发出请求,对你访问的记录集加锁
        //在这个事务释放这个锁之前,其他事务不能对这些数据进行更新操作
        Order::where([&#39;order_no&#39;=>$orderNo])->lock(true)->find();
//        $order = Order::get([&#39;order_no&#39;=>$orderNo]);
        //如果未支付
        if ($order->status == 1) {
          $service = new \app\api\service\Order();
          //查询到该订单号的商品和库存量信息
          $stockStatus = $service->checkOrderStock($order->id);
          //如果库存量有,更新订单状态,以及减去商品库存
          if ($stockStatus[&#39;pass&#39;]) {
            $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[&#39;pStatusArray&#39;] as $v) {
      //使用tp5的setDec方法
      Product::where([&#39;id&#39;=>$v[&#39;id&#39;]])->setDec(&#39;stock&#39;,$v[&#39;count&#39;]);
    }
  }

  //success为真,则订单修改为PAID,如果为假则修改为已支付,但订单未处理的状态,对应枚举信息修改
  private function updateOrderStatus($orderID,$success)
  {
    $status = $success?OrderStatusEnum::PAID:OrderStatusEnum::PAID_BUT_OUT_OF;
    Order::where([&#39;id&#39;=>$orderID])->update([&#39;status&#39;=>$status]);
  }
}

Le contrôleur est le suivant :

  public function receiveNotify()
  {
    //1:检查库存量防止超卖
    //2:更新status状态
    //3:减库存
    //如果成功处理,返回成功处理信息,否则返回没有成功处理信息
    $notify = new WxNotify();
    $notify->handle();
  }

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Mise en œuvre de la fonction de panier d'achat dans le mini programme WeChat

Communication entre les pages dans le mini programme WeChat Méthode

Introduction à la définition de la réutilisation globale des données et des fonctions et des modèles dans les mini-programmes WeChat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn