29Django-接入支付宝4(借助第三方SDK完整付款功能)

使用第三方sdk生成支付url:

1把alipay的appid配置到setting里&&把支付成功后的跳转页面页配置到setting里

#注意正式环境应改成你的域名
#阿里支付appid
ALIPAY_APPID = '202100312345678'
#阿里支付后的跳转
ALIPAY_RETURN_URL = 'http://127.0.0.1:8000/payment/result'
#接收回调结果的url
ALIPAY_NOTIFY_URL = 'http://127.0.0.1:8000/payment/result'

2在视图中引入Alipay

from alipay import Alipay

3自定义一个支付类,然后让需要支付的类继承我们自定义的这个支付类:

class MyAliPay(View):
    pass


class OrderView(MyAliPay):
    def get(self,request):
        return render(request,'alipay.html')

4初始化一个alipay的对象:

class MyAliPay(View):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        #初始化一个alipay的对象
        self.alipay = AliPay(
            # 正式环境的appid
            appid=settings.ALIPAY_APPID,
            #你的私钥
            app_private_key_string=app_private_key_string,
            #阿里的公钥
            alipay_public_key_string=alipay_public_key_string,
            #回调地址,最后再设置
            app_notify_url=None,
            #指明整个过程使用的签名算法
            sign_type="RSA2",
            #沙箱环境调试需要设为True,默认是False(请求转发)
            debug=False
        )

5定义一个获取支付地址的方法:

 #定义一个获取地址的方法(订单id和订单价格需要我们告诉支付宝)
    def get_trade_url(self,order_id,amount):
        #生成查询字符串
        order_string = self.alipay.api_alipay_trade_page_pay(
            #标题
            subject=order_id,
            #自己网站里的订单号
            out_trade_no=order_id,
            #当前订单的总价
            total_amount=amount,
            #支付完毕后你希望让支付宝跳转到的页面
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_NOTIFY_URL
        )
        #支付地址需要用到网关+?再加上一组查询字符串就可以了
        return "https://openapi.alipay.com/gateway.do?" + order_string

6在post视图中创建订单号和支付url,然后return给支付宝:

class OrderView(MyAliPay):
    def get(self,request):
        return render(request,'alipay.html')
    def post(self,request):
        #返回支付地址
        #生成订单号
        order_id = '%slinuxTang'%(int(time.time()))
        #给支付url传值
        pay_url = self.get_trade_url(order_id,0.1)
        return JsonResponse({'pay_url':pay_url})

7浏览器支付测试:

http://127.0.0.1:8000/payment/url

8附完整视图源码:

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from django.conf import settings
from alipay import AliPay
import time
#读取私钥
app_private_key_string = open(settings.ALIPAY_KEY_DIRS + 'app_private_key.pem').read()
#读取阿里公钥
alipay_public_key_string = open(settings.ALIPAY_KEY_DIRS + 'alipay_public_key.pem').read()

class MyAliPay(View):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        #初始化一个alipay的对象
        self.alipay = AliPay(
            # 正式环境的appid
            appid=settings.ALIPAY_APPID,
            #你的私钥
            app_private_key_string=app_private_key_string,
            #阿里的公钥
            alipay_public_key_string=alipay_public_key_string,
            #回调地址,最后再设置
            app_notify_url=None,
            #指明整个过程使用的签名算法
            sign_type="RSA2",
            #沙箱环境调试需要设为True,默认是False(请求转发)
            debug=False
        )
    #定义一个获取地址的方法(订单id和订单价格需要我们告诉支付宝)
    def get_trade_url(self,order_id,amount):
        #生成查询字符串
        order_string = self.alipay.api_alipay_trade_page_pay(
            #标题
            subject=order_id,
            #自己网站里的订单号
            out_trade_no=order_id,
            #当前订单的总价
            total_amount=amount,
            #支付完毕后你希望让支付宝跳转到的页面
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_NOTIFY_URL
        )
        #支付地址需要用到网关+?再加上一组查询字符串就可以了
        return "https://openapi.alipay.com/gateway.do?" + order_string


class OrderView(MyAliPay):
    def get(self,request):
        return render(request,'alipay.html')
    def post(self,request):
        #返回支付地址
        #生成订单号
        order_id = '%slinuxTang'%(int(time.time()))
        #给支付url传值
        pay_url = self.get_trade_url(order_id,0.1)
        return JsonResponse({'pay_url':pay_url})

 

posted @ 2021-12-19 17:18  linuxTang  阅读(157)  评论(0)    收藏  举报