>백엔드 개발 >PHP 튜토리얼 >WeChat 애플릿에서 결제 후 SDK를 호출하는 비동기 알림 및 검증 처리 방법에 대한 자세한 설명

WeChat 애플릿에서 결제 후 SDK를 호출하는 비동기 알림 및 검증 처리 방법에 대한 자세한 설명

jacklove
jacklove원래의
2018-07-03 18:00:083220검색

아래 편집자가 WeChat 애플릿에서 결제 후 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(&#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]);
  }
}

컨트롤러는 다음과 같습니다.

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

위 WeChat 애플릿은 SDK의 비동기 알림 및 검증 방법을 호출하여 이후 주문을 처리합니다. 지불은 편집자에 의해 이루어집니다. 모든 내용을 귀하와 공유했습니다. 이것이 귀하에게 참고가 되기를 바랍니다. 또한 PHP 중국어 웹사이트를 지원해 주시기를 바랍니다.

당신이 관심을 가질 만한 기사:

Echarts를 사용하여 통계 보고서를 생성하는 PHP 구현

PHP는 휴대폰 번호를 기반으로 운영자를 결정합니다.

Laravel5.2는 Captcha를 사용하여 생성합니다. 로그인을 위한 인증 코드

위 내용은 WeChat 애플릿에서 결제 후 SDK를 호출하는 비동기 알림 및 검증 처리 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.