Я возился с paypalrestsdk в своем приложении Flask, и вот последовательность оплаты. Может ли кто-нибудь из опытных указать, жесткий цикл или нет?
Создайте платеж с соответствующими URL-адресами перенаправления.
payment = paypalrestsdk.Payment({ "intent": "sale", "payer": { "payment_method": "paypal" }, "redirect_urls": { "return_url": url_for('.payment_success', _external=True), "cancel_url": url_for('.payment_cancel', _external=True) }, ...}) if payment.create(): ...
В случае успеха сохраните следующие данные ответа на платеж в базе данных.
class PayPalPayment(db.Model): __tablename__ = 'ediket_paypal_payment' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('ediket_ediketuser.id')) payment_id = db.Column(db.String(30)) amount = db.Column(db.String(10)) state = db.Column(db.String(10)) redirect_url = db.Column(db.VARCHAR) created_at = db.Column(db.DateTime) updated_at = db.Column(db.DateTime)
Затем выполните перенаправление с использованием ссылок HATEOAS.
- Транзакция проходит в PayPal. Перенаправляет на возвращаемый URL.
Найти последнюю транзакцию текущего пользователя со статусом «создано» из базы данных.
pending_payment = PayPalPayment.query.filter_by(user_id=user_id).filter_by(state='created').first()
Выполнить платеж с помощью payment_id и payer_id
payment = paypalrestsdk.Payment.find(pending_payment.payment_id) if payment.execute({"payer_id": request.args.get('PayerID')}): #We are done! #Update Payment model for completion
Все работает нормально, но я не слишком уверен, безопасен ли этот поток для реальных приложений. Поскольку возвращаемый URL-адрес содержит только PayerID и Token, единственный способ найти соответствующий платеж для выполнения - это слепой запрос в таблице платежей с использованием текущего идентификатора пользователя и статуса = 'created'.
Есть ли место для улучшения?