Python3版本的银联SDK如何实现与使用

项目需要,官方的 SDK 没有 python 的,按照论坛里 Python2 的版本,用 Flask 撸了一个 Python3 的

python-unionpay

做了一点单元测试,封装了 Docker,给有需要的人


Python3版本的银联SDK如何实现与使用
4 回复

没有使用过程吗?


银联官方提供了Python3版本的SDK,可以通过官方渠道获取。这里给你一个完整的示例,展示如何集成和使用银联的Python SDK进行支付。

首先,你需要从银联官方获取SDK包,通常包含以下核心文件:

  • acp_sdk.py - 核心SDK文件
  • cert_util.py - 证书工具
  • 商户证书文件

1. 环境准备

# 安装依赖
pip install pycryptodome

2. 配置SDK

from acp_sdk import AcpService

# 基础配置
SDK_CONFIG = {
    'signCertPath': '/path/to/your/signCert.pem',  # 签名证书路径
    'signCertPwd': 'your_password',  # 证书密码
    'validateCertDir': '/path/to/cert_dir/',  # 验签证书目录
    'ifValidateCNName': False,  # 是否验证域名
    'ifValidateRemoteCert': True,  # 是否验证远程证书
}

# 初始化SDK
AcpService.init(SDK_CONFIG)

3. 支付请求示例

def create_payment(order_id, amount, order_desc):
    """创建支付订单"""
    params = {
        'version': '5.1.0',  # 版本号
        'encoding': 'UTF-8',  # 编码方式
        'txnType': '01',  # 交易类型-消费
        'txnSubType': '01',  # 交易子类
        'bizType': '000201',  # 业务类型
        'channelType': '07',  # 渠道类型
        'merId': '777290058110097',  # 商户号
        'orderId': order_id,  # 订单号
        'txnTime': '20231201143030',  # 交易时间
        'txnAmt': str(amount),  # 交易金额(分)
        'currencyCode': '156',  # 交易币种
        'orderDesc': order_desc,  # 订单描述
        'frontUrl': 'https://yourdomain.com/front_return',  # 前台通知地址
        'backUrl': 'https://yourdomain.com/back_notify',  # 后台通知地址
    }
    
    # 签名
    AcpService.sign(params)
    
    # 生成支付表单
    html_form = AcpService.createAutoFormHtml(
        'https://gateway.test.95516.com/gateway/api/frontTransReq.do',
        params
    )
    
    return html_form

4. 支付结果通知处理

def handle_notify(request_data):
    """处理支付结果通知"""
    # 验证签名
    if not AcpService.validate(request_data):
        return {'respCode': '99', 'respMsg': '验签失败'}
    
    # 处理业务逻辑
    order_id = request_data.get('orderId')
    txn_amt = request_data.get('txnAmt')
    resp_code = request_data.get('respCode')
    
    if resp_code == '00':
        # 支付成功,更新订单状态
        update_order_status(order_id, 'PAID')
        return {'respCode': '00', 'respMsg': '成功'}
    else:
        # 支付失败
        update_order_status(order_id, 'FAILED')
        return {'respCode': '99', 'respMsg': '交易失败'}

5. 查询交易状态

def query_order(order_id):
    """查询订单状态"""
    params = {
        'version': '5.1.0',
        'encoding': 'UTF-8',
        'txnType': '00',  # 查询交易
        'txnSubType': '00',
        'bizType': '000000',
        'merId': '777290058110097',
        'orderId': order_id,
        'txnTime': '20231201143030',
    }
    
    AcpService.sign(params)
    
    # 发送查询请求
    result = AcpService.post(
        params,
        'https://gateway.test.95516.com/gateway/api/queryTrans.do'
    )
    
    return result

关键点说明:

  1. 证书配置要正确,特别是路径和密码
  2. 交易时间格式必须是YYYYMMDDHHMMSS
  3. 金额单位是分,需要转换为字符串
  4. 生产环境要使用正式网关地址

使用建议: 仔细阅读银联官方文档,确保参数配置正确。

搭楼,分享个我之前调试的 php 的银联支付

https://github.com/zjsxwc/upacp-sdk

请参考官方文档 demo 里面也有现成的示例

回到顶部