简体   繁体   English

将优惠券代码与Stripe一起使用

[英]Using Coupon Codes with Stripe

I have a site that is using Stripe to process a subscription payments. 我有一个使用Stripe处理订阅付款的网站。 There is only one type of subscription. 订阅只有一种。 I followed this tutorial on NetTuts to do the initial setup. 我按照NetTuts上的本教程进行了初始设置。 Had a form working fine processing subscriptions and everything worked. 有一个表格可以很好地处理订阅,并且一切正常。 Client requested a coupon code. 客户要求输入优惠券代码。 Stripe supports this so I set out trying to add a coupon code to the existing form. Stripe支持此功能,因此我着手尝试将优惠券代码添加到现有表单中。

I set up coupon codes in Stripe, set my testing keys and switched to test mode in stripe. 我在Stripe中设置优惠券代码,设置测试键,并在Stripe中切换到测试模式。 I'm performing a couple of checks in my code: 我在代码中执行了几项检查:

  1. Check to see whether a coupon was entered, if not create a new customer object without a coupon option 检查是否输入了优惠券,如果没有,则创建没有优惠券选项的新客户对象
  2. Check to see whether the Coupon is valid, if not return an error 检查优惠券是否有效,如果没有,则返回错误

If there has been a coupon entered and it is valid, then pass the matching Stripe coupon object as an option when creating a new customer. 如果输入了优惠券并且有效,则在创建新客户时将匹配的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 is populated with the form field correctly the same way all other fields are populated, I've triple checked that it is being pulled correctly. $ couponCode正确填充了表单字段,就像填充其他所有字段一样,我已经三重检查了它是否被正确拉出。

When I try to submit the form without a coupon code, it charges the full amount and passes through Stripe correctly. 当我尝试提交没有优惠券代码的表格时,它将收取全额费用并正确通过Stripe。

However if I enter either a valid OR invalid coupon code, it does not pass a coupon object with the customer object when creating a new customer object and charges the full amount when passing through Stripe. 但是,如果我输入有效或无效的优惠券代码,则在创建新的客户对象时,它不会将优惠券对象与客户对象一起传递,并且在通过Stripe时收取全额费用。

I've looked at the code for hours and can't seem to figure out why it is always failing to recognize the discount code and pass the matching coupon object to Stripe. 我看了几个小时的代码,似乎无法弄清楚为什么它总是无法识别折扣代码并将匹配的优惠券对象传递给Stripe。

This is probably a little out dated and you found a solution for your code. 这可能有点过时,您找到了代码的解决方案。 But it would seem all you need to do is pass through your original $couponCode as the array value for Coupon. 但是,您似乎需要做的就是传递原始的$ couponCode作为Coupon的数组值。 As stated by codasaurus you are just getting an array back from stripe of the coupon, which you don't need unless you did $cCode->id and pass the ID back to your array to create a customer. 正如codasaurus所说,您只是从优惠券的条带中获得了一个数组,除非您执行了$ cCode-> id并将ID传递回您的数组以创建客户,否则您不需要使用该数组。

I changed when you set the $using_discount to true, as this would trigger to send a coupon code if the coupon was valid or not. 当您将$ using_discount设置为true时,我进行了更改,因为如果优惠券有效,这将触发发送优惠券代码。

Once the coupon is actually valid we then send the coupon. 一旦优惠券实际有效,我们就发送优惠券。 You only need the value of your submitted state so $coupon is the reference to the discount in there system. 您只需要提交状态的值,因此$ coupon是那里系统折扣的参考。 Or you could use the $coupon->id if you wanted to create it that way. 或者,如果您要使用$ coupon-> id进行创建,则可以使用它。

Here is my take on a solution based on your code, it could be better, but I hope it helps others looking for a solution like me. 这是我根据您的代码提出的解决方案,可能会更好,但是我希望它可以帮助其他人寻找像我这样的解决方案。

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)
                );
        }

Looking at the documentation https://stripe.com/docs/api#create_customer , the Stripe_Customer::create() call is looking for just the coupon code. 查看文档https://stripe.com/docs/api#create_customer,Stripe_Customer :: create()调用仅在查找优惠券代码。 It looks like you're passing in the entire coupon object. 您好像正在传递整个优惠券对象。

Unless your first try catch fails, $couponCode already has your coupon code. 除非您的第一次尝试失败,否则$ couponCode已包含您的优惠券代码。 Also, there are several other checks you need to perform to determine if the coupon is valid. 此外,您还需要执行其他几项检查来确定优惠券是否有效。 For example, if the coupon->times_redeemed < coupon->max_redemptions, or if the coupon->redeem_by has passed, etc. You might also want to check if the customer is already using the coupon by checking the customer discount object. 例如,如果coupon-> times_redeemed <coupon-> max_redemptions,或者如果coupon-> redeem_by已通过,等等。您可能还想通过检查客户折扣对象来检查客户是否已经在使用该优惠券。

If any of these checks fail, just set your $using_discount = false; 如果以上任何一项检查失败,则只需将$ using_discount = false设置为;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM