Периодические вопросы Paypal ruby ​​on rails

Я следил за руководством Railscast 289 о том, как совершать регулярные платежи с помощью Paypal.

Теперь у меня все работает, за исключением того, что я сейчас изо всех сил пытаюсь понять, как я могу узнать, отменил ли пользователь свою подписку в PayPal.

Что я сделал

Мне удалось установить URL-адрес IPN в учетной записи продавца PayPal, и каждый раз, когда кто-то подписывается, он будет отправлять мне данные с PayPal на мой веб-перехватчик.

Теперь я сохраняю все параметры, которые отправляет мне PayPal, но я не могу понять, какие из параметров я должен проверить, чтобы узнать, отменил ли пользователь свою подписку или у него недостаточно средств и т. Д.

По крайней мере, я так думаю, что это работает.

Я использую Paypal Recurring Gem

Вопросы

Как я могу заметить, что пользователь отменил свою подписку, когда PayPal отправляет мне свой IPN на мой веб-перехватчик.

Мой банкомат с веб-крючком

def create
    user_id = Subscription.find_by(paypal_customer_token: params[:payer_id]).user_id
    PaymentNotification.create!(params: params, user_id: user_id, user_role_id: params[:item_number], status: params[:payment_status], transaction_id: params[:txn_id])
    @user = User.find_by(id: user_id)
    if PaymentNotification.last.params[:profile_status] == "Cancelled"
        @user.update_attributes(user_role_id: 1)
    end
    render nothing: true
end

Обратите внимание, что я не хочу мгновенно обновлять атрибут пользователей, я хочу дождаться окончания их месячной подписки.

В настоящее время я сохраняю их вызов IPN в таблице PaymentNotification.

create_table "payment_notifications", force: :cascade do |t|
  t.text     "params"
  t.integer  "user_role_id"
  t.string   "status"
  t.string   "transaction_id"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
  t.integer  "user_id"
end

Кроме того, как лучше всего проверить эти параметры, чтобы принять меры к пользователям, которые не заплатили или отменили свою подписку?

У меня есть еще одна таблица, в которой хранятся подписки

create_table "subscriptions", force: :cascade do |t|
  t.integer  "user_role_id"
  t.integer  "user_id"
  t.string   "paypal_customer_token"
  t.string   "paypal_recurring_profile_token"
  t.datetime "created_at",                     null: false
  t.datetime "updated_at",                     null: false
end

user_role в данном случае является plan, на который они подписываются.


person Johhan Santana    schedule 18.09.2015    source источник
comment
Вы рассматривали возможность сохранения даты истечения срока подписки в таблице подписок? Когда приходит уведомление, вы обновляете это значение. Вам понадобится демон или chronjob для ежедневного / ежечасного запуска и т. Д.   -  person Graham Bass    schedule 25.09.2015


Ответы (1)


IPN гарантирует, что вы будете уведомлены о любых изменениях в ваших транзакциях, с точки зрения повторяющихся платежей, когда ваш клиент отменяет профиль, вашему слушателю IPN будет отправлено инициированное событием POST-Back.

Пример необработанного сообщения POST-Back об отмене профиля будет таким:

payment_cycle=Daily &txn_type=recurring_payment_profile_cancel &last_name=US &next_payme
nt_date=N/A &residence_country=US &initial_payment_amount=0.00 &currency_code=USD &t
ime_created=19:25:09 Sep 24, 2015 PDT &verify_sign=AgUGxKs4vGiEqeit6IyHkIjDJVpeAqCMRVC4wh9CZYotn
Jqrr-3oWsFe &period_type= Trial &payer_status=verified &test_ipn=1 &tax=0.00 &pa
[email protected] &first_name=Payer &[email protected] &payer_id=8FMFQ2
KVYYHTY &product_type=1 &shipping=0.00 &amount_per_cycle=2.00 &profile_status=Cancel
led &charset=gb2312 &notify_version=3.8 &amount=2.00 &outstanding_balance=0.00 &recurring_payment_id=I-30FKJ55UV1RW &product_name=RP BA Test &ipn_track_id=65583f3a80f10
  1. Как вы сможете заметить отмену?

    Прочтите параметр txn_type в сообщении IPN и определите с его помощью тип события (в вашем случае тип события будет recurring_payment_profile_cancel, дополнительные сведения см. В списке txn_type в PayPal IPN Variables)

  2. Согласуйте профиль / подписку с записью в базе данных и примите меры.

    Сопоставьте recurring_payment_id=I-30FKJ55UV1RW из сообщения IPN с предварительно сохраненной записью в базе данных paypal_recurring_profile_token и примите меры для обновления поля user_role_id. (Либо немедленно остановите подписку, либо обновите / установите новую дату истечения срока действия в зависимости от вашего бизнес-режима)

person pp_pduan    schedule 25.09.2015
comment
привет спасибо за ответ. Так что мне просто нужно следить за txn_type, чтобы предпринять правильные действия, верно? - person Johhan Santana; 25.09.2015
comment
точно, txn_type - это первое, на что следует обратить внимание, когда вы получили сообщение IPN в этом случае - person pp_pduan; 26.09.2015