Django-ecommerce支付集成实战:Stripe API深度配置与安全处理

张开发
2026/4/20 6:49:18 15 分钟阅读

分享文章

Django-ecommerce支付集成实战:Stripe API深度配置与安全处理
Django-ecommerce支付集成实战Stripe API深度配置与安全处理【免费下载链接】django-ecommerceAn e-commerce website built with Django项目地址: https://gitcode.com/gh_mirrors/dj/django-ecommerceDjango-ecommerce是一个基于Django构建的电子商务网站本文将详细介绍如何在该项目中集成Stripe支付API包括深度配置和安全处理方法帮助开发者快速实现安全可靠的 payment功能。准备工作Stripe环境配置在开始集成Stripe之前需要先进行环境配置。首先确保项目中已经安装了Stripe库可以查看项目的 requirements.txt 文件其中包含了Stripe的版本信息stripe2.27.0。接下来需要配置Stripe的API密钥。在项目中开发环境和生产环境的密钥是分开配置的分别位于 djecommerce/settings/development.py 和 djecommerce/settings/production.py 文件中开发环境STRIPE_PUBLIC_KEY config(STRIPE_TEST_PUBLIC_KEY)生产环境STRIPE_PUBLIC_KEY config(STRIPE_LIVE_PUBLIC_KEY)Django-ecommerce支付页面展示包含Stripe支付表单前端集成Stripe Elements实现在前端页面中我们使用Stripe Elements来创建安全的支付表单。相关代码位于 templates/payment.html 文件中。首先需要引入Stripe的JavaScript库script srchttps://js.stripe.com/v3//script然后初始化Stripe对象使用之前配置的公钥var stripe Stripe({{STRIPE_PUBLIC_KEY}}); var elements stripe.elements();创建支付表单元素form action. methodpost classstripe-form idstripe-form div classstripe-form-row idcreditCard label forcard-element idstripeBtnLabel div idcard-element classStripeElement StripeElement--empty !-- Stripe将在这里插入信用卡输入表单 -- /div /div div classstripe-form-row button idstripeBtnSubmit Payment/button /div /form最后添加表单提交事件处理创建支付令牌并发送到后端var form document.getElementById(stripe-form); form.addEventListener(submit, function(event) { event.preventDefault(); stripe.createToken(card).then(function(result) { if (result.error) { // 处理错误 } else { stripeTokenHandler(result.token); } }); }); function stripeTokenHandler(token) { var form document.getElementById(stripe-form); var hiddenInput document.createElement(input); hiddenInput.setAttribute(type, hidden); hiddenInput.setAttribute(name, stripeToken); hiddenInput.setAttribute(value, token.id); form.appendChild(hiddenInput); form.submit(); }后端实现支付处理逻辑后端的支付处理逻辑主要在 core/views.py 文件的 PaymentView 类中实现。该类处理支付请求包括创建支付记录、处理支付结果等。获取支付页面当用户访问支付页面时get方法会被调用准备支付所需的数据class PaymentView(View): def get(self, *args, **kwargs): order Order.objects.get(userself.request.user, orderedFalse) if order.billing_address: context { order: order, DISPLAY_COUPON_FORM: False, STRIPE_PUBLIC_KEY : settings.STRIPE_PUBLIC_KEY } userprofile self.request.user.userprofile if userprofile.one_click_purchasing: # 获取用户的卡列表 cards stripe.Customer.list_sources( userprofile.stripe_customer_id, limit3, objectcard ) card_list cards[data] if len(card_list) 0: # 使用默认卡更新上下文 context.update({ card: card_list[0] }) return render(self.request, payment.html, context) else: messages.warning( self.request, You have not added a billing address) return redirect(core:checkout)处理支付请求当用户提交支付表单时post方法会处理支付请求def post(self, *args, **kwargs): order Order.objects.get(userself.request.user, orderedFalse) form PaymentForm(self.request.POST) userprofile UserProfile.objects.get(userself.request.user) if form.is_valid(): token form.cleaned_data.get(stripeToken) save form.cleaned_data.get(save) use_default form.cleaned_data.get(use_default) if save: if userprofile.stripe_customer_id ! and userprofile.stripe_customer_id is not None: customer stripe.Customer.retrieve( userprofile.stripe_customer_id) customer.sources.create(sourcetoken) else: customer stripe.Customer.create( emailself.request.user.email, ) customer.sources.create(sourcetoken) userprofile.stripe_customer_id customer[id] userprofile.one_click_purchasing True userprofile.save() amount int(order.get_total() * 100) # 转换为美分 try: if use_default or save: # 使用客户ID进行支付 charge stripe.Charge.create( amountamount, # 美分 currencyusd, customeruserprofile.stripe_customer_id ) else: # 使用一次性令牌进行支付 charge stripe.Charge.create( amountamount, # 美分 currencyusd, sourcetoken ) # 创建支付记录 payment Payment() payment.stripe_charge_id charge[id] payment.user self.request.user payment.amount order.get_total() payment.save() # 更新订单状态 order_items order.items.all() order_items.update(orderedTrue) for item in order_items: item.save() order.ordered True order.payment payment order.ref_code create_ref_code() order.save() messages.success(self.request, Your order was successful!) return redirect(/)错误处理全面的异常捕获在支付过程中可能会遇到各种错误我们需要全面捕获并处理这些异常except stripe.error.CardError as e: body e.json_body err body.get(error, {}) messages.warning(self.request, f{err.get(message)}) return redirect(/) except stripe.error.RateLimitError as e: # 调用API过于频繁 messages.warning(self.request, Rate limit error) return redirect(/) except stripe.error.InvalidRequestError as e: # 提供给Stripe API的参数无效 print(e) messages.warning(self.request, Invalid parameters) return redirect(/) except stripe.error.AuthenticationError as e: # Stripe API身份验证失败 messages.warning(self.request, Not authenticated) return redirect(/) except stripe.error.APIConnectionError as e: # 与Stripe的网络通信失败 messages.warning(self.request, Network error) return redirect(/) except stripe.error.StripeError as e: # 向用户显示通用错误 messages.warning( self.request, Something went wrong. You were not charged. Please try again.) return redirect(/) except Exception as e: # 发生严重错误通知管理员 messages.warning( self.request, A serious error occurred. We have been notified.) return redirect(/)安全最佳实践使用HTTPS确保所有支付相关的通信都通过HTTPS进行防止中间人攻击。不要存储敏感信息不要在数据库中存储信用卡信息使用Stripe的令牌化功能。验证订单金额在后端再次验证订单金额防止前端被篡改。使用Stripe的Webhook实现Stripe的Webhook以便在支付状态发生变化时得到通知。定期更新Stripe库保持Stripe库的最新版本以获取最新的安全修复和功能。通过以上步骤我们成功地在Django-ecommerce项目中集成了Stripe支付API并实现了安全可靠的支付功能。这个集成方案不仅满足了基本的支付需求还考虑了用户体验和安全性为电子商务网站提供了一个完整的支付解决方案。要开始使用这个项目你可以通过以下命令克隆仓库git clone https://gitcode.com/gh_mirrors/dj/django-ecommerce然后按照项目文档进行环境配置和Stripe API密钥设置即可快速搭建一个具有完整支付功能的电子商务网站。【免费下载链接】django-ecommerceAn e-commerce website built with Django项目地址: https://gitcode.com/gh_mirrors/dj/django-ecommerce创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章