0

流星和条纹 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");
       }
     });

任何帮助将不胜感激。

4

1 回答 1

0

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

但是正如您所说,在运行另一种方法之前您无法获得响应,所以在这里我可以建议您使用流星的 Async.runSync。

另一件事是您不能在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 回答