当前位置: 首页 > news >正文

python 对接支付宝账单流程及问题处理

 可以从支付宝文档中获取适用于python的sdk方法  小程序文档 - 支付宝文档中心

问题:

        从文档中我们对python的SDK了解不多,直接拿来用有可能有网络问题,因为你的执行环境可能处于内网中,聪明的你第一时间想到加代理访问解决,可是SDK提供的接口并没有设置代理的参数

import json
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest import \AlipayDataDataserviceBillDownloadurlQueryRequest
from alipay.aop.api.domain.AlipayDataDataserviceBillDownloadurlQueryModel import \AlipayDataDataserviceBillDownloadurlQueryModelimport logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s',filemode='a',)
logger = logging.getLogger('')ALIPAY_BILL_URL_KEY = "https://openapi.alipay.com/gateway.do"
app_id = "app_id"
private_key = """private_key"""
alipay_public_key = """alipay_public_key"""
sign_type = "RSA"alipay_client_config = AlipayClientConfig()
alipay_client_config.server_url = ALIPAY_BILL_URL_KEY
alipay_client_config.app_id = app_id
alipay_client_config.app_private_key = private_key
alipay_client_config.alipay_public_key = alipay_public_key
alipay_client_config.sign_type = sign_type
client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)
request = AlipayDataDataserviceBillDownloadurlQueryRequest()
model = AlipayDataDataserviceBillDownloadurlQueryModel()
model.bill_type = "trade"
model.bill_date = "2025-04-14"
# model.smid = alipay_bill_config["account_number"]
request.biz_model = model
# 发送请求并获取响应
response_json = client.execute(request)
response = json.loads(response_json)
print(response)
try:if response["bill_file_code"] == "EMPTY_DATA_WITH_BILL_FILE":print("bill_file_code is EMPTY_DATA_WITH_BILL_FILE")
except Exception as e:print(str(e))if response["msg"] == "Success" and response["code"] == "10000":print(response["bill_download_url"])print("downloadTradeBill completed")

解决流程:

1、下载源码:

pip install alipay-sdk-python

2、进入execute方法

可以打断点调试,这里是请求的入口

因为我们request对象没有设置表单参数,multipart_params返回的是空值

3、进入do_post方法

可以看到get_http_connection方法在构造连接对象connection,所以聪明的你一定想到了在这里可以加上代理

 4、修改源码get_http_connection方法

处理了代理问题,有可能还会遇到SSL的证书报错,那么聪明的你一定想到了忽略SSL证书认证(不建议,但可以用),完整代码如下:

def get_http_connection(url, query_string, timeout):import sslimport http.clienturl_parse_result = urlparse.urlparse(url)host = url_parse_result.hostnameport = 80# 代理服务器配置proxy_url = 'http://proxy:8080'  # 写上自己对应的代理# 解析代理主机和端口proxy_host, proxy_port = proxy_url.split('://')[-1].split(':')# 创建一个不验证证书的 SSL 上下文context = ssl.create_default_context()context.check_hostname = Falsecontext.verify_mode = ssl.CERT_NONE# 创建连接对象,这里我们实际上连接到代理服务器connection = http.client.HTTPSConnection(host=proxy_host, port=proxy_port, timeout=timeout, context=context)# 设置隧道,指定目标服务器的主机和端口connection.set_tunnel(host, port)if url.find("https") == 0:port = 443connection = http.client.HTTPSConnection(host=proxy_host, port=proxy_port, timeout=timeout, context=context)# 设置隧道,指定目标服务器的主机和端口connection.set_tunnel(host, port)url = url_parse_result.scheme + "://" + url_parse_result.hostnameif url_parse_result.port:url += url_parse_result.porturl += url_parse_result.pathurl += ('?' + query_string)return url, connection

总结:

        以上方法只适用于临时方案,感兴趣的小伙伴可以改造自己的SDK,实现添加指定参数来调用对应功能。

相关文章:

  • 告别Feign:基于Spring 6.1 RestClient构建高可用声明式HTTP客户端
  • VUE快速入门-4:简单入门案例
  • postman使用设置
  • ChatGPT-o3辅助学术写作的关键词和引言效果如何?
  • 解锁古籍中的气候密码,探索GPT/BERT在历史灾害研究中的前沿应用;气候史 文本挖掘 防灾减灾;台风案例、干旱案例、暴雨案例
  • 面试面试面试new
  • docker 安装prometheus普罗米修斯
  • 疑难问题解决(2)
  • git常用的命令
  • CSS 美化页面(五)
  • PD分离:优化大语言模型推理效率
  • MDA测量数据查看器【内含工具和源码地址】
  • ARINC818协议的帧格式
  • ARINC818协议(五)
  • Superduper - 在数据上构建端到端AI工作流和应用
  • AI问答收集
  • 深入理解React中的Props与State:核心区别与最佳实践
  • 基于CNN卷积神经网络和GEI步态能量提取的视频人物步态识别算法matlab仿真
  • QT6 源(36):界面组件的总基类 QWidget 的源码阅读
  • 《Spring Boot 测试框架指南:@SpringBootTest与Mockito的最佳实践》
  • 观察|如何推动再保险交易规模上量增加话语权,行业在临港新片区共倡议
  • 用户称被冒用身份证异地办卡申请注销遭拒,澎湃介入后邯郸联通着手办理剥离
  • 新消费观察 | 重点深耕,外资科技企业继续看好中国发展
  • 财政部关于六起地方政府隐性债务问责典型案例的通报
  • 东南亚三国行第四日|中柬“老朋友”密集会见,携手构建新时代全天候中柬命运共同体
  • 唐应伟升任中国航天科工集团党组成员、副总经理