支付宝第三方支付(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})

猜你喜欢

转载自blog.csdn.net/weixin_38819889/article/details/84322826
今日推荐