2

私はFlaskアプリでpaypalrestsdkをいじっています。これが支払いのシーケンスです。サイクルが固定されているかどうかを指摘できる経験者はいますか?

  1. 適切なリダイレクト 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():
          ...
    
  2. 成功した場合は、次の支払い応答の詳細をデータベースに保存します。

    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)
    
  3. 次に、HATEOAS リンクを使用してリダイレクトします。

  4. 取引は PayPal で行われます。リターン URL にリダイレクトします。
  5. データベースから「作成済み」ステータスの現在のユーザーの最後のトランザクションを検索します。

    pending_payment = PayPalPayment.query.filter_by(user_id=user_id).filter_by(state='created').first()
    
  6. 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 しか含まれていないため、実行する関連する支払いを特定する唯一の方法は、現在のユーザー ID と status='created' を使用して Payment テーブルでブラインド クエリを実行することです。

改善の余地はありますか?

4

1 に答える 1