Jestem trochę źle zrozumiany Paypal flow event po przeczytaniu https://developer.paypal.com/docs/api/. Chciałbym zintegrować płatności ekspresowe i płatności kartą kredytową z moją witryną. Używam Flask
i paypalrestsdk
bez żadnych rozszerzeń Flask.Integracja Paypal z aplikacją Flask
Oto fragmenty z mojej aplikacji:
@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')
Jest działa dobrze, po kliknięciu na przycisk payment
stworzonej pomyślnie (z państwowej created
) użytkownik przekierowany do strony zatwierdzania. Tam kliknij "Potwierdź" ... I nigdy nie wróciłem do mojej aplikacji, zdarzenia, gdy określam return_url! To znaczy. wniosek nigdy nie może zostać poinformowany, że kupujący zatwierdził płatność i powinien zostać zaktualizowany we własnej bazie danych, a nowa licencja powinna zostać wysłana do tej osoby.
Problemy:
nie mogę znaleźć sposób, aby zdefiniować kilka zwrotnego używając
pyhtonrestsdk
. Jak to zrobić?Nawet jeśli dodałem funkcję oddzwaniania (próbowałem umieścić Express Checkout przy użyciu czystego kodu przycisku Javascript) z
data-callback
, moja aplikacja nie została wywołana. Podejrzewam, że serwer zdalny nie mógł zadzwonić pod numerhttp://127.0.0.1/payment/paypal/success
Użytkownik może zamknąć okno z potwierdzeniem PayPal natychmiast po kliknięciu "Potwierdź", więc nie mogłem ufać przekierowaniu przeglądarki, które wykonał później.
Wreszcie, podejrzewam, że nie rozumiem przepływu pracy PayPal jest jasne, ale nie mogłem znaleźć więcej informacji o tym zdarzeniu na portalu deweloperów.
Dostaję jakiś dziwny błąd CORS, gdy próbuję przekierować. "Nie można załadować strony paypal.sandbox.com. Żądany zasób nie zawiera nagłówka" Access-Control-Allow-Origin "." – shell