>백엔드 개발 >PHP 문제 >PHP 쿠폰 구현은 무엇입니까

PHP 쿠폰 구현은 무엇입니까

藏色散人
藏色散人원래의
2021-12-01 09:54:392966검색

PHP 쿠폰 구현 방법: 1. 프런트엔드 파일을 생성하고 쿠폰이 존재하는지 또는 비활성화되었는지 확인합니다. 2. PHP 샘플 파일을 생성합니다. 3. "공용 함수 doCoupon($params){...}을 통해; ” 등의 쿠폰수집 상황 처리 방법을 안내해 드립니다.

PHP 쿠폰 구현은 무엇입니까

본 글의 운영 환경: Windows 7 시스템, PHP 버전 7.4, DELL G3 컴퓨터

PHP 쿠폰 구현 방법은 무엇인가요?

PHP를 사용하여 쿠폰 수집을 위한 샘플 코드 만들기

비즈니스 요구

쿠폰 활동, 특정 요구는 자신의 요구에 따라야 합니다. 최근 구현된 쿠폰 활동에 대한 주요 비즈니스 요구 사항은 다음과 같습니다. 백엔드에 따른 쿠폰 템플릿 설정, 사용자 유형 설정, 쿠폰 활동 시작 및 종료 시간, 최종적으로 다양한 쿠폰 활동 링크 생성.

코드 환경:

소스 코드는 주로 laravel5.8입니다. 전체 활동에 대해 게시할 코드가 많습니다. 핵심 코드는 주로 참고용으로 아래에 게시됩니다. 가장 중요한 것은 자신의 비즈니스 요구에 따라 기능을 구현하는 것입니다.

다음은 모듈식으로 만든 백엔드의 스크린샷입니다.

프런트 엔드에서 설정해야 하는 설정 및 제한 사항:

1 쿠폰이 존재하는지 또는 비활성화되었는지 확인
2 이벤트 시작 시간 및 쿠폰 시작 시간을 결정합니다

그런 다음 이벤트 쿠폰을 받으려면 다음 상황을 판단해야 합니다.
1 이벤트가 종료되었습니다.
2 이벤트가 시작되었습니다.
3 이벤트가 시작되었습니다. 신규 유저가 받을 수 있는 이벤트이고, 받는 유저는 기존 유저입니다
4 기존 유저가 받을 수 있는 이벤트이고, 받은 유저는 신규 유저입니다
5 쿠폰을 받았나요? 프롬프트
7 성공적으로 수신됨

다음 핵심 코드가 구현되었습니다.

/**
 * Function:优惠券领取处理
 * Author:cyw0413
 * @param $params
 * @return array
 * @throws \Exception
 */
