网站制作学习网Python→正文:python 对接调用支付宝接口
字体:

python 对接调用支付宝接口

Python 2024/11/19 17:15:21  点击:不统计


 用python 对接支付宝接口,官方文档python语言的接口对接相当不友好,下面对python 对接支付宝做个总结
方便对接使用,下面对python 对接调用支付宝接口逐步实现。
 
一 前期要求/注意
1.  国内服务器,备案域名 。如果国外或者没有备案的可能回调不过去。
2.  支付宝先申请应用,通过后才能测试,可以不上线具体支付申请。
3. 支付宝有测试环境,但是不稳定,建议直接走线上测试 (可以预发布测试,将线上配置到预发布)
4. 涉及 python 调用 创建订单时需要 私钥为 PKCS1 格式。
 
二 相关资源
1.资源下载
(1) python 支付宝扩展包安装 :
地址:https://pypi.org/project/alipay-sdk-python/
(2)密钥证书软件下载
https://opendocs.alipay.com/common/02kipk?pathHash=0d20b438
 
2.支付宝开放平台:https://open.alipay.com/
(1)登录后 支付宝沙盒 
https://open.alipay.com/develop/sandbox/app
沙盒下面有对应的 用户和商户的临时账号,可以直接使用。
(2)登录后应用列表--对接支付宝的应用
https://open.alipay.com/develop/manage
点击应用,审核通过后,设置 公钥,私钥,以及回调地址  
证书操作相关步骤:
 
(3)登录后, 线上订单回调查询结果 ,基本就是异步通知
https://opensupport.alipay.com/support/diagnostic-tools
 
3. 沙盒/线上地址
沙盒:https://openapi-sandbox.dl.alipaydev.com/gateway.do
线上:https://openapi.alipay.com/gateway.do
 
4. 官方python对接文档 (不全):
https://opendocs.alipay.com/open/02no41?pathHash=2faf7eac
 
三 代码相关,我对接的网页/移动应用(其他相似参考),我创建了一个类,直接创建对应的订单,和回调验证
 
   # -*- coding: utf-8 -*-
"""这里是支付宝 调用接口文件文件"""
import logging
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.domain.AlipayTradePagePayModel import AlipayTradePagePayModel
from alipay.aop.api.request.AlipayTradePagePayRequest import AlipayTradePagePayRequest
from alipay.aop.api.util.SignatureUtils import verify_with_rsa, get_sign_content


from setting import ALIPAY_SERVER_URL, ALIPAY_APP_ID, ALIPAY_APP_PRIVATE_KEY, \
ALIPAY_PUBLIC_KEY, ALIPAY_SEND_OPEN, ALIPAY_NOTIFY_URL, ALIPAY_RETURN_URL

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


class AliPayServer():
"""支付宝类"""
client = None

def __init__(self):

alipay_client_config = AlipayClientConfig(
sandbox_debug=ALIPAY_SEND_OPEN) # 是否时沙盒,
alipay_client_config.server_url = ALIPAY_SERVER_URL # 这里时支付宝接口
alipay_client_config.app_id = ALIPAY_APP_ID # 这里时应用的AppID
alipay_client_config.app_private_key = ALIPAY_APP_PRIVATE_KEY # 这里时我们对应的私钥
alipay_client_config.alipay_public_key = ALIPAY_PUBLIC_KEY # 这里是阿里云公钥
alipay_client_config.sign_type = "RSA2"
alipay_client_config.charset = "utf-8"
self.client = DefaultAlipayClient(alipay_client_config,logger=logger)

def create_order(self, order_info=None):
"""创建订单"""
if order_info is None:
return False
try:
model = AlipayTradePagePayModel()
# model.auth_code =""
model.out_trade_no = order_info.get("out_trade_no") # 订单号自定义 为宜
model.total_amount = order_info.get("total_amount") # 单位元
model.subject = order_info.get("subject") # 订单标题
model.body = "支付宝测试" #订单描述
model.product_code = "FAST_INSTANT_TRADE_PAY"
model.timeout_express = "30m" # 订单过期时长30分钟
# 如果支付有多个商户,代理混合结算,比如跨店满减 需要配置不同商户的钱
# settle_detail_info = SettleDetailInfo()
# settle_detail_info.amount = 50
# settle_detail_info.trans_in_type = "userId"
# settle_detail_info.trans_in = "2088302300165604"
# settle_detail_infos = list()
# settle_detail_infos.append(settle_detail_info)
# settle_info = SettleInfo()
# settle_info.settle_detail_infos = settle_detail_infos
# model.settle_info = settle_info
# 如果有子账户 -否则不用配置
# sub_merchant = SubMerchant()
# sub_merchant.merchant_id = "2088301300153242"
# model.sub_merchant = sub_merchant
request = AlipayTradePagePayRequest(biz_model=model)
# 设置回跳地址(同步通知 URL,比如我的账单)
request.return_url = ALIPAY_RETURN_URL
# 设置通知地址(异步通知 URL,异步通知)
request.notify_url = ALIPAY_NOTIFY_URL
# 得到构造的请求,如果http_method是GET,则是一个带完成请求参数的url,如果http_method是POST,则是一段HTML表单片段
response = self.client.page_execute(request, http_method="GET")
return response
except Exception as e:
print("支付宝创建订单失败: "+str(e))
return False

def notify(self, params):
"""支付宝回调"""
# 参数 params 从支付宝post form 中获取所有数据 ,我使用flask ,params = request.form.todict()
try:

# 获取支付宝公钥进行验签
sign = params.pop('sign') # 提出 sign
params.pop('sign_type') # 提出sign_type
sign_content = get_sign_content(params)
message = bytes(sign_content, encoding='utf-8')

if not verify_with_rsa(ALIPAY_PUBLIC_KEY, message, sign):
print("Invalid signature.")
return "fail"

# 获取支付状态
trade_status = params.get("trade_status", False)

if trade_status == "TRADE_SUCCESS":
# 支付成功,进行相应的业务处理
out_trade_no = params.get("out_trade_no")
trade_no = params.get("trade_no")
total_amount = params.get("total_amount")

return "SUCCESS" # 仅输出 对应字符,支付宝收到后不在二次回调
if trade_status in ['TRADE_CLOSED', 'TRADE_FINISHED']:
return "close"

return "fail"

except Exception as e:
# 如果发生异常,打印日志并返回失败
print("支付宝回调处理异常2:"+str(e))
return "fail", None

·上一篇:request sign failed. int() argument must be a string, a bytes-like obj >>    ·下一篇:python中的魔术方法 >>
推荐文章
最新文章