如何解决如何在Django电子商务项目中将Paypal添加到Payment中
我一直在寻找将PayPal付款添加到我的电子商务项目中的最佳方法,但是我目前仍无法确定从何处开始,我已经阅读了以下内容中的PayPal文档
https://developer.paypal.com/demo/checkout/#/pattern/radio
当前,当用户将商品添加到购物车时,在结帐页面中有一个表格需要填写,因此添加地址后,有一个单选按钮可供选择,以继续使用Stripe还是PayPal,所以我的问题是我应该怎么做,以便在选择PayPal收音机后打开PayPal登录窗口?
这是模型。py
class Payment(models.Model):
stripe_charge_id = models.CharField(max_length=50)
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET_NULL,blank=True,null=True)
amount = models.FloatField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.user.username
这是views.py
class CheckoutView(View):
def get(self,*args,**kwargs):
try:
order = Order.objects.get(user=self.request.user,ordered=False)
form = CheckoutForm()
context = {
'form': form,'couponform': CouponForm(),'order': order,'DISPLAY_COUPON_FORM': True
}
shipping_address_qs = Address.objects.filter(
user=self.request.user,address_type='S',default='True'
)
if shipping_address_qs.exists():
context.update(
{'default_shipping_address': shipping_address_qs[0]})
billing_address_qs = Address.objects.filter(
user=self.request.user,address_type='B',default='True'
)
if billing_address_qs.exists():
context.update(
{'default_billing_address': billing_address_qs[0]})
return render(self.request,"checkout.html",context)
except ObjectDoesNotExist:
messages.info(self.request,"You do not have an active order")
return redirect("core:checkout")
def post(self,**kwargs):
form = CheckoutForm(self.request.POST or None)
try:
order = Order.objects.get(user=self.request.user,ordered=False)
if form.is_valid():
use_default_shipping = form.cleaned_data.get(
'use_default_shipping')
if use_default_shipping:
print("Using the defualt shipping address")
address_qs = Address.objects.filter(
user=self.request.user,default=True
)
if address_qs.exists():
shipping_address = address_qs[0]
order.shipping_address = shipping_address
order.save()
else:
messages.info(
self.request,"No default shipping address available")
return redirect('core:checkout')
else:
print("User is entering a new shipping address")
shipping_address1 = form.cleaned_data.get(
'shipping_address')
shipping_address2 = form.cleaned_data.get(
'shipping_address2')
shipping_province = form.cleaned_data.get(
'shipping_province')
shipping_country = form.cleaned_data.get(
'shipping_country')
shipping_postal_code = form.cleaned_data.get(
'shipping_postal_code')
shipping_phone_number = form.cleaned_data.get(
'shipping_phone_number')
if is_valid_form([shipping_address1,shipping_province,shipping_country,shipping_postal_code,shipping_phone_number]):
shipping_address = Address(
user=self.request.user,street_address=shipping_address1,apartment_address=shipping_address2,province=shipping_province,country=shipping_country,postal_code=shipping_postal_code,phone_number=shipping_phone_number,address_type='S'
)
shipping_address.save()
order.shipping_address = shipping_address
order.save()
set_default_shipping = form.cleaned_data.get(
'set_default_shipping')
if set_default_shipping:
shipping_address.default = True
shipping_address.save()
else:
messages.info(
self.request,"Please fill in the required shipping address fields")
use_default_billing = form.cleaned_data.get(
'use_default_billing')
same_billing_address = form.cleaned_data.get(
'same_billing_address')
if same_billing_address:
billing_address = shipping_address
billing_address.pk = None
billing_address.save()
billing_address.address_type = 'B'
billing_address.save()
order.billing_address = billing_address
order.save()
elif use_default_billing:
print("Using the default billing address")
address_qs = Address.objects.filter(
user=self.request.user,default='True'
)
if address_qs.exists():
billing_address = address_qs[0]
order.billing_address = billing_address
order.save()
else:
messages.info(
self.request,"No default billing address available")
return redirect('core:checkout')
else:
print("User is entering a new billing address")
billing_address1 = form.cleaned_data.get(
'billing_address')
billing_address2 = form.cleaned_data.get(
'billing_address2')
billing_province = form.cleaned_data.get(
'billing_province')
billing_country = form.cleaned_data.get(
'billing_country')
billing_postal_code = form.cleaned_data.get(
'billing_postal_code')
billing_phone_number = form.cleaned_data.get(
'billing_phone_number')
if is_valid_form([billing_address1,billing_province,billing_country,billing_postal_code,billing_phone_number]):
billing_address = Address(
user=self.request.user,street_address=billing_address1,apartment_address=billing_address2,province=billing_province,country=billing_country,postal_code=billing_postal_code,phone_number=billing_phone_number,address_type='B'
)
billing_address.save()
order.billing_address = billing_address
order.save()
set_default_billing = form.cleaned_data.get(
'set_default_billing')
if set_default_billing:
billing_address.default = True
billing_address.save()
else:
messages.info(
self.request,"Please fill in the required billing address fields")
return redirect('core:checkout')
payment_option = form.cleaned_data.get('payment_option')
if payment_option == 'S':
return redirect('core:payment',payment_option='stripe')
elif payment_option == 'P':
return redirect('core:payment',payment_option='paypal')
else:
messages.warning(
self.request,"Invalid payment option selected")
return redirect('core:checkout')
except ObjectDoesNotExist:
messages.warning(self.request,"You do not have an active order")
return redirect("core:order-summary")
这是表格。py
PAYMENT_CHOICES = (
('S','Stripe'),('P','Paypal')
)
class CheckoutForm(forms.Form):
shipping_address = forms.CharField(required=False)
shipping_address2 = forms.CharField(required=False)
shipping_province = forms.CharField(required=False)
shipping_country = CountryField(blank_label='(select country)').formfield(
required=False,widget=CountrySelectWidget(attrs={
'class': 'custom-select d-block w-100'
}))
shipping_postal_code = forms.CharField(required=False)
shipping_phone_number = forms.CharField(required=False)
billing_address = forms.CharField(required=False)
billing_address2 = forms.CharField(required=False)
billing_province = forms.CharField(required=False)
billing_country = CountryField(blank_label='(select country)').formfield(
required=False,widget=CountrySelectWidget(attrs={
'class': 'custom-select d-block w-100'
}))
billing_postal_code = forms.CharField(required=False)
billing_phone_number = forms.CharField(required=False)
same_billing_address = forms.BooleanField(required=False)
set_default_shipping = forms.BooleanField(required=False)
use_default_shipping = forms.BooleanField(required=False)
set_default_billing = forms.BooleanField(required=False)
use_default_billing = forms.BooleanField(required=False)
payment_option = forms.ChoiceField(
widget=forms.RadioSelect,choices=PAYMENT_CHOICES)
解决方法
我建议在您的服务器上创建两条路由,一条用于“设置交易”,一条用于“捕获交易”,记录在这里:https://developer.paypal.com/docs/checkout/reference/server-integration/
选中“ PayPal”单选按钮后,您可以使此事件触发javascript取消隐藏Paypal按钮容器div,类似于:https://developer.paypal.com/demo/checkout/#/pattern/server
对于您的用例,最好使用layout: 'horizontal'
。
在https://developer.paypal.com/demo/checkout/#/pattern/radio
处有一个示例基本HTML / JS实现与单选按钮相结合。拥有黄色的PayPal按钮和任何本地“替代”付款方式(如PP Credit PayPal)决定默认在其旁边显示购买者是很值得的(预先选中了单选按钮,或者根本没有任何单选按钮,只有信用卡即可)表单也显示在其下方)。这将增加您的转化次数,点击次数越少越好-PayPal的卖点在于,通过尽可能少的点击次数进行安全的结帐就可以吸引买家。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。