微信小程序之支付后调用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('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的异步通知及验证处理订单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序微信支付接入开发实例详解

    本文主要讲述微信小程序接入微信支付开发过程中遇到的坑,分为两大块,小程序端和后台接口封装.本文主要内容如下: 一.后台接口封装: 二.小程序端整合: 三.总结 一.后台接口封装 本文介绍基于ThinkPHP5进行接口封装,具体步骤如下: 1.微信支付官方文档提供了PHP脚本微信支付的样例,下载下来: 2.样例已经封装好了每个类,我们只需要加上命名空间即可,在TP5的extend目录下新建一个目录wxpay,把样例中的类复制到该目录下,然后加上命名空间即可: 样例改造结果 其中最主要的一个类即Wx

  • 微信小程序 支付简单实例及注意事项

    微信小程序 支付 微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口!!! 首先调用统一下单接口我们需要知道一些信息 var bookingNo = 'davdian' + this.createNonceStr() + this.createTimeStamp() var deferred = Q.defer() var appid = conf

  • 微信小程序之支付后调用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\a

  • 微信小程序 在线支付功能的实现

    微信小程序 在线支付功能 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出一辙,下面我就具体说一下小程序里微信支付的开发流程和注意点. 1.开通微信支付和微信商户号 这个过程就和开通服务号的微信支付过程一样,没有什么可以说的. 2.获得用户的openid 首页我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可

  • 微信小程序 使用腾讯地图SDK详解及实现步骤

    微信小程序 使用腾讯地图SDK详解及实现步骤 近期在做一款彩票服务类项目中用到了腾讯地图提供的小程序解决方案,拿来给大家分享一下! 使用起来非常简单,就是一些功能还有待完善. 官方文档:http://lbs.qq.com/qqmap_wx_jssdk/index.html 步骤: 申请开发者密钥(key):申请密匙 下载微信小程序JavaScriptSDK,微信小程序JavaScriptSDK v1.0 安全域名设置,需要在微信公众平台添加域名地址https://apis.map.qq.com

  • PHP实现微信小程序在线支付功能(代码实例)

    小程序访问地址:payfee.php 如果使用TP框架处理后台的话,写成方法即可 include 'WeixinPay.php'; $appid=''; //小程序appid $openid= $_POST['id']; $mch_id=''; //微信支付商户支付号 $key=''; //Api密钥 $out_trade_no = $mch_id. time(); $total_fee = $_POST['fee']; if (empty($total_fee)) { //押金 $body =

  • 微信小程序 wx.request(接口调用方式)详解及实例

    微信小程序 wx.request----接口调用方式 最近开发了一个微信小程序版的任务管理系统,在向Java后台发送接口时遇到了一些问题,在这里做一个简单的总结. 官方接口 官方给出的接口叫做wx.request,请求方式比较简单,下面是官网给出的请求实例. wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 'application/json' },

  • 微信小程序本作用域下调用全局JS详解及实例

    微信小程序本作用域下调用全局JS详解 本地wxml文件 <view> app版本:{{version}} </view> 本地js文件 var app; Page({ data:{ }, onLoad:function() { app = getApp(); this.setData({version:app.globalData.appName}); } }) 全局js文件 //app.js App({ globalData:{ appName:"hcoder"

  • 微信小程序 es6-promise.js封装请求与处理异步进程

    微信小程序 es6-promise.js封装请求与处理异步进程 下载es6-promise.js置于根目录下的libs文件夹下: 在根目录utils文件夹下新建httpsPromisify.js,即定义封装请求的方法 var Promise = require('../libs/es6-promise.min') function httpsPromisify(fn) { return function (obj = {}) { return new Promise((resolve, reje

  • 微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法

    本文实例讲述了微信小程序实现动态设置placeholder提示文字及按钮选中取消状态的方法.分享给大家供大家参考,具体如下: 效果图展示    通过绑定点击事件placeholder方法,获取data-num的值,通过js判断num等于几,然后通过class="{{num==X?'active':''}}"表达式判断哪个标签处于选中状态(即蓝底白字): js通过获取data-key,设置input输入框中placeholder的动态值 wxml里的内容: <view class=

  • 微信小程序调用微信支付接口的实现方法

    前言:应项目要求,需要使用微信小程序做支付,写完后告知手续费太高方案不予通过(宝宝心里苦,但宝宝不说).此次开发在因站在巨人的肩膀上顺利完成. 微信支付文档传送门:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3 1.开发工具: Eclipse+Tomcat+微信web开发工具 2.开发环境: java+maven 3.开发前准备: 3.1 所需材料 小程序的appid,APPsecret,支付商户号(mch_i

  • 关于微信小程序实现云支付那些事儿

    目录 一.前言 二.思路分析 三.云支付小案例 1.云函数 1-1.获取免鉴权参数云函数(wxPay) 1-2.支付回调云函数(payCallBack) 2.小程序端(js代码) 3.支付结果 4.代码目录结构 四.为什么这样写 五.结语 一.前言 稍微玩过微信小程序云开发的同学都基本知道微信小程序云开发目前已经支持云支付这一能力. 那么在云支付的能力支持之下,整个支付的流程是怎样的呢? 例如:用户发起支付前.支付中.支付后的逻辑处理应该是怎样的,该如何设计会比较保险,降低出错的概率. 那么本文

随机推荐