django实现支付宝支付实例讲解

yipeiwu_com6年前Python基础

安装python-alipay-sdk

pip install python-alipay-sdk --upgrade

配置

视图函数orders/views.py

# 订单支付
# /order/pay
from alipay import AliPay, ISVAliPay
import os
from django.conf import settings
class OrderPayView(View):
  def post(self, request):
    '''支付页面'''
    # 判断用户是否登录
    user = request.user
    if not user.is_authenticated():
      return JsonResponse({'res':0, 'errmsg':'用户尚未登录'})
    # 接收订单id
    order_id = request.POST.get('order_id')
    # 校验订单id
    if not order_id:
      return JsonResponse({'res':1, 'errmsg':'无效的订单id'})
    # 查询订单信息
    try:
      order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1)
    except OrderInfo.DoesNotExist:
      return JsonResponse({'res':2, 'errmsg':'订单错误'})

    # 业务处理 使用python sdk调用支付宝的支付接口
    # 支付宝信息  不能放在settings里 会报错
    alipay = AliPay(
      appid="2016101200665304",
      app_notify_url=None, # 默认回调url 如果为空的话不能用'' 要用None
      # 个人私钥
      app_private_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/app_private_key.pem'),
      # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
      alipay_public_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/alipay_public_key.pem'),
      # 加密方式
      sign_type="RSA2", # RSA 或者 RSA2
      # 沙箱是True 正式环境是False
      debug=True # 默认False
    )
    # 调用支付接口
    # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string 实际地址
    # 沙箱地址 https://openapi.alipaydev.com/gateway.do? + order_string 沙箱地址在alipay后面加上dev
    total_price = order.total_price + order.transit_price # Decimal
    order_string = alipay.api_alipay_trade_page_pay(
      out_trade_no=order_id, # 订单id
      total_amount=str(total_price), # 支付总金额 因为Decimal格式不能序列化 所以先转成字符串
      subject='天天生鲜%s'%order_id,
      return_url=None,
      notify_url=None # 可选, 不填则使用默认notify url
    )
    # 返回应答
    pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
    return JsonResponse({'res':3, 'pay_url':pay_url})

配置路由urls.py

from django.conf.urls import url
from orders.views import OrderPlaceView, OrderCommitView, OrderPayView


urlpatterns = [
  url(r'^place$', OrderPlaceView.as_view(), name='place'), # 提交订单页面
  url(r'^commit$', OrderCommitView.as_view(), name='commit'), # 提交订单处理
  url(r'^pay$', OrderPayView.as_view(), name='pay'), # 订单支付

]

以上就是本次介绍的相关知识点以及实例代码,更多内容可以参考【听图阁-专注于Python设计】相关栏目。

相关文章

跟老齐学Python之深入变量和引用对象

跟老齐学Python之深入变量和引用对象

在《永远强大的函数》那一讲中,老齐我已经向看官们简述了一下变量,之后我们就一直在使用变量,每次使用变量,都要有一个操作,就是赋值。本讲再次提及这个两个事情,就是要让看官对变量和赋值有一个...

PyTorch中 tensor.detach() 和 tensor.data 的区别详解

PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data 返回和 x 的相同数据 tensor, 但不会加入到x的计算历史里,且require...

python中reduce()函数的使用方法示例

python中reduce()函数的使用方法示例

前言 本文主要给大家介绍了关于python中reduce()函数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: reduce()函数在库functools...

python实现文本去重且不打乱原本顺序

代码也是在网上找的,效率挺不错的,特别适合字典文件的去重 #coding=utf-8 import sys def open_txt(): #打开TXT文本写入数组 try: xxx...

Python实现基于socket的udp传输与接收功能详解

Python实现基于socket的udp传输与接收功能详解

本文实例讲述了Python实现基于socket的udp传输与接收功能。分享给大家供大家参考,具体如下: udp的传输与接收 windows网络调试助手下载:https://pan.bai...