Django框架实现支付宝第三方支付

下面是针对使用Django框架项目接入第三方支付宝支付的相关链接:

支付宝开发平台登录:
https://open.alipay.com/platform/home.htm

沙箱环境:
沙箱应用:https://docs.open.alipay.com/200/105311
沙箱账号:https://openhome.alipay.com/platform/appDaily.htm?tab=account

支付宝开发者文档
文档主页:https://openhome.alipay.com/developmentDocument.htm
产品介绍:https://docs.open.alipay.com/270
快速接入:https://docs.open.alipay.com/270/105899/
SDK:https://docs.open.alipay.com/270/106291/
python对接支付宝SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
python对接支付宝SDK安装:pip install python-alipay-sdk --upgrade
API列表:https://docs.open.alipay.com/270/105900/

第一项:

接入步骤:
1.创建应用
2.配置密钥
3.搭建和配置开发环境
4.接口调用

接下来是接入支付宝支付的详细讲解:
1.首先我们需要在自己的工程目录下创建一个pay的包,然后再创建一个keys的文件夹,keys文件里面用来存放应用的秘钥和公匙。
在这里插入图片描述
2. 生成应用的私钥和公钥
进入终端
切换目录

cd  pay/keys/

输入下面的命令:

openssl
openssl> genrsa -out app_private_key.pem 2048  # 私钥RSA2
openssl> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
openssl> exit

执行完之后会在你的文件下面出现下面两个(密匙和公钥):
在这里11片描述
3.修改公匙
首先你需要进入支付宝的开发平台选择
在这里插入图片描述
创建你的应用,然后进入沙箱开发环境:

什么是沙箱环境尼?
蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考“沙箱支持产品列表”)。
在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。
在这里插入图片描述
选择查看项目应用公匙

cat app_public_key.pem

把上面项目生成的公匙复制到支付宝的的应用公匙里面:
在这里插入图片描述
再选择将支付宝的公钥内容复制到alipay_public_key.pem文件中
在这里插入图片描述
在这里插入图片描述
注意,还需要在公钥文件中补充开始与结束标志:

-----BEGIN PUBLIC KEY-----
此处是公钥内容
-----END PUBLIC KEY-----

然后到这里就配置好应用程序的密匙和公钥。

第二项:

发起支付
下面视图函数的编写参考(感谢github开发者提供的文档)
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md

1.首先需要安装python对接支付宝SDK:

pip install python-alipay-sdk --upgrade

接下来是后端的接口说明:
请求方式:Get
请求的路径:orders/(?P<order_id>\d+)/payment/
参数说明:
order_id 订单编号 str
alipay_url 支付宝支付链接 str
2.开始编写视图函数
需要导入的类

from rest_framework.views import APIView  #REST framework 提供的一级视图
from rest_framework.response import Response
from orders.models import OrderInfo
from rest_framework import status
from alipay import AliPay  #阿里支付
from mall import settings

视图思路的分析:
当用户点击支付按钮的时候,我们需要让前端发送一个ajax请求,将 订单id发送给我们
必须是登录用户才可以访问此接口

1 我们接收参数, 校验参数
2. 根据订单id查询数据
3. 创建支付宝对象
4. 调用支付宝的方法生成order_string
5. 拼接url,并且返回

class PaymentView(APIView):

permission_classes = [IsAuthenticated]  #请求头判断是否的请求的权限

def get(self,request,order_id):
    # 1. 我们接收参数, 校验参数
    # 2. 根据订单id查询数据
    try:
        # 为了让我们查询的更准确,我们需要再添加几个查询条件
        # 查询未支付的订单
        # 查询这个用户的订单
        order = OrderInfo.objects.get(order_id=order_id,   #订单的id
                                      user=request.user,
                                      status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
    except OrderInfo.DoesNotExist:
        return Response(status.HTTP_400_BAD_REQUEST)
        
    # 3. 创建支付宝对象
    app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()  #app的密匙
    alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() #app的公匙

    alipay = AliPay(
        appid=settings.ALIPAY_APPID,    #就是一大串数字类似2016081903467
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug = settings.ALIPAY_DEBUG  # 默认False 如果使用debug的调试模式设置为True
    )


    # 4. 调用支付宝的方法生成order_string
    # 如果你是 Python 3的用户,使用默认的字符串即可
    subject = "测试订单"

    # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no=order_id,
        total_amount=str(order.total_amount), # 这里类型我们要由 decimal转换为 str
        subject=subject,
        return_url="http://ip地址:端口号/pay_success.html",
        notify_url=None  # 可选, 不填则使用默认notify url
    )

    # 5. 拼接url,并且返回
    url = settings.ALIPAY_URL + '?' + order_string

    return Response({'alipay_url':url})

