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})

浙公网安备 33010602011771号