0

メテオとストライプの API は初めてです。メテオとストライプを使用してこのクーポン コードを適用しようとしています。これは、クーポンを使用した 1 回限りの支払い用です。ただし、handleCharge メソッドは、支払い方法を処理する前に起動します。そして、支払いが処理される前に、Stripe.coupons.retrieve が最初に結果を返すようにします。

サーバー方式

Meteor.methods({
  processPayment( charge, coupon ) {
    Stripe.coupons.retrieve(
      coupon,
      function(err, result) {
        if( result ) {
          charge.amount = parseInt(charge.amount) - parseInt( charge.amount * coupon.percent_off );
        }
      }
    );

    let handleCharge = Meteor.wrapAsync( Stripe.charges.create, Stripe.charges ),
        payment      = handleCharge( charge );

    return payment;
  }
});

また、クーポンが processPayment に渡される前に結果を返そうとしました。次に、結果をconsole.logにしようとすると、常に未定義です。

checkForCoupon( couponCode ) {
      let result = false;
      Stripe.coupons.retrieve(
        couponCode,
        function(err, coupon) {
          if( err ) {
            result = false;
          } else {
            result =  true;
          }
        }
      );
      return result;
    }

 Meteor.call( 'checkForCoupon', coupon, ( error, response ) => {
       if ( error ) {
         console.log( error );
       } else {
         console.log( "Success");
       }
     });

どんな助けでも大歓迎です。

4

1 に答える 1

0

ここで問題があります。stripe api のクーポン キーの引数は、coupons.retrieve api でそれを渡しているため、既に持っているように見える文字列を取ります。したがって、この api から取得するのはクーポン オブジェクトです。あなた。通常、Stripe では、割引のために Stripe API に渡されるサブスクリプションを作成する前に、クーポン ID を既に持っています。

しかし、あなたが言ったように、別のメソッドを実行する前に応答を取得するのに問題があるため、ここでは流星の Async.runSync を使用することをお勧めします。

もう1つは、サブスクリプション用のcharge.create apiでクーポンを使用できないことです。したがって、サブスクリプションを使用した場合の私のアプローチは次のとおりです。

ここでは、coupon_id からクーポン オブジェクトを取得し、サブスクリプション API にアクセスしています。

クライアント上:

var data = {
   source: "source",
   plan: "plan"
}

Meteor.call('processPayment', data, function(err, res) {
  if(err)
     return;
  console.log("Subscription added with coupon");
});

サーバー上:

Meteor.methods({
  var coupon;
  'processPayment': function(data) {
    check( data, {
      source: String,
      plan: String
    });
    Async.runSync(function(done) {
      var coupon = Stripe.coupons.retrieve("coupon_id", function(err, coupon) {
        if(err) {
          return done(null);   //done is callback
        }
        return done(null, coupon);
      });
    });
    //this code will only run when coupon async block is completed
    if(coupon !== null) {
      data.coupon = coupon.id;
    }
    var subscription = Async.runSync(function(done) {
        Stripe.subscriptions.create(data, function(err, subscription) {
            if(err) {
              console.log(err);
              return done(null, err);
            }
            return done(null, subscription);
          }
        );
      });
      return subscription;
   }
});

これがお役に立てば幸いです。コメントでお気軽にお問い合わせください。喜んでお答えします。

于 2016-11-25T06:33:32.843 に答える