Skip to main content

支付宝创建订单实现

在支付过程中,我们需要先创建订单,然后调用支付宝的接口来完成支付。本文将介绍如何使用Python和Django框架实现支付宝创建订单的功能。

创建订单

首先,我们需要在models.py文件中定义订单表的字段。假设我们的订单表有以下字段:

  • profile:用户相关信息
  • card:卡片实例对象
  • order_number:订单号
  • alipay_order_number:支付宝订单号
  • order_status:订单状态
  • payment_type:支付类型
  • order_amount:订单金额
  • payment_time:支付时间

然后,在视图函数中,我们可以使用以下代码创建订单:

dx_movie/trade/views.py
class AlipayAPIView(APIView):
def get(self, request):
card_id = request.GET.get('card_id', None)
try:
card = Card.objects.get(pk=card_id)
except:
return Response(response_data(*TradeError.CardParamsError))
out_trade_no = "pay" + datetime.now().strftime("%Y%m%d%H%M%S") + get_random_code(4)
# 创建订单
try:
Order.objects.create(
profile = Profile.objects.get(user=request.user),
card = card,
order_sn = out_trade_no,
order_mount = card.card_price,
pay_time = timezone.now() # 2023-09-13 15:32:58.148725+09:00
)
except:
return Response(response_data(*TradeError.OrderCreateError))
# 请求支付
try:
alipay = Alipay()
pay_url = alipay.trade_page( out_trade_no, str(card.card_price), card.card_name, '支付宝支付', 'FAST_INSTANT_TRADE_PAY')
return Response(pay_url)
except:
return Response(response_data(*TradeError.PayRequestError))
代码解析
  1. 导入模块和类
    • utils.error 导入 TradeError, UserError, 和 response_data。这些是自定义的错误处理和响应格式化工具。
    • utils.zhifubao 导入 Alipay 类,这个类可能封装了与支付宝交互的方法。
  2. 定义视图 AlipayAPIView
    • 继承自 APIView,表示这是一个处理HTTP请求的视图类。
  3. get 方法
    • 通过 HTTP GET 请求触发。
    • 从请求的查询参数中获取 card_id
    • 使用 card_id 尝试从数据库中获取一个 Card 实例。如果失败,返回一个包含 TradeError.CardParamsError 的响应。
    • 生成一个新的订单编号(out_trade_no),赋值给 order_sn,并尝试创建一个新的订单实例 Order。如果创建失败,返回一个包含 TradeError.OrderCreateError 的响应。
    • 使用 Alipay 类实例化一个 alipay 对象,调用其 trade_page 方法发起支付请求。这个方法可能生成一个支付页面的 URL。
    • 如果支付请求成功,返回包含支付 URL 的响应;如果失败,返回一个包含 TradeError.PayRequestError 的响应。
  4. 错误处理
    • 在尝试获取 Card 实例、创建 Order 实例、获取现有订单、或发起支付请求时,如果遇到异常,都会返回相应的错误响应。这是通过捕获异常并返回包含特定错误信息的响应来实现的。
  5. 生成订单编号
    • 如果没有提供订单编号 (order_sn),则生成一个新的编号,格式为 "pay" + 当前时间的字符串表示 + 一个随机码。这个随机码可能是为了确保订单编号的唯一性。
  6. 订单和支付处理逻辑
    • 根据是否提供 order_sn 来决定是创建新订单还是使用现有订单进行支付。
    • 如果是新订单,需要创建 Order 实例,设置相关字段,如用户、卡片、订单编号、订单金额、支付时间等,并保存到数据库。
    • 如果使用现有订单,需要检查订单状态是否允许支付。
    • 发起支付请求,生成支付页面的 URL,供用户完成支付操作。

这段代码展示了一个典型的在线支付处理流程,从接收请求、验证参数、处理订单到发起支付请求的完整步骤。

总结

本文介绍了如何使用Python和Django框架实现支付宝创建订单功能。通过这个功能,我们可以在用户下单后自动创建订单,并返回支付宝的支付链接。