Skip to main content

支付宝支付接口实现

本文将介绍如何使用Python实现支付宝支付接口的整合。

在整合支付宝支付之前,首先需要创建一个订单表来存储订单相关信息。这样我们在用户购买并进行支付时,可以将订单信息写入到订单表中,并调用支付宝支付功能。

创建订单表

在项目的后端代码中,我们可以创建一个名为Order的交易模型来表示订单。订单与用户之间是一对多的关系,即一个用户可以拥有多个订单。订单与会员卡之间也是一对多的关系,即一个会员卡可以对应多个订单。以下是创建订单表的示例代码:

dx_movie/trade/models.py
class Order(models.Model):
"""
订单信息
"""
ORDER_STATUS = (
("TRADE_SUCCESS", "支付成功"),
("TRADE_CLOSED", "超时关闭"),
("WAIT_BUYER_PAY", "交易创建"),
("TRADE_FINISHED", "交易结束"),
("PAYING", "待支付"),
)

PAY_TYPE = (
("alipay", "支付宝"),
("wechat", "微信"),
)

profile = models.ForeignKey(Profile, related_name='orders', to_field='uid',on_delete=models.CASCADE, verbose_name="用户")
# 禁止反向
card = models.ForeignKey(Card, related_name='+', on_delete=models.DO_NOTHING, verbose_name='会员卡')
#订单号唯一
order_sn = models.CharField("订单编号",max_length=30, null=True, blank=True, unique=True)
# 支付宝交易号
trade_no = models.CharField("交易号",max_length=100, unique=True, null=True, blank=True)
#支付状态
pay_status = models.CharField("订单状态",choices=ORDER_STATUS, default="PAYING", max_length=30)
# 订单的支付类型
pay_type = models.CharField("支付类型",choices=PAY_TYPE, default="alipay", max_length=10)
order_mount = models.DecimalField("订单金额", max_digits=10, decimal_places=2)
pay_time = models.DateTimeField("支付时间",null=True, blank=True)
# 更新时间
created_at = models.DateTimeField(auto_now_add=True, editable=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, editable=True, verbose_name='更新时间')

class Meta:
db_table = 'order'
verbose_name = "订单信息"
verbose_name_plural = verbose_name

def __str__(self):
return str(self.order_sn)

在上述代码中,profile字段表示订单所属的用户,card字段表示对应的会员卡,order_number表示订单号,trade_no表示支付宝订单号,status表示订单的支付状态,还可以根据实际需求添加其他字段。

说明

在 Django 的模型(Model)中card字段使用 ForeignKey 字段时,通过设置 related_name='+',可以禁止创建反向关联。这意味着从 Card 模型到关联模型的反向查询将被禁用。这样做是因为不需要在关联的模型上进行反向查询。

执行迁移

通过运行python manage.py makemigrationspython manage.py migrate命令,将模型生成对应的数据表。

执行完毕后,数据库中会新增1张表order表关联表。

字段信息如下图所示。

图68-order表字段信息

整合支付宝支付

将支付宝支付相关的代码放置在项目的utils文件夹中,以便于管理和调用。创建一个名为zhifubao.py的文件,代码如下:

dx_movie/utils/zhifubao.py
import logging
import traceback

from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.FileItem import FileItem
from alipay.aop.api.domain.AlipayTradeAppPayModel import AlipayTradeAppPayModel
from alipay.aop.api.domain.AlipayTradePagePayModel import AlipayTradePagePayModel
from alipay.aop.api.domain.AlipayTradePayModel import AlipayTradePayModel
from alipay.aop.api.domain.GoodsDetail import GoodsDetail
from alipay.aop.api.domain.SettleDetailInfo import SettleDetailInfo
from alipay.aop.api.domain.SettleInfo import SettleInfo
from alipay.aop.api.domain.SubMerchant import SubMerchant
from alipay.aop.api.request.AlipayOfflineMaterialImageUploadRequest import AlipayOfflineMaterialImageUploadRequest
from alipay.aop.api.request.AlipayTradeAppPayRequest import AlipayTradeAppPayRequest
from alipay.aop.api.request.AlipayTradePagePayRequest import AlipayTradePagePayRequest
from alipay.aop.api.request.AlipayTradePayRequest import AlipayTradePayRequest
from alipay.aop.api.response.AlipayOfflineMaterialImageUploadResponse import AlipayOfflineMaterialImageUploadResponse
from alipay.aop.api.response.AlipayTradePayResponse import AlipayTradePayResponse
from alipay.aop.api.util.SignatureUtils import verify_with_rsa

from django.conf import settings

logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
filemode='a',)
logger = logging.getLogger('')


class Alipay():
"""
设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
"""
alipay_client_config = AlipayClientConfig()
alipay_client_config.server_url = settings.ALIPAY_SERVER_URL
alipay_client_config.app_id = settings.ALIPAY_APP_ID
alipay_client_config.app_private_key = settings.ALIPAY_APP_PRIVATE_KEY
alipay_client_config.alipay_public_key = settings.ALIPAY_PUBLIC_KEY

def __init__(self):
"""
得到客户端对象。
注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
logger参数用于打印日志,不传则不打印,建议传递。
"""
self.client = DefaultAlipayClient(alipay_client_config=self.alipay_client_config, logger=logger)

def trade_page(self, out_trade_no, total_amount, subject,body, product_code):
"""
页面接口示例:alipay.trade.page.pay
"""
# 对照接口文档,构造请求对象
model = AlipayTradePagePayModel()
model.out_trade_no = out_trade_no
model.total_amount = total_amount
model.subject = subject
model.body = body
model.product_code = product_code
request = AlipayTradePagePayRequest(biz_model=model)
# 新增配置信息
request.return_url = settings.ALIPAY_RETURN_URL
request.notify_url = settings.ALIPAY_NOTIFY_URL
# 得到构造的请求,如果http_method是GET,则是一个带完成请求参数的url,如果http_method是POST,则是一段HTML表单片段
response = self.client.page_execute(request, http_method="GET")
return response

在上述代码中,我们使用settings模块来获取配置文件中的支付宝相关配置参数。Alipay类的__init__方法初始化了支付宝客户端配置,trade_page方法用于调用支付宝的交易页面支付接口生成支付URL。

通过以上代码,我们将支付宝支付接口进行了封装,并可以在需要支付的时候调用trade_page方法生成支付URL。

以上就是使用Python实现支付宝支付接口整合的步骤。希望本文对您有所帮助!