4

Stripeを使用してサブスクリプションの支払いを処理しているサイトがあります。サブスクリプションのタイプは1つだけです。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
       ));
  }

$ cuponCodeには、他のすべてのフィールドが入力されるのと同じ方法でフォームフィールドが正しく入力されます。正しくプルされていることを、トリプルチェックしました。

クーポンコードなしでフォームを送信しようとすると、全額が請求され、Stripeを正しく通過します。

ただし、有効または無効なクーポンコードを入力すると、新しい顧客オブジェクトを作成するときにクーポンオブジェクトが顧客オブジェクトに渡されず、Stripeを通過するときに全額が請求されます。

私は何時間もコードを見てきましたが、なぜ割引コードを常に認識できず、一致するクーポンオブジェクトをStripeに渡さないのか理解できないようです。

4

2 に答える 2

4

これはおそらく少し時代遅れであり、コードの解決策を見つけました。ただし、必要なのは、元の$couponCodeをCouponの配列値として渡すことだけのようです。codasaurusが述べているように、クーポンのストライプから配列を取得しているだけです。これは、$ cCode-> idを実行し、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)
                );
        }
于 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 に答える