python支付宝支付和回调

创建支付订单

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


if __name__ == '__main__':
    """
    设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
    """
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
    alipay_client_config.app_id = '[your app_id]'
    alipay_client_config.app_private_key = '[your app private key]'
    alipay_client_config.alipay_public_key = '[alipay public key]'

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

    """
    系统接口示例:alipay.trade.pay
    """
    # 对照接口文档,构造请求对象
    model = AlipayTradePayModel()
    model.auth_code = "282877775259787048"
    model.body = "Iphone6 16G"
    goods_list = list()
    goods1 = GoodsDetail()
    goods1.goods_id = "apple-01"
    goods1.goods_name = "ipad"
    goods1.price = 10
    goods1.quantity = 1
    goods_list.append(goods1)
    model.goods_detail = goods_list
    model.operator_id = "yx_001"
    model.out_trade_no = "20180510AB014"
    model.product_code = "FACE_TO_FACE_PAYMENT"
    model.scene = "bar_code"
    model.store_id = ""
    model.subject = "huabeitest"
    model.timeout_express = "90m"
    model.total_amount = 1
    request = AlipayTradePayRequest(biz_model=model)
    # 如果有auth_token、app_auth_token等其他公共参数,放在udf_params中
    # udf_params = dict()
    # from alipay.aop.api.constant.ParamConstants import *
    # udf_params[P_APP_AUTH_TOKEN] = "xxxxxxx"
    # request.udf_params = udf_params
    # 执行请求,执行过程中如果发生异常,会抛出,请打印异常栈
    response_content = None
    try:
        response_content = client.execute(request)
    except Exception as e:
        print(traceback.format_exc())
    if not response_content:
        print("failed execute")
    else:
        response = AlipayTradePayResponse()
        # 解析响应结果
        response.parse_response_content(response_content)
        print(response.body)
        if response.is_success():
            # 如果业务成功,则通过respnse属性获取需要的值
            print("get response trade_no:" + response.trade_no)
        else:
            # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
            print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)

回调验证签名

from alipay.aop.api.util.SignatureUtils import verify_with_rsa

# 支付宝公钥
alipay_public_key = '你的支付公钥'

# 待签名字符串需要做升序处理,且去除sign和sign_type
org_message = '返回的body'

# 转换成字节串
message = bytes(org_message, encoding='utf-8')

# 返回的sign值(需要base64解码,python中sign解码封装在了verify_with_rsa方法中)
sign = 'body中截取的sign'

# 签名方法
data= verify_with_rsa(alipay_public_key, message, sign)

# 输出验签结果
print(data)

        try:
            # 处理支付成功的逻辑
            if data.get('trade_status') == 'TRADE_SUCCESS':
                order_no = data.get('out_trade_no')

                # 查询订单 对订单进行更新等操作
      			return JSONResponse(status_code=200,
                                    content={'code': 1, 'msg': '支付成功'})

            # 处理支付失败的逻辑
            elif data.get('trade_status') in ['TRADE_CLOSED', 'TRADE_FINISHED']:
                order_no = data.get('out_trade_no')
                # 支付失败的对订单更新操作
                return JSONResponse(status_code=200,
                                    content={'code': 1, 'msg': '支付失败'})



### 支付宝同步回调与异步回调的实现 支付宝的同步回调通常发生在用户完成支付后,页面跳转回商户网站的过程中。而异步回调则是支付宝服务器主动向商户服务器发送通知的过程。以下是两种回调的具体实现方式。 #### 同步回调的实现 同步回调主要依赖于 `return_url` 参数,在用户完成支付后,支付宝会将用户重定向到指定的 URL 并附带一些参数。这些参数可以用于确认订单状态并更新前端界面[^1]。 ```python from flask import Flask, request app = Flask(__name__) @app.route('/sync_callback', methods=['GET']) def sync_callback(): # 获取 GET 请求中的参数 trade_no = request.args.get('trade_no') # 支付宝交易号 out_trade_no = request.args.get('out_trade_no') # 商户订单号 # 处理逻辑:可以根据订单号查询数据库,更新前端显示等操作 return f'Sync Callback Received! Trade No: {trade_no}, Out Trade No: {out_trade_no}' ``` 上述代码展示了如何接收来自支付宝的同步回调请求,并从中提取必要的信息。 #### 异步回调的实现 异步回调通过 `notify_url` 进行配置,当支付成功或其他状态变更时,支付宝服务器会向该地址发起 POST 请求。需要注意的是,`notify_url` 的路径应以 `/` 结束[^2]。 ```python import json from flask import Flask, request 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 app = Flask(__name__) alipay_public_key = 'your_alipay_public_key' @app.route('/async_callback/', methods=['POST']) # 注意这里的斜杠 def async_callback(): data = request.form.to_dict() # 验证签名 sign = data.pop('sign', None) is_verify = verify_with_rsa(alipay_public_key, data, sign) if not is_verify: return 'fail' # 提取重要字段 trade_status = data.get('trade_status') out_trade_no = data.get('out_trade_no') total_amount = data.get('total_amount') # 根据业务需求处理数据 if trade_status == 'TRADE_SUCCESS': # 更新数据库记录或执行其他业务逻辑 pass return 'success' # 返回 success 表示已收到通知 ``` 此部分实现了异步回调的功能,重点在于验证签名以及根据返回的状态码来决定后续的操作流程[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值