文章目录
前言
仅供参考哦~
一、多支付
1.原理
1.利用鸭子类型。规定前台传过来支付方式。pay_methon
2.再支付方式里面实现pay(名字统一)方法
3.回调函数,在支付方式里面写notify(名字统一)统一方法,返回的data统一格式。
eg: data={“statu”:‘success’,“order_id”:notity_data[‘order_id’],“print”:“0000”}
这样的的牛逼之处:我们在修改、添加支付方式的时候,只需要按照鸭子类型,命名一样的函数名,写好自己的支付方式即可。不需要改其他的代码
2.多支付接口代码
urls.py:
path("order/create",order.Creat.as_view()),
path("order/notify/<paymethod>",order.Notify.as_view())
# 这里所有的支付都是走的小程序微信支付:
import importlib
class Creat(APIView):
...伪代码
pay_methon = "Wxpay" # 如果是PC端,可以前台传过来支付方式
try:
#pay_file是对象
pay_file = importlib.import_module(f"app01.Pay.{
pay_methon}") # 调用对应的支付方式
pay_class = getattr(pay_file, pay_methon) # 反射机制
order_data['open_id'] = openid # 传的参数
order_data['ip'] = host_ip # 传的参数
data = pay_class().pay(order_data) # 调用支付
except:
return Response({
"code":201,"msg":"未知支付方式"})
# 异步回调的
class Notify(APIView):
def post(self,request,paymethod):
pay_file = importlib.import_module(f"app01.Pay.{
paymethod}")
pay_class = getattr(pay_file,paymethod)
data = pay_class().notify(request.data) # 调用异步回调
# 判断data数据中属性,然后修改订单
if data["statu"] == "success":
models.Order.objects.filter(order_id =data['order_id']).update(pay_status =1)
return Response(data["print"])
二、支付方式代码
1.Alipay支付
# Alipay支付
class Alipay:
def pay(self,order_data):
#统一下单方法
pass
def notify(self,notity_data):
if notity_data['success'] :
#notity_data['order_id']表示商城订单号
data={
"statu":'success',"order_id":notity_data['order_id'],"print":"0000"}
return data
2.YLpay支付方式
# YLpay支付方式
class YLpay:
def pay(self,order_data):
pass
def notify(self,request_data):
#验签
#数据处理
pass
3.Wxpay支付方式
import time
from app01.wx import settings
class Wxpay:
def pay(self,order_data):
self.order_id = order_data["order_id"]
self.open_id = order_data['open_id']
self.ip = order_data['ip']
data_body = self.get_body_data()
import requests
url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
response = requests.post(url, data_body.encode