4

我有一个使用Stripe处理订阅付款的网站。只有一种订阅类型。我按照NetTuts 上的本教程进行了初始设置。有一个表格可以很好地处理订阅并且一切正常。客户要求提供优惠券代码。Stripe 支持这一点,所以我开始尝试在现有表单中添加优惠券代码。

我在 Stripe 中设置了优惠券代码,设置了我的测试密钥并在 Stripe 中切换到了测试模式。我正在我的代码中执行一些检查:

  1. 检查是否输入了优惠券,如果没有则创建一个没有优惠券选项的新客户对象
  2. 检查Coupon是否有效,如果无效则返回错误

如果输入了优惠券并且有效,则在创建新客户时将匹配的 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。

4

2 回答 2

4

这可能有点过时了,您找到了代码的解决方案。但似乎您需要做的就是将原始 $couponCode 作为 Coupon 的数组值传递。正如 codasaurus 所说,您只是从优惠券的条纹中获取一个数组,除非您执行 $cCode->id 并将 ID 传递回您的数组以创建客户,否则您不需要该数组。

当您将 $using_discount 设置为 true 时,我进行了更改,因为如果优惠券有效与否,这将触发发送优惠券代码。

一旦优惠券实际有效,我们就会发送优惠券。您只需要提交状态的值,因此 $coupon 是那里系统中折扣的参考。或者,如果您想以这种方式创建它,您可以使用 $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)
                );
        }
于 2014-03-19T11:24:23.477 回答
2

查看文档https://stripe.com/docs/api#create_customer,Stripe_Customer::create() 调用正在寻找优惠券代码。看起来您正在传递整个优惠券对象。

除非您的第一次尝试捕获失败,否则 $couponCode 已经有您的优惠券代码。此外,您还需要执行其他几项检查以确定优惠券是否有效。例如,如果coupon->times_redeemed < coupon->max_redemptions,或者如果coupon->redeem_by 已经过去等。您可能还想通过检查客户折扣对象来检查客户是否已经在使用优惠券。

如果这些检查中的任何一个失败,只需设置您的 $using_discount = false;

于 2013-03-22T18:46:44.533 回答