我可以设置默认付款网关并隐藏单选框以在saleor中选择付款网关吗?

时间:2019-04-26 16:03:44

标签: saleor

我一直试图隐藏销售网站的结帐流程,因为我认为在付款之前选择付款网关的流程会使人们感到困惑。

我搜索了很多文档,并试图了解和修改与付款流程相关的代码将近一周。由于我对django框架的了解不足,因此未能成功。

请帮帮我,让我知道一些有关我应该去哪里和去找什么的提示。如果可以,请教我如何设置默认付款网关并隐藏用于选择付款网关的选项。

我认为它与三个文件有关。

  1. saleor / templates / order / pavement.html 通过修改路面模板,我成功制作了默认的支付网关并隐藏了单选按钮,但是无论何时隐藏它,支付处理也都不会继续进行(成功支付后,网址应更改为'http://127.0.0.1:8000/ko/order/[订单令牌] / payment /'更改为'http://127.0.0.1:8000/ko/order/[订单令牌] / payment / [付款网关名称] /',但是当我隐藏单选按钮时,网址未更改。)

  2. saleor / saleor / order / views.py

  3. saleor / saleor / order / forms.py

    我猜想支付网关信息正在从Payment.html转移到views.py的start_payment函数,并且与forms.py中的PaymentsForms类相关。我一直在尝试分析和理解这些代码,但被卡住了。

“ saleor / templates / order / pavement.html”中的部分代码

            <h3>
              <b>{% trans "Choose payment method" %}</b>
            </h3>
            <div class="checkout__payment-form">
              <form method="post" action="{% url "order:payment" token=order.token %}" class="payment-form radio">
                {% csrf_token %}
                {% for choice in payment_form.gateway %}
                  <div class="radio checkout__payment-form__choice">
                    <label>
                      <div class="card card-default">
                        <div class="card-body">
                          <strong>
                            {{choice}}
                          </strong>
                        </div>
                      </div>
                    </label>
                  </div>
                {% endfor %}
                {% block form_submit %}
                  <button type="submit" class="btn btn-primary">
                    {% trans "Proceed to payment" context "Payment details primary action" %}
                  </button>
                {% endblock %}
              </form>
            </div>

“ saleor / saleor / order / views.py”中的“ start_payment”功能

@check_order_status
def start_payment(request, order, gateway):
    payment_gateway, connection_params = get_payment_gateway(gateway)
    #payment_gateway, connection_params = get_payment_gateway('Dummy gateway')
    extra_data = {'customer_user_agent': request.META.get('HTTP_USER_AGENT')}
    with transaction.atomic():
        payment = create_payment(
            gateway=gateway,
            currency=order.total.gross.currency,
            email=order.user_email,
            billing_address=order.billing_address,
            customer_ip_address=get_client_ip(request),
            total=order.total.gross.amount,
            order=order,
            extra_data=extra_data)

        if (order.is_fully_paid()
                or payment.charge_status == ChargeStatus.FULLY_REFUNDED):
            return redirect(order.get_absolute_url())

        payment_info = create_payment_information(payment)
        form = payment_gateway.create_form(
            data=request.POST or None,
            payment_information=payment_info,
            connection_params=connection_params)
        if form.is_valid():
            try:
                gateway_process_payment(
                    payment=payment, payment_token=form.get_payment_token())
            except Exception as exc:
                form.add_error(None, str(exc))
            else:
                if order.is_fully_paid():
                    return redirect('order:payment-success', token=order.token)
                return redirect(order.get_absolute_url())

    client_token = payment_gateway.get_client_token(
        connection_params=connection_params)
    ctx = {
        'form': form,
        'payment': payment,
        'client_token': client_token,
        'order': order}
    return TemplateResponse(request, payment_gateway.TEMPLATE_PATH, ctx)

“ saleor / saleor / order / forms.py”中的“ PaymentsForms”类

PAYMENT_CHOICES = [
    (k, v) for k, v in settings.CHECKOUT_PAYMENT_GATEWAYS.items()]


class PaymentsForm(forms.Form):
    gateway = forms.ChoiceField(
        label=pgettext_lazy('Payments form label', 'Payment Method'),
        choices=PAYMENT_CHOICES,
        initial=PAYMENT_CHOICES[0][0],
        widget=forms.RadioSelect)

我试图设置默认的支付网关并隐藏用于选择支付网关的单选框,但是失败了。

1 个答案:

答案 0 :(得分:0)

我只修改了几行代码就解决了您的问题。

我开始只选择一个支付网关(对我来说:BrainTree),因此您只需插入要允许在电子商务中使用的支付网关。 修改文件CHECKOUT_PAYMENT_GATEWAYS中的字典saleor/settings.py

CHECKOUT_PAYMENT_GATEWAYS = {
  BRAINTREE: pgettext_lazy('Payment method name', 'Brain tree')
}

然后,您必须将用户从存在单选按钮的页面重定向到唯一的一个付款选项页面。 修改文件payment中的函数saleor/order/views.py,并添加一个我称为exist_one_gateway的第二个函数。

def payment(request, token):
    [...]
    if not order.is_pre_authorized():
        payment_form = PaymentsForm(form_data)
        if payment_form.is_valid():
            payment = payment_form.cleaned_data['gateway']
            return redirect(
                'order:payment', token=order.token, gateway=payment)
        elif exist_one_gateway():
            payment = list(settings.CHECKOUT_PAYMENT_GATEWAYS.items())[0][0]
            return redirect(
                'order:payment', token=order.token, gateway=payment)
    [...]
    return TemplateResponse(request, 'order/payment.html', ctx)


    def exist_one_gateway():
        gateway = list(settings.CHECKOUT_PAYMENT_GATEWAYS.items())
    return len(gateway) == 1

payment函数可用于两个不同的页面,第一个页面用于您必须单击您要选择的支付网关的单选按钮(我们要跳过的页面)的页面,以及具体的付款选项页面。

由于这个原因,我添加了一个条件,即,如果payment_form无效(这意味着没有人提交付款),那么将验证是否只有一个付款选项。如果为True,则用户将被重定向到上一个文件中选择的特定付款页面。

我希望我能帮上忙。