public function doCoupon($params)
{
  $activity_id = $params['activity_id'];
  if(!$params){
    throw new \Exception("参数错误!");
  }

  $preg_phone = '/^1[34578]\d{9}$/ims';
  $is_mobile = preg_match ($preg_phone, $params['mobile']);
  if ($is_mobile == 0) {
    throw new \Exception("手机号码不正确!");
  }

  //隐藏手机号码中间4位
  $str_mobile = substr_replace($params['mobile'],'****',3,4);

  $activity = $this->find($activity_id);
  if(empty($activity)){
    throw new \Exception("不存在此活动");
  }

  $activity_link = $activity->activityLink->where('coupon_status',0); //只选择不停用的优惠券
  if(count($activity_link) <= 0){
    throw new \Exception("优惠券不存在或者已经停用");

  }else{

    //查找注册用户ID
    $showUser = $this->showUser($params[&#39;mobile&#39;]);
    //主要是过滤掉领取优惠券为0的,用laravel的同学注意看看
    $detail = $activity_link->each(function($item,$index) use ($showUser) {

      $diffCouponQuantity = $this->diffCouponQuantity($item[&#39;config_id&#39;],$item[&#39;quantity&#39;],$item[&#39;activity_id&#39;],$showUser);
      $item->title = $this->getCouponName($item[&#39;config_id&#39;])[&#39;name&#39;];
      $item->number = $item[&#39;quantity&#39;];
      $item->msg  = $diffCouponQuantity [&#39;msg&#39;];
      $item->diff   = $diffCouponQuantity [&#39;diff&#39;];
      $item->code   = $diffCouponQuantity [&#39;code&#39;];
    })->toArray();

    if(count($detail) == 1){
      foreach($detail as $val){
        if($val[&#39;diff&#39;] == 1 && $val[&#39;code&#39;] == &#39;400&#39;){
          throw new \Exception($detail[0][&#39;msg&#39;]);
        }
      }

    }

    $collection_coupon = collect($detail);
    $collection_coupon = $collection_coupon->where(&#39;diff&#39;, &#39;<=&#39; ,&#39;0&#39;);  //去除优惠券剩余数量为0,或者领取优惠券数量-剩余数量 > 0

  }
  //判断活动开始时间与优惠券开始时间
  $act_coupon = ActivityCouponBaseModel::where(&#39;activity_id&#39;,$activity[&#39;activity_id&#39;])->first();
  $check_time = $this-> checkCouponTime($act_coupon[&#39;start_time&#39;],$activity_link);
  if($check_time == &#39;error&#39;){
    throw new \Exception("优惠券领取时间未开始,暂不可领取");
  }

  //领取活动有以下几种情况
  //1: 活动已结束
  if($activity[&#39;end_time&#39;] < date("Y-m-d H:i:s") || $activity[&#39;status&#39;] == 1){
    $result = [
      &#39;code&#39; => 1,
    ];
    return $result;
  }

  //6 活动为开始时
  if($activity[&#39;start_time&#39;] > date("Y-m-d H:i:s") || $activity[&#39;status&#39;] == 1){
    $result = [
      &#39;code&#39; => 6,
    ];
    return $result;

  }

  $checkUser = $this->haveUser($params[&#39;mobile&#39;]); //检查是新用户,还是老用户 根据自己的业务需求做,这个方法就不贴了
  //2: 活动为新用户领取,而领取的用户是老用户
  if($activity[&#39;user_type&#39;] == 1 && !empty($checkUser)){
    $result = [
      &#39;code&#39; => 2,
    ];
    return $result;
  }

  //3:活动为老用户领取,而领取的用户是新用户
  if($activity[&#39;user_type&#39;]==2 && empty($checkUser)){
    $result = [
      &#39;code&#39; => 3,
    ];
    return $result;
  }


  //4:优惠券是否领取完
  $coupon = $this->getCouponExpire($collection_coupon,$params[&#39;mobile&#39;]); //这里提示有一个优惠券列表,根据自己的业务需求做,这个方法就不贴了
  //return $coupon;
  if($coupon == 1){
    $result = [
      &#39;code&#39; => 4,
    ];
    return $result;
  }

  //5:已领取过优惠券提示
  $userCoupon = &#39;&#39;;
  $userRate = &#39;&#39;;
  if(!empty($checkUser)){
    //user存在则为老用户,再检查是否领取过
    $userCoupon = $this->getUserCoupon($collection_coupon,$checkUser[&#39;user_id&#39;]);
    $userRate = $this->getUserCouponRate($checkUser[&#39;user_id&#39;],$activity[&#39;activity_id&#39;]);
  }else{
    //新用户,检查是否注册过
    $var_user = UserBaseModel::where(&#39;user_name&#39;,$params[&#39;mobile&#39;])->first();
    if(!empty($var_user)){
      $userCoupon = $this->getUserCoupon($collection_coupon,$var_user[&#39;user_id&#39;]);
      $userRate = $this->getUserCouponRate($var_user[&#39;user_id&#39;],$activity[&#39;activity_id&#39;]);
    }
  }

  //return $userRate;

  if($userCoupon == 1){
    $result = [
      &#39;code&#39; => 5,
      &#39;phone&#39;=> $str_mobile,
      &#39;coupon&#39; => $userRate,
      &#39;is_get&#39; => false,
    ];
    return $result;
  }

  //5:领取成功
  //如果活动规定是新老用户0,新用户1,老用户2
  $getCouponSuccess = $this->getCouponSuccess($activity[&#39;user_type&#39;],$checkUser,$collection_coupon,$params[&#39;mobile&#39;]);
  //return $getCouponSuccess;
  if($getCouponSuccess[&#39;status&#39;] == 200){
    $result = [
      &#39;code&#39; => 5,
      &#39;phone&#39;=> $str_mobile,
      &#39;coupon&#39; => $getCouponSuccess[&#39;result&#39;][0],
      &#39;is_get&#39; => true,
    ];
    return $result;
  }


}

사용자가 쿠폰을 수신하고 쿠폰을 발행합니다.

/**
 * Function:用户领取活动
 * Author:cyw0413
 * @param $user_type
 */
public function getCouponSuccess($user_type,$user,$coupon,$mobile)
{
  if(count($coupon) > 0){

    switch ($user_type){
      case 1:
        //新用户领取,如果从来没注册过就要新增用户
        $res = $this->addUser($mobile,$coupon); 
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
      case 2:
        //老用户领取
        $res = $this->insertUserCoupon($user,$coupon);
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
      default:
        //新老用户领取,判断是新用户还是老用户,这里的$user是有无配送单,有则为老用户;
        if(empty($user)){
          $res = $this->addUser($mobile,$coupon);
        }else{

          $res = $this->insertUserCoupon($user,$coupon); //老用户,直接发放优惠券
        }
        return [
          &#39;result&#39; => $res,
          &#39;status&#39; => 200
        ];
        break;
    }
  }else{
    throw new \Exception("优惠券不存在或者已经停用");
  }


}

수신에 성공하면 쿠폰이 발행됩니다

/**
 * Function:发放优惠券
 * Author:cyw0413
 * @param $user
 * @param $coupon
 */
public function insertUserCoupon($user,$coupon)
{
  $relate = [];
  foreach($coupon as $item){

    $res = CouponConfigSendBaseModel::where([
      &#39;config_id&#39;=>$item[&#39;config_id&#39;],
      &#39;status&#39;  => 0,
    ])->first();

    if(empty($res) || (!empty($res) && $res[&#39;is_send&#39;] == 0) ){
      throw new \Exception("优惠券未发放,暂不可领取");
    }

    //发放优惠券,有多少张就添加多少张,这里扣除优惠券时,主要用不同的coupon_sn来区别
    $onlyCoupon = $this->getCouponName($item[&#39;config_id&#39;]);
    if ($onlyCoupon[&#39;expire_type&#39;] == 0) {
      $start_time = $onlyCoupon[&#39;expire_start_time&#39;];
      $end_time = $onlyCoupon[&#39;expire_end_time&#39;];
    } else {
      $start_time = date(&#39;Y-m-d H:i:s&#39;);
      $end_time = date(&#39;Y-m-d H:i:s&#39;, time()+86400*$onlyCoupon[&#39;expire_type&#39;]);
    }

    $result = [
      &#39;user_id&#39;  => $user[&#39;user_id&#39;],
      &#39;config_id&#39; => $item[&#39;config_id&#39;],
      &#39;name&#39;   => $onlyCoupon[&#39;name&#39;],
      &#39;get_type&#39; => $onlyCoupon[&#39;get_type&#39;],
      &#39;amount&#39;  => $onlyCoupon[&#39;amount&#39;],
      &#39;require_price&#39; => $onlyCoupon[&#39;require_price&#39;],
      &#39;status&#39;    => 1,
      &#39;start_time&#39;  => $start_time,
      &#39;end_time&#39;   => $end_time,
    ];
    for($i=0; $i < $item[&#39;quantity&#39;];$i++){
      $result[&#39;coupon_sn&#39;] = &#39;B&#39;.mt_rand(1, 10000) . strtoupper(uniqid(mt_rand(1, 10000)));
      $userCoupon = UserCouponBaseModel::create($result);
    }

    //扣除相应的优惠券数量,这里用到了锁表,防止并发时,优惠券为-1
    $couponConfig = CouponConfigBaseModel::where(&#39;config_id&#39;,$item[&#39;config_id&#39;])->lockForUpdate()->first();
    if($couponConfig->left_quantity > 0 ){
      if($couponConfig->left_quantity >= $item[&#39;quantity&#39;]){
        $couponConfig->left_quantity = $couponConfig->left_quantity-$item[&#39;quantity&#39;];
        $couponConfig->save();
      }else{
        throw new \Exception("优惠券剩余数量不够扣减");
      }

    }


    $relate = [
      &#39;coupon_id&#39; => $userCoupon->coupon_id,
      &#39;user_id&#39;  => $user[&#39;user_id&#39;],
      &#39;config_id&#39; => $item[&#39;config_id&#39;],
      &#39;activity_id&#39; => $item[&#39;activity_id&#39;]
    ];

    ActivityCouponUserRelateBaseModel::create($relate);

    $relate[] = $this->getUserCouponRate($user[&#39;user_id&#39;],$item[&#39;activity_id&#39;]);


  }

  return $relate;
}

추천 학습: "

PHP 비디오 튜토리얼 "

위 내용은 PHP 쿠폰 구현은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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