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

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

jacklove
풀어 주다: 2023-04-02 10:28:01
원래의
3242명이 탐색했습니다.

아래 편집자가 WeChat 애플릿에서 결제 후 SDK를 호출하는 비동기 알림 및 확인 주문 처리 방법에 대한 기사를 공유할 예정입니다. 좋은 참고 가치가 있으며 모든 사람에게 도움이 되기를 바랍니다.

애플릿 후 비동기 검증 및 주문 처리

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

<?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]);

  }

}

로그인 후 복사

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

1

2

3

4

5

6

7

8

9

public function receiveNotify()

{

  //1:检查库存量防止超卖

  //2:更新status状态

  //3:减库存

  //如果成功处理,返回成功处理信息,否则返回没有成功处理信息

  $notify = new WxNotify();

  $notify->handle();

}

로그인 후 복사

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

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

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

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

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

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