如何从 React 前端向 Django 后端安全传递支付金额参数

落雪大大_6598

落雪大大_6598

2026-07-13

528人浏览

原创

如何从 React 前端向 Django 后端安全传递支付金额参数

本文详解如何通过 REST API 将 React 表单中的动态金额(如用户输入的付款数额)安全、可靠地传递至 Django 视图,并注入到银行网关支付流程中,替代硬编码的 amount = 5000。

本文详解如何通过 rest api 将 react 表单中的动态金额(如用户输入的付款数额)安全、可靠地传递至 django 视图,并注入到银行网关支付流程中,替代硬编码的 `amount = 5000`。

在实际支付集成场景中,将金额(amount)硬编码在 Django 视图里(如 amount = 5000)完全不可行——它必须由前端用户实时输入、经校验后动态传入后端,再交由 azbankgateways 等支付 SDK 使用。要实现这一目标,关键在于将原函数式视图升级为 DRF 的 API 视图,并正确处理 JSON 请求体与 CSRF 防护。

✅ 步骤一:改造 Django 视图为 APIView(推荐)或 @api_view

原 go_to_gateway_view 是一个普通 Django 函数视图(request 为 HttpRequest),默认解析 application/x-www-form-urlencoded 或表单数据,无法直接读取 application/json 请求体中的字段。因此需改用 Django REST Framework 提供的 @api_view 装饰器:

# views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from azbankgateways import bankfactories, models as bank_models
from azbankgateways.exceptions import AZBankGatewaysException
import logging

@api_view(['POST'])
def go_to_gateway_api(request):
    # ✅ 安全获取 JSON 请求体中的 amount 字段
    try:
        amount = int(request.data.get('amount', 0))
        if amount <blockquote>
<p>⚠️ 注意:  </p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8334" title="React Component Auditor"><img
														src="https://img.php.cn/upload/skill/000/000/081/179197570636698.jpg" alt="React Component Auditor" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill8334" title="React Component Auditor" class="overflowclass">React Component Auditor</a>
													<p class="overflowclass">审计 React 组件的性能、可访问性、Hook 正确性、属性设计和重渲染优化——识别 memo 优化点和状态管理方案</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill8334" title="React Component Auditor" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
<ul>
<li>不要使用 request.POST["amount"] —— 它只对 multipart/form-data 或 x-www-form-urlencoded 有效;JSON 请求需用 request.data(DRF 自动解析)。  </li>
<li>移除 render() 和 HTML 模板逻辑,API 视图应返回结构化 JSON 数据,跳转由前端控制更灵活、安全。  </li>
<li>若需保留原有 render 流程(不推荐),可改用 JsonResponse 并确保 Content-Type: application/json,但需自行处理 CSRF 和会话。</li>
</ul>
</blockquote><h3>✅ 步骤二:配置 URL 路由(替换旧路由)</h3><p>在 urls.py 中,将原函数视图路由替换为新 API 视图:</p><pre class="brush:php;toolbar:false;"># urls.py
from django.urls import path
from . import views

urlpatterns = [
    # ❌ 移除旧路由(如果存在):
    # path('go-to-gateway/', views.go_to_gateway_view, name='go-to-gateway'),

    # ✅ 新增 API 路由:
    path('api/go-to-gateway/', views.go_to_gateway_api, name='go-to-gateway-api'),
]

✅ 步骤三:完善 React 前端提交逻辑(含 CSRF 处理)

你的 React 代码基本正确,但需优化两点:CSRF Token 获取方式(避免依赖 jQuery)和 错误处理健壮性:

// AmountForm.jsx
import { useState } from 'react';

function getCookie(name) {
  let cookieString = document.cookie;
  let cookies = cookieString.split('; ');
  for (let cookie of cookies) {
    let [cookieName, cookieValue] = cookie.split('=');
    if (cookieName === name) return decodeURIComponent(cookieValue);
  }
  return null;
}

function AmountForm() {
  const [amount, setAmount] = useState('');
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState('');

  const handleSubmit = async (event) => {
    event.preventDefault();
    setLoading(true);
    setError('');

    const csrftoken = getCookie('csrftoken');
    if (!csrftoken) {
      setError('CSRF token missing. Please reload the page.');
      setLoading(false);
      return;
    }

    try {
      const response = await fetch('http://127.0.0.1:8000/api/go-to-gateway/', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-CSRFToken': csrftoken,
        },
        body: JSON.stringify({ amount: parseInt(amount, 10) }),
      });

      if (!response.ok) {
        const errData = await response.json();
        throw new Error(errData.error || 'Failed to initialize payment');
      }

      const result = await response.json();
      console.log('Gateway ready:', result);
      // ✅ 前端跳转至网关(比服务端 render 更可控)
      window.location.href = result.gateway_url;
    } catch (err) {
      setError(err.message);
      console.error(err);
    } finally {
      setLoading(false);
    }
  };

  return (
    
{error &&

{error}

}
); } export default AmountForm;

✅ 关键注意事项总结

  • CSRF 安全:Django 默认启用 CSRF 保护。确保前端请求携带有效的 X-CSRFToken(从 csrftoken Cookie 读取),且后端视图未被 @csrf_exempt 错误移除防护。
  • 数据验证:永远不要信任前端输入!后端必须校验 amount 类型、范围与业务逻辑(如最小值、是否整数)。
  • 响应设计:API 应返回轻量 JSON(如网关 URL),而非渲染页面——这符合前后端分离原则,也便于错误调试与移动端适配。
  • 调试技巧:在 Django 视图开头添加 print(request.data) 和 print(request.content_type),确认请求体被正确解析。

完成以上改造后,React 输入的任意合法金额即可实时驱动 Django 支付流程,彻底告别硬编码,构建真正灵活、可维护的支付集成方案。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

react django rest api 前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6530

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5946

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5523

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6530

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6178

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

883

5

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

2026.02.24

226

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 12.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习