Могу ли я установить платежный шлюз по умолчанию и скрыть переключатель для выбора платежных шлюзов у ​​продавца или продавца? - PullRequest
1 голос
/ 26 апреля 2019

Я пытался скрыть процесс оформления заказа на моем сайте продавца, потому что я думаю, что процесс выбора шлюза оплаты до оплаты может сбить людей с толку.

Я искал много документов и почти неделю пытался понять и изменить коды, связанные с процессом оплаты. Это не увенчалось успехом из-за моего плохого понимания фреймворка django.

Пожалуйста, помогите мне и дайте мне знать некоторые подсказки о том, где и что я должен изучить. Если это возможно, научите меня, как настроить платежный шлюз по умолчанию и скрыть варианты выбора платежного шлюза.

Я думаю, что это связано с тремя файлами.

  1. saleor / шаблоны / заказ / pavement.html Изменяя шаблон дорожного покрытия, мне удается создать платежный шлюз по умолчанию и скрыть переключатели, но всякий раз, когда он был скрыт, обработка платежа также не выполнялась (При успешной оплате URL должен быть изменен с 'http://127.0.0.1:8000/ko/order/[ токена заказа] / payment / 'to' http://127.0.0.1:8000/ko/order/[ токен заказа] / payment / [имя платежного шлюза] / 'но когда я скрыл переключатель, URL не был изменен.)

  2. saleor / saleor / заказ / views.py

  3. saleor / saleor / заказ / forms.py

    Я догадался, что информация о шлюзе платежей переносится из payment.html в функцию start_payment из views.py и в некоторой степени относится к классу PaymentsForms в forms.py. Я пытался проанализировать и понять эти коды, но я застрял.

некоторая часть кода в '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>

Функция 'start_payment' в 'saleor / saleor / order / views.py'

@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)

Класс 'PaymentsForms' в 'saleor / saleor / order / forms.py'

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 голосов
/ 13 июня 2019

Я решил вашу проблему, изменив только несколько строк кода.

Я начал выбирать только один платежный шлюз (для меня: BrainTree), для этого вам нужно вставить только тот платежный шлюз, который вы хотитеразрешить в вашей электронной коммерции.Измените dict 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, пользователь будет перенаправлен на конкретную страницу оплаты, выбранную в предыдущем файле.

Надеюсь, я вам помог.

...