lib/subscription_fu/paypal.rb in subscription_fu-0.1.0 vs lib/subscription_fu/paypal.rb in subscription_fu-0.2.0

- old
+ new

@@ -1,101 +1,19 @@ -require "rest-client" +require "paypal" -class SubscriptionFu::Paypal +module SubscriptionFu::Paypal + UTC_TZ = ActiveSupport::TimeZone.new("UTC") - def self.paypal - new(SubscriptionFu.config.paypal_api_user_id, - SubscriptionFu.config.paypal_api_pwd, - SubscriptionFu.config.paypal_api_sig, - SubscriptionFu.config.paypal_nvp_api_url, - Rails.logger) + def self.express_request + config = SubscriptionFu.config + ::Paypal::Express::Request.new( + :username => config.paypal_api_user_id, + :password => config.paypal_api_pwd, + :signature => config.paypal_api_sig) end - class Failure < RuntimeError - attr_reader :request_opts, :response - - def initialize(request_opts, response) - @request_opts = request_opts - @response = response - super "PayPal did not return success: #{@response.inspect}" - end - alias :data :request_opts + def self.recurring_details(profile_id) + res = SubscriptionFu::Paypal.express_request.subscription(profile_id) + { :next_billing_date => UTC_TZ.parse(res.recurring.summary.next_billing_date.to_s), + :last_payment_date => UTC_TZ.parse(res.recurring.summary.last_payment_date.to_s), } end - - def initialize(user, pwd, sig, api_url, logger) - @user = user - @pwd = pwd - @sig = sig - @api_url = api_url - @logger = logger - end - - def start_checkout(return_url, cancel_url, email, maxamt, currency_code, desc) - res = call_paypal('SetExpressCheckout', - 'RETURNURL' => return_url, - 'CANCELURL' => cancel_url, - 'EMAIL' => email, - 'NOSHIPPING' => 1, - 'MAXAMT' => maxamt, - 'PAYMENTREQUEST_0_AMT' => 0, - 'PAYMENTREQUEST_0_CURRENCYCODE' => currency_code, - 'L_BILLINGTYPE0' => 'RecurringPayments', - 'L_BILLINGAGREEMENTDESCRIPTION0' => desc) - res['TOKEN'].first - end - - def create_recurring(token, start_date, amt, taxamt, currency_code, desc) - res = call_paypal('CreateRecurringPaymentsProfile', - 'PROFILESTARTDATE' => start_date.utc.iso8601, - 'BILLINGPERIOD' => 'Month', - 'BILLINGFREQUENCY' => 1, - 'MAXFAILEDPAYMENTS' => 0, - 'AUTOBILLOUTAMT' => 'AddToNextBilling', - 'AMT' => amt, - 'TAXAMT' => taxamt, - 'CURRENCYCODE' => currency_code, - 'DESC' => desc, - 'TOKEN' => token) - [res['PROFILEID'].first, res['PROFILESTATUS'].first || res['STATUS'].first] - end - - def recurring_details(profile_id) - utc = ActiveSupport::TimeZone.new("UTC") - res = call_paypal('GetRecurringPaymentsProfileDetails', 'PROFILEID' => profile_id) - { :id => res['PROFILEID'].first, - :status => res['PROFILESTATUS'].first || res['STATUS'].first, - :next_billing_date => utc.parse(res['NEXTBILLINGDATE'].first.to_s), - :start_date => utc.parse(res['PROFILESTARTDATE'].first.to_s), - :cycles_completed => res['NUMCYCLESCOMPLETED'].first.to_i, - :outstanding_balance => res['OUTSTANDINGBALANCE'].first.to_f, - :last_payment_date => utc.parse(res['LASTPAYMENTDATE'].first.to_s) } - end - - def cancel_recurring(profile_id, reason) - call_paypal('ManageRecurringPaymentsProfileStatus', - 'PROFILEID' => profile_id, - 'ACTION' => 'Cancel', - 'NOTE' => I18n.t(reason, :scope => [:subscription_fu, :subscription, :cancel_notes])) - end - - private - - def call_paypal(method, opts) - full_opts = paypal_api_opts(method, opts) - CGI.parse(RestClient.post(@api_url, full_opts)).tap do |result| - if result['ACK'].first != 'Success' - @logger.warn("PayPal did not return success for call to #{method}") - @logger.info(" called with: #{full_opts.inspect}") - @logger.info(" result: #{result.inspect}") - raise Failure.new(full_opts, result) - else - @logger.info("PayPal returned success for call to #{method}") - @logger.info(" result: #{result.inspect}") - end - end - end - - def paypal_api_opts(method, opts) - opts.merge('USER' => @user, 'PWD' => @pwd, 'SIGNATURE' => @sig, 'VERSION' => '65.0', 'METHOD' => method) - end - end