Javascript Paypal与Flask应用程序的集成

Javascript Paypal与Flask应用程序的集成,javascript,paypal,flask,Javascript,Paypal,Flask,我有点误解贝宝流量事件后阅读。我想将快速结帐和信用卡付款集成到我的网站。我使用的是Flask和paypalrestsdk,没有任何Flask扩展 以下是我的应用程序的摘录: @app.route('/', methods=['GET']) def index(): # Page with but form, price/quantity/name values # are stored in hidden fields, "Buy now" acts as submit

我有点误解贝宝流量事件后阅读。我想将快速结帐和信用卡付款集成到我的网站。我使用的是
Flask
paypalrestsdk
,没有任何Flask扩展

以下是我的应用程序的摘录:

@app.route('/', methods=['GET'])
def index():
    # Page with but form, price/quantity/name values
    # are stored in hidden fields, "Buy now" acts as submit
    return render_template('index.html')

@app.route('/payment/paypal', methods=['POST'])
def payment_paypal():
    # Here I am creating dict with required params
    payment_template = {
        'intent': 'sale',
        'payer': {'payment_method': 'paypal'},
        'redirect_urls': {
          'return_url': url_for('payment_paypal_execute'),
          'cancel_url': url_for('payment_paypal_error')
        },
        ......
    }

    payment = paypalrestsdk.Payment(payment)

    if payment.create():
        print('Payment "{}" created successfully'.format(payment.id))

        for link in payment.links:
            if link.method == "REDIRECT":
                redirect_url = str(link.href)
                print('Redirect for approval: {}'.format(redirect_url))
                return redirect(redirect_urls)

@app.route('/payment/paypal/execute', methods=['GET'])
def payment_paypal_execute():
    payer_id = request.args.get('payerId')
    payment_id = request.args.get('paymentId')
    token = request.args.get('token')

    pending_payment = PayPalPayment.query.filter_by(token=token).filter_by(state='created').first_or_404()

    try:
        payment = paypalrestsdk.Payment.find(pending_payment.payment_id)
    except paypalrestsdk.exceptions.ResourceNotFound as ex:
        print('Paypal resource not found: {}'.format(ex))
        abort(404)

    if payment.execute({"payer_id": payer_id}):
        pending_payment.state = payment.state
        pending_payment.updated_at = datetime.strptime(payment.update_time, "%Y-%m-%dT%H:%M:%SZ")
        db.session.commit()
        return render_template('payment/success.html', payment_id=payment.id, state=payment.state)

    return render_template('payment/error.html', payment_error=payment.error, step='Finallizing payment')
在成功单击按钮
付款
创建(状态为
已创建
)后,用户重定向到审批页面,这一切正常。在那里,他点击“确认”。。。当我指定return\u url时,我从未返回到我的应用程序!也就是说,应用程序永远不会被告知买方批准付款,并且应在我自己的数据库中更新,并应将新的许可证发送给此人

问题:

  • 我找不到使用
    pyhtonrestdk
    定义某个回调的方法。怎么做

  • 即使我使用
    数据回调添加回调(我尝试使用纯Javascript按钮代码嵌入快速签出),我的应用程序也没有被调用。我怀疑是因为远程服务器无法调用
    http://127.0.0.1/payment/paypal/success

  • 用户可以在点击“确认”后立即关闭PayPal确认窗口,所以我不能相信浏览器重定向,因为它稍后会执行


  • 最后,我怀疑我不清楚PayPal工作流,但我在开发者门户网站上找不到关于it事件的更多信息。

    像往常一样,魔鬼隐藏在细节中。我的主要问题如下:paypal没有将我重定向到我的应用程序,但我发现它(在确认后)将我重定向到类似于
    https://sandbox.paypal.com/带有查询字符串的
    包含所需的参数。也就是说,
    重定向\u URL
    按预期工作,只是将我重定向到错误的主机

    在那之后,我想起了
    url\u的
    generaterelative链接。因此,刚刚添加了关键字
    \u external=True
    我已被重定向到我的应用程序,并成功确认和执行了所有必需的参数和付款

    即,正确的
    重定向\u URL
    块将如下所示:

    'redirect_urls': {
        'return_url': url_for('payment_paypal_execute', _external=True),
        'cancel_url': url_for('payment_paypal_error', _external=True)
    }
    
    最后,我有以下工作流程:

  • 打开的
    /
    索引
    )有按钮
    用贝宝支付
    ,它是表单内的图像按钮。此按钮旁边的表单包含隐藏字段,其中包含金额、产品名称和数量(实际上,如果我们不信任用户,这不是一个好主意,因此我只存储
    产品\u许可证\u类型\u id
    ,该字段存储在DB中,并包含有关产品的所有必需信息)

  • 单击后,将其
    POST
    表单发布到“/payment/paypal”(paypal_create),其中创建对象
    payment
    ,并填充所有字段。如果调用
    payment.create
    成功完成,它还会在我自己的数据库中创建带有
    payment\u id
    state
    的记录(这些字段与paypal工作流相关,当然,实际上我正在存储与我的应用程序相关的两个其他字段)

  • 在PayPal端创建付款后,应用程序将查看列表
    付款链接的响应。我们想要一个带有
    rel=='approval\u url'
    method=='REDIRECT'
    的,并返回
    flask.REDIRECT(找到链接)

  • 在PayPal网站上,买家应单击“批准”,查看发货地址,然后他将立即重定向到
    重定向\u url。返回\u url
    ,并在查询字符串中使用以下参数:
    PayerID
    paymentId
    令牌

  • 一旦重定向回,您应该从查询字符串中获取此参数(请记住,它是区分大小写的!),使用PayPal API查找付款(
    payment=paypalrestsdk.payment.find(payment_id)
    )并完成它(
    payment.execute({“payer_id”:payer_id}):

  • 完成付款后,状态更改为“已批准”
  • 利润


  • UPD:您不需要在销售帐户首选项时启用“自动编辑”,这种方法适合将一个帐户集成到多个站点。

    我尝试重定向时遇到一些奇怪的CORS错误。“无法加载paypal.sandbox.com请求的资源上不存在“Access Control Allow Origin”标题。很抱歉,第二条评论,但在第3步,当我尝试重定向时,我得到“无法加载paypal.sandbox.com不存在“Access Control Allow Origin”。我正在本地运行flask。您是否遇到过这种情况?