1 课程详情页面
-播放器组件
2 课程章节接口
-所有课程章节全拿回来(过滤:按课程id过滤)
3 支付宝支付
-生成公钥私钥,把公钥配置在支付宝上---》生成一个支付宝公钥
-支付宝公钥,自己的私钥,放到了项目中
-API,没有提供sdk,第三方的sdk
-安装,安装步骤扣代码
-生成一个对象(一堆参数)
-调用对象的方法生成支付连接(一堆参数),需要拼连接地址
-拿到连接地址就可以打开支付宝,付款了
-两个回调
-get回调,调前端(传回很多参数),当vue挂载时候,也向后端发送一个请求,携带数据
-post回调,以它为准,修改订单状态
-如果刚支付成功,服务挂掉(24小时以内只要启动服务即可,支付宝会发送8次回调)
-基于sdk封装包
-
1 支付接口
1 post请求---》携带数据什么样
{courses:[1,2,3],subject:'订单标题',pay_type:'1',total_amount:'199'}
2 视图类
-自动生成路由,新增类
-重写create方法
-写序列化类
-validate中校验
-5个步骤(在serializer的validate)
-校验钱是否正确
-生成订单号(uuid,分布式id的生成)
-获取当前登录用户(request.user)
-生成支付链接(context)
-入库前准备(把user,订单号放到字典中)
-入库(重写create方法)
-入两个库
1.1 视图类
class PayView(GenericViewSet, CreateModelMixin):
# class PayView(ViewSetMixin,CreateAPIView):
# 认证类,权限类
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated,]
queryset = Order.objects.all()
serializer_class = OrderModelSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, context={'request': request})
# OrderModelSerializer(data=request.data,context={'request':request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
# serializer.save()
pay_url = serializer.context['pay_url']
return APIResponse(pay_url=pay_url)
1.2 序列化类
class OrderModelSerializer(serializers.ModelSerializer):
# courses:[1,2,3]
# 转换成courses:[obj1,obj2,obj3]
courses = serializers.PrimaryKeyRelatedField(queryset=Course.objects.all(), many=True)
class Meta:
model = Order
fields = [
'courses',
'subject',
'pay_type',
'total_amount'
]
def _check_money(self, attrs):
# 校验钱是否合法
total_amount = attrs.get('total_amount')
total = 0
for course in attrs.get('courses'):
total += course.price
if total_amount == total:
return total_amount
else:
raise ValidationError('钱不对')
def _get_trade_no(self):
trade_no = str(uuid.uuid4()).replace('-', '')
return trade_no
def _get_user(self):
return self.context['request'].user
def _get_pay_url(self, subject, trade_no, total_amount):
from luffyapi.libs.alpay import alipay
res = alipay.api_alipay_trade_page_pay(
subject=subject,
out_trade_no=trade_no,
total_amount=float(total_amount), # 转成float类型
return_url=settings.RETURN_URL,
notify_url=settings.NOTIFY_URL
)
pay_url = pay_settings.GATEWAY + res # 支付链接
self.context['pay_url'] = pay_url
def _pre_model(self, attrs, user, total_amount, trade_no):
attrs['user'] = user
attrs['total_amount'] = total_amount
attrs['out_trade_no'] = trade_no
# courses需要pop出来,但是不着急
def validate(self, attrs):
# -校验钱是否正确
total_amount = self._check_money(attrs)
# -生成订单号(uuid,分布式id的生成)
trade_no = self._get_trade_no()
# -获取当前登录用户(request.user)
user = self._get_user()
# -生成支付链接(context)
self._get_pay_url(attrs['subject'], trade_no, total_amount)
# -入库前准备(把user,订单号放到字典中)
self._pre_model(attrs, user, total_amount, trade_no)
return attrs
def create(self, validated_data):
courses = validated_data.