2016-11-25 84 views
0

流星和條紋API的新功能我試圖使用Meteor和stripe應用此優惠券代碼。這是一次性使用優惠券付款。然而,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"); 
     } 
    }); 

任何幫助將不勝感激。

+0

您已經在'Stripe.charges.create'中使用'Meteor.wrapAsync',爲什麼不將它用於'Stripe.coupons.retrieve'呢? – Khang

回答

0

好吧,這裏有一件事情,在條紋api中的優惠券鍵的參數需要一個字符串,看起來像你已經有,因爲你通過coupons.retrieve api傳遞,所以你會從這個api得到的是優惠券對象對你沒用。所以通常在Stripe中我們已經有了優惠券ID,然後才能創建訂閱,並在Stripe API中通過折扣。

但正如您所說,在運行另一種方法之前獲得響應時遇到問題,所以在這裏我可以建議您使用流星的Async.runSync。

另一件事是,你不能使用優惠券charge.create API,其訂閱。所以這裏是我的方法是如何與訂閱:

在這裏我從coupon_id retreiving優惠券對象,然後擊中訂閱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; 
    } 
}); 

希望這有助於你隨便問在評論什麼,我會很樂意回答更多。