python 接入支付宝

0. 官方文档

1. 使用国内源,安装依赖包:pip install -i https://pypi.douban.com/simple alipay-sdk-python

2. 如安装步骤1中出现error: Microsoft Visual C++ 14.0 is required.让安装c++, 提取码:wkgv,选择默认安装即可

3. 再次安装alipay-sdk-python,会出现报错关键词missing按以下操作即可解决

     3.1:新建系统环境变量:VCINSTALLDIR  变量值:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC

     3.2:点进来,下载Download Latest

     3.3:把压缩包放到python安装目录的Scripts目录中,解压缩

     3.4:cmd进入解压缩的目录中,输入命令:set CL=/FI"%VCINSTALLDIR%\\INCLUDE\\stdint.h" %CL%

     3.5:输入命令:python setup.py install

4. 看文尾代码实现的线下二维码支付,有其他需求可对照api自行改动

5. api

6. 错误码排查

7. 调试中有什么问题,可直接留言,我尽快回复和完善博文

# cython: language_level=3
import os
import logging
import json
import time
import qrcode
import win32con
import win32api
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.domain.AlipayTradeCreateModel import AlipayTradeCreateModel
from alipay.aop.api.request.AlipayTradeCreateRequest import AlipayTradeCreateRequest
from alipay.aop.api.response.AlipayTradeCreateResponse import AlipayTradeCreateResponse
from alipay.aop.api.request.AlipayTradePrecreateRequest import AlipayTradePrecreateRequest

from alipay.aop.api.request.AlipayTradeQueryRequest import AlipayTradeQueryRequest
from alipay.aop.api.response.AlipayTradeQueryResponse import AlipayTradeQueryResponse
from alipay.aop.api.domain.AlipayTradeQueryModel import AlipayTradeQueryModel

'''app私钥和支付宝生成的公钥'''
app_private_key = 'app私钥'
alipay_public_key = '支付宝网站生成的公钥'

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


def show_qrcode(code):
    '''
    生成二维码
    :param code:
    :return:
    '''
    img = qrcode.make(data=code)
    img.save("A.jpg")
    img.show()


def get_time_out_trade_no():
    '''
    :return: 构造唯一订单号
    '''
    return str(int(time.time()) + 你的appid)


def pay():
    '''
    支付
    :return:
    '''
    # 实例化客户端
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
    alipay_client_config.app_id = '你的appid'
    alipay_client_config.app_private_key = app_private_key
    alipay_client_config.alipay_public_key = alipay_public_key
    # client = DefaultAlipayClient(alipay_client_config, logger)
    client = DefaultAlipayClient(alipay_client_config)

    # 构造请求参数对象
    model = AlipayTradeCreateModel()
    model.out_trade_no = get_time_out_trade_no()
    model.total_amount = "价格string"
    model.subject = "标题"
    request = AlipayTradePrecreateRequest(biz_model=model)

    # 执行API调用
    try:
        response_content = client.execute(request)
    except Exception as e:
        print('error', e)
    else:
        # 解析响应结果
        response = AlipayTradeCreateResponse()
        response.parse_response_content(response_content)
        # 响应成功的业务处理
        if response.is_success():
            # 如果业务成功,可以通过response属性获取需要的值
            # print(response.body)
            # print(json.loads(response.body)["qr_code"])
            show_qrcode(json.loads(response.body)["qr_code"])
        # 响应失败的业务处理
        else:
            # 如果业务失败,可以从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
            print('error code')
            os.system('pause')


def check_order(order):
    '''
    订单校验
    order: 订单号
    :return:
    '''
    # 构造请求
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.app_id = '你的appid'
    alipay_client_config.method = 'alipay.trade.query'
    alipay_client_config.charset = 'utf-8'
    alipay_client_config.app_private_key = app_private_key
    alipay_client_config.alipay_public_key = alipay_public_key
    client = DefaultAlipayClient(alipay_client_config)
    request = AlipayTradeQueryRequest()
    request.biz_content = {"trade_no": order}

    response_content = client.execute(request)
    response = AlipayTradeQueryResponse()
    response.parse_response_content(response_content)
    try:
        # print(response.send_pay_date)
        if response.code == "10000":
            # 将购买时间转换为时间戳,取当前时间做对比,如果超过十分钟pass,
            stamp_array = time.strptime(response.send_pay_date, '%Y-%m-%d %H:%M:%S')
            stamp = int(time.mktime(stamp_array))  # 转换为时间戳
            # print('本地时间转换成时间戳:', stamp)
            hour = stamp + 360
            if hour > time.time():
                print('ok!')
            else:
                print('fail!')
        if response.code == "40004":
            print("order error1!")
            os.system('pause')
        else:
            print("order error2!")
            os.system('pause')
    except Exception as e:
        print('error, check_order')
        os.system('pause')

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值