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工作流,但我在开发者门户网站上找不到关于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。您是否遇到过这种情况?