Использование кодов купонов с полосой

У меня есть сайт, на котором для обработки платежей по подписке используется Stripe. Есть только один тип подписки. Я следил за этим руководством в NetTuts, чтобы выполнить первоначальную настройку. Была форма, работающая нормально, обработка подписок и все заработало. Клиент запросил код купона. Stripe поддерживает это, поэтому я решил добавить код купона в существующую форму.

Я установил коды купонов в Stripe, установил свои тестовые ключи и перешел в тестовый режим в Stripe. Я провожу несколько проверок своего кода:

  1. Проверьте, введен ли купон, если нет, создайте новый объект клиента без опции купона.
  2. Проверьте, действителен ли купон, если нет, верните ошибку.

Если купон был введен и он действителен, то передайте соответствующий объект купона Stripe в качестве опции при создании нового клиента.

 if(isset($couponCode) && strlen($couponCode) > 0) {
  $using_discount = true;
  try {
        $coupon = Stripe_Coupon::retrieve($couponCode);
        if($coupon !== NULL) {
           $cCode = $coupon;
        }
        // if we got here, the coupon is valid

     } catch (Exception $e) {

        // an exception was caught, so the code is invalid
        $message = $e->getMessage();
        returnErrorWithMessage($message);

     }


}

try
{ 
  if($using_discount == true) {
    $customer = Stripe_Customer::create(array(
          "card" => $token,
          "plan" => "basic_plan",
          "email" => $email,
          "coupon" => $cCode
       ));
  }
  else {
        $customer = Stripe_Customer::create(array(
          "card" => $token,
          "plan" => "basic_plan",
          "email" => $email
       ));
  }

$ couponCode заполняется полем формы правильно так же, как и все остальные поля, я трижды проверил, правильно ли оно извлекается.

Когда я пытаюсь отправить форму без кода купона, она списывает полную сумму и правильно проходит через Stripe.

Однако, если я ввожу действительный ИЛИ недопустимый код купона, он не передает объект купона с объектом клиента при создании нового объекта клиента и взимает полную сумму при прохождении через Stripe.

Я часами смотрел на код и не мог понять, почему он всегда не распознает код скидки и не передает соответствующий объект купона в Stripe.


person biggles    schedule 22.02.2013    source источник


Ответы (2)


Вероятно, это немного устарело, и вы нашли решение для своего кода. Но, похоже, все, что вам нужно сделать, это передать исходный код $ couponCode в качестве значения массива для Coupon. Как указано codasaurus, вы просто получаете массив обратно из полосы купона, который вам не нужен, если вы не выполнили $ cCode-> id и не передали идентификатор обратно в свой массив для создания клиента.

Я изменил, когда вы установили для $ using_discount значение true, так как это приведет к отправке кода купона, если купон действителен или нет.

Как только купон действительно действителен, мы отправляем купон. Вам нужно только значение вашего отправленного состояния, поэтому купон на $ является ссылкой на скидку в этой системе. Или вы можете использовать $ coupon-> id, если хотите создать его таким образом.

Вот мой взгляд на решение, основанное на вашем коде, оно могло бы быть лучше, но я надеюсь, что это поможет другим, ищущим решение, как я.

if($coupon!='' && strlen($coupon) > 0) {
          try {
                $coupon = Stripe_Coupon::retrieve($coupon); //check coupon exists
                if($coupon !== NULL) {
                 $using_discount = true; //set to true our coupon exists or take the coupon id if you wanted to.
                }
                // if we got here, the coupon is valid

             } catch (Exception $e) {
                // an exception was caught, so the code is invalid
                $message = $e->getMessage();
                returnErrorWithMessage($message);
             }

        }
        if($using_discount==true)
        {
            $customer = Stripe_Customer::create(array(
                  "card" => $token,
                  "plan" => $plan,
                  "email" => $id,
                  "coupon"=>$coupon) //original value input example: "75OFFMEMBER" stripe should be doing the rest.
                );
        }
        else
        {
            $customer = Stripe_Customer::create(array(
                  "card" => $token,
                  "plan" => $plan,
                  "email" => $id)
                );
        }
person Rob Cullen    schedule 19.03.2014
comment
да. Я думал, что передаю код купона, но у меня были перепутаны имена некоторых переменных, поэтому на самом деле он не прошел. Тем не менее, спасибо за ответ, я уверен, что это поможет многим, кто пришел сюда из Google. - person biggles; 19.03.2014

Изучив документацию https://stripe.com/docs/api#create_customer, Stripe_Customer: Вызов: create () ищет только код купона. Похоже, вы передаете объект купона целиком.

Если ваша первая попытка не удалась, в $ couponCode уже есть код вашего купона. Кроме того, вам необходимо выполнить несколько других проверок, чтобы определить, действителен ли купон. Например, если coupon-> times_redeemed ‹coupon-> max_redemptions, или если coupon-> redeem_by прошел и т. Д. Вы также можете проверить, использует ли клиент уже купон, проверив объект скидки клиента.

Если какая-либо из этих проверок не удалась, просто установите $ using_discount = false;

person Codasaurus    schedule 22.03.2013