在配置文件中编辑支付宝的配置信息

ALIPAY_APPID = "2016091567523030"
ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do"
ALIPAY_DEBUG = True
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/app_private_key.pem')
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/alipay_public_key.pem')

在pay/urls.py中设置url信息

from django.conf.urls import url
from . import views

urlpatterns = [
    #/pay/orders/(?P<order_id>)\d+/
    url(r'^orders/(?P<order_id>\d+)/$',views.PaymentView.as_view(),name='pay'),
]

在项目名/urls.py中设置url信息

urlpatterns = [
    url(r'^pay/',include('pay.urls',namespace='pay')),
]

视图的执行首先是从项目的url寻找路径,然后再连接到应用pay的url里面,当接受到前端的请求时候,便会执行相对应的视图功能函数。

第三步

保存支付结果
用户支付成功后,支付宝会将用户重定向到 pay_success.html,并携带支付结果数据
后端接口设计:

请求方式: PUT
路径:/pay/status/?支付宝参数
请求参数: 在查询字符串中携带支付宝参数
返回数据:
trade_id 支付宝流水号 str

继续编写视图函数views.py

 class PayStatusAPIView(APIView):
 
    def put(self,request):
    # 1. 创建alipay对象
    app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
    alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

    alipay = AliPay(
        appid=settings.ALIPAY_APPID,
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=settings.ALIPAY_DEBUG  # 默认False
    )

    # 2.验证数据
    data = request.query_params.dict()
    # sign 不能参与签名验证
    signature = data.pop("sign")


    # verify确认是否成功
    success = alipay.verify(data, signature)
    if success:
        # 3.验证成功之后,可以从 data中获取 支付宝的订单id和 我们的订单id
        # 支付宝的交易id
        trade_id = data.get('trade_no')
        # 商家id
        out_trade_no = data.get('out_trade_no')
        #1. 把支付宝的订单id和 我们的订单id 保存起来
        Payment.objects.create(
           order_id=out_trade_no,
            trade_id=trade_id
        )
        # 2. 更新订单的状态
        OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
        #3. 返回 支付宝的订单id
        return Response({'trade_id':trade_id})
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PyCharm是一款非常流行的Python集成开发环境(IDE),它可以轻松地集成第三方库,简化Python代码的开发和调试。而Django是一款基于Python的Web应用程序框架,它提供了许多便捷的工具和功能来简化Web应用程序的开发过程。在使用PyCharm开发Django应用程序时,可以通过以下步骤来实现一个网上商城: 1. 安装Python和PyCharm并创建一个Django项目。 2. 设计并创建网上商城的数据库模型,包括商品、用户、订单等表,可以使用Django中的ORM工具来进行数据库设计和操作。 3. 设计并创建网站的页面模板,包括首页、商品详情页、购物车页面等,可以使用Django的内置模板引擎来进行页面设计和开发。 4. 编写视图函数来处理用户请求和页面渲染的逻辑。在Django中,视图函数接收HTTP请求并根据请求内容返回相应的HTTP响应,可以使用PyCharm提供的调试工具来调试视图函数的代码。 5. 集成第三方服务和库,例如支付宝、微信支付等支付接口,可以使用PyCharm提供的包管理工具(例如pip)来安装和管理依赖库。 6. 测试和部署网站,可以使用PyCharm提供的Web服务器和调试工具来测试网站的功能和性能,最终将网站部署到生产服务器上。 以上是实现一个网上商城的大致过程,当然在具体实现中还需要考虑安全性、性能优化等方面的问题。总之,使用PyCharm和Django来开发网上商城是非常简单、高效和有趣的,期待你也能在这个过程中获得更多的Python和Web开发经验!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值