流星和条纹在充电发生之前首先应用优惠券

时间:2016-11-25 02:04:15

标签: javascript meteor stripe-payments meteor-methods

流星和条纹API新手我试图使用流星和条纹来应用此优惠券代码。这是一次性付款优惠券。然而,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");
       }
     });

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的这里有一个问题,条纹api中的优惠券键的参数需要一个看起来像你已经拥有的字符串,因为你在coupons.retrieve api中传递了它,所以你从这个api得到的是优惠券对象,这是没用到你。所以通常在Stripe中我们在创建订阅之前已经有优惠券ID,它在Stripe API中传递以获得折扣。

但正如你所说,在运行另一种方法之前遇到响应问题,所以我建议你使用meteor的Async.runSync。

另一件事是你不能使用优惠券。创建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;
   }
});

希望这对您有所帮助,并随意在评论中提出任何问题,我将非常乐意回答。