我正在使用django-oscar框架开发一个购物网站,实际上我正在使用他们的沙箱网站。 我想在结账过程中添加付款功能,但问题是,我完全困惑了!
我阅读了这个链接:"Oscar's payment integration docs"
我理解了大致内容。 我还阅读了checkout应用程序中的views.py文件,但我有一些问题在网上找不到答案。
我的问题是,我应该重写或创建哪些方法/类来处理以下过程:
用户请求付款后,我应该向银行发送请求并提供所需的参数(代码中的pay_request_parameters)。
然后,他们将发送一个Id,确认我的访问,然后我应该将该Id发布到地址并将用户重定向到银行的网页。
用户成功向银行支付后,他们将通过在第一步提供的回调URL进行POST通知我。
通过这些信息,如果付款成功,我应该要求银行结算,以向我发送款项。
现在我拥有的代码执行前两个步骤,但我不知道如何处理沙箱中重定向后的过程。 这是我的代码:
from oscar.apps.checkout import views
from oscar.apps.payment import models
from oscar.apps.payment.exceptions import *
import requests
import datetime
mellat_services_url = 'https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl'
start_pay_url = 'https://bpm.shaparak.ir/pgwchannel/startpay.mellat'
terminal_id = 'xxx'
username = 'xxx'
password = 'xxx'
# Subclass the core Oscar view so we can customise
class PaymentDetailsView(views.PaymentDetailsView):
def handle_payment(self, order_number, total, **kwargs):
# Talk to payment gateway. If unsuccessful/error, raise a
# PaymentError exception which we allow to percolate up to be caught
# and handled by the core PaymentDetailsView.
# mellat cycle start
local_date = str(datetime.date.today())[0:4] + str(datetime.date.today())[5:7] + str(datetime.date.today())[8:10]
local_time = str(datetime.datetime.now().time())[0:2] + str(datetime.datetime.now().time())[3:5] + str(datetime.datetime.now().time())[6:8]
# call bpPayRequest and get refId
pay_request_parameters = {'terminalId': terminal_id, 'userName': username,
'userPassword': password, 'orderId': order_number,
'amount': total.incl_tax, 'localDate': local_date,
'localTime': local_time, 'additionalData': ""
'callBackUrl': 'mysite.com/checkout/preview/'}
pay_request_answer = requests.post(mellat_services_url, pay_request_parameters)
if not pay_request_answer.split(",")[0] == 0:
response_code = pay_request_answer.split(",")[0]
if response_code[0] == '1':
raise UnableToTakePayment()
else:
raise PaymentError()
requests.post(start_pay_url, pay_request_answer.split(",")[1])
raise RedirectRequired(start_pay_url)
# post the refId to bank and then redirect customer to the bank
# apparently wait for the bank ( like for 10 mins ) to get the payment status
# if the bank responded with success, the you verify the payment with a post to the bank
# if everything was verified, tell the bank for a settlement
# mellat cycle end
#The rest should be implemented but I dont know where I should put this
#All I know is that it should be done after the verification with the data
#sent from the bank.
reference = gateway.pre_auth(order_number, total.incl_tax, kwargs['bankcard'])
# Payment successful! Record payment source
source_type, __ = models.SourceType.objects.get_or_create(
name="SomeGateway")
source = models.Source(
source_type=source_type,
amount_allocated=total.incl_tax,
reference=reference)
self.add_payment_source(source)
# Record payment event
self.add_payment_event('pre-auth', total.incl_tax)
thanks in advance.