溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信小程序中支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單的示例

發(fā)布時(shí)間:2021-01-30 12:29:28 來(lái)源:億速云 閱讀:216 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章主要介紹了微信小程序中支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單的示例,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

小程序之后的異步驗(yàn)證和訂單處理

<?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
{
  //繼承了父類,所以直接重寫(xiě)方法
  public function NotifyProcess($data, &$msg)
  {
    //如果返回支付成功信息
    if($data['return_code'] = 'SUCCESS'){
      $orderNo = $data['out_trade_no'];
      Db::startTrans();
      try
      {
        //判斷訂單狀態(tài)
        //在這里可以進(jìn)行對(duì)數(shù)據(jù)庫(kù)進(jìn)行所機(jī)制
        //簡(jiǎn)單說(shuō),當(dāng)一個(gè)執(zhí)行sql語(yǔ)句的事務(wù)想要操作表記錄之前,先向數(shù)據(jù)庫(kù)發(fā)出請(qǐng)求,對(duì)你訪問(wèn)的記錄集加鎖
        //在這個(gè)事務(wù)釋放這個(gè)鎖之前,其他事務(wù)不能對(duì)這些數(shù)據(jù)進(jìn)行更新操作
        Order::where(['order_no'=>$orderNo])->lock(true)->find();
//        $order = Order::get(['order_no'=>$orderNo]);
        //如果未支付
        if ($order->status == 1) {
          $service = new \app\api\service\Order();
          //查詢到該訂單號(hào)的商品和庫(kù)存量信息
          $stockStatus = $service->checkOrderStock($order->id);
          //如果庫(kù)存量有,更新訂單狀態(tài),以及減去商品庫(kù)存
          if ($stockStatus['pass']) {
            $this->updateOrderStatus($order->id, true);
            $this->reduceStock($stockStatus);
            //如果沒(méi)有庫(kù)存,訂單狀態(tài)修改為已支付,但訂單未處理
          } else {
            $this->updateOrderStatus($order->id, false);
          }
        }
        Db::commit();
        //返回給微信
        return true;
      }catch (Exception $e){
        Db::rollback();
        return fasle;
      }
    }else{
      //如果微信返回失敗的處理信息,那我們這里依然返回true,向微信表明態(tài)度
      return true;
    }
  }

  //支付成功,減去商品庫(kù)存
  private function reduceStock($stockStatus)
  {
    //遍歷減去
    foreach ($stockStatus['pStatusArray'] as $v) {
      //使用tp5的setDec方法
      Product::where(['id'=>$v['id']])->setDec('stock',$v['count']);
    }
  }

  //success為真,則訂單修改為PAID,如果為假則修改為已支付,但訂單未處理的狀態(tài),對(duì)應(yīng)枚舉信息修改
  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:檢查庫(kù)存量防止超賣
    //2:更新status狀態(tài)
    //3:減庫(kù)存
    //如果成功處理,返回成功處理信息,否則返回沒(méi)有成功處理信息
    $notify = new WxNotify();
    $notify->handle();
  }

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“微信小程序中支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單的示例”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI