python项目中如何调用支付宝接口实现支付功能?

支付宝没有提供Python SDK。但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个,我们就调用支付宝接口就比较简单了,下面就说说如何在Django项目中调用支付宝接口:

github网站:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md


第一步、安装python-alipay-sdk

pip uninstall pycrypto
pip install python-alipay-sdk --upgrade

第二部、使用openssl生成密钥文件和公钥文件

在linux环境中,我们可以使用linux自带的openssl软件来进行私钥和密钥的生成
在终端输入openssl开启软件:

openssl

先生成私钥,再由私钥生成公钥:

genrsa -out app_private_key.pem   2048  # 私钥
# 2048是密钥长度,建议使用2048位
# app_private_key.pem是生成私钥的文件名称,在当前终端目录下生成

python项目中如何调用支付宝接口实现支付功能?_第1张图片
查看公钥的内容, 并复制

cat app_publict_key.pem 
第三步、上传公钥到支付宝的沙箱或者正式

网址:https://openhome.alipay.com/platform/appDaily.htm?tab=account
(需要自己注册并注册里面的服务商功能)
python项目中如何调用支付宝接口实现支付功能?_第2张图片
点击进入我的开发平台,在开放中心, 点击研发服务
python项目中如何调用支付宝接口实现支付功能?_第3张图片
在沙箱应用中,刚刚开始会有显示上传公钥,把刚刚用opessl生成的公钥复制进去点击确认就行,然后在点击“查看支付宝公钥”复制里面的内容,等等项目的代码里一定要用这里的公钥,不能用opessl生成的公钥

第四步、给Django目录添加opessl生成的私钥和支付宝公钥

在这里插入图片描述
特别是alipay_public_key.pem的内容需要添加-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----
在这里插入图片描述

第五步、使用
1.alipay.trade.page.pay # 同意收单下单并支付页面接口
# 业务处理: 使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016092600603434",
            app_notify_url=None,
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
            sign_type="RSA2",
            debug=True
        )

        # 调用接口
        total_pay = order.total_price + order.transit_price
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(total_pay),
            subject='天天生鲜%s' % order_id,
            return_url=None,
            notify_url=None,
        )

        # 返回应答
        pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string
2. alipay.trade.query # 同意收单线下交易查询接口
 # 初始化t
        alipay = AliPay(
            appid="2016092600603434",
            app_notify_url=None,
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
            sign_type="RSA2",
            debug=True
        )

        # 调用支付宝的交易查询接口
        """
        response = {
            "trade_no": # 支付宝交易号
            "code": "10000" # 接口调用是否成功
            "trade_status": "TRADE_SUCCESS" # 支付成功
        }
        """
        while True:
            response = alipay.api_alipay_trade_query(out_trade_no=order_id)
            print("response:ok")
            code = response.get('code')
            if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                trade_no = response.get("trade_no")
                # 更新订单状态
                order.trade_no = trade_no
                order.order_status = 4  # 待评价
                order.save()
                # 返回结果
                return JsonResponse({'res':3, 'message': '支付成功'})
            elif code == '40004' or (code == '10000' and  response.get("trade_status") == 'WAIT_BUYER_PAY'):
                # 等待买家付款
                # 业务处理失败, 可能一会就会成功
                import time
                time.sleep(5)
                continue
            else:
                # 支付出错
                return JsonResponse({'res': 4, 'message': '支付失败'})

如果还有不懂的,可以看github的文档,或者留言给我哈

你可能感兴趣的:(Django,人生苦短,我用Python)