支付宝开发平台登录    


支付宝开发者文档

pip install python-alipay-sdk --upgrade


接入步骤

1.创建应用
2.配置秘钥
3. 调用接口
4.搭建开发环境




openssl
OpenSSL> genrsa -out app_private_key.pem 2048  # 私钥RSA2
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit


将生成的公钥添加到支付宝中


python支付系统 python对接支付宝支付_python支付系统


在应用中创建alipay_public_key.pem文件用来添加支付宝公钥


并创建app_private_key.pem将私钥添加到app_private_key.pem中




    PC网站支付流程

            官方文档图片:

python支付系统 python对接支付宝支付_HTTP_02

    1.客户端发起支付请求流程(下单)

1.1首先用户发送请求到商户系统,

1.2 商户系统接收用户请求后向支付宝发请请求获取参数

1.3 支付宝返回参数

1.4 商户拼接好参数之后生成访问支付宝的url返回给用户

class PaymentView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self,request,order_id):
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          pay_method=OrderInfo.PAY_METHODS_ENUM['ALIPAY'],
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'],
                                          )
        except OrderInfo.DoesNotExist:
            return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST)

        # 向支付宝发送请求,获取需要拼接支付网页的数据
        alipay_clie = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )

        order_string = alipay_clie.api_alipay_trade_page_pay(
            out_trade_no = order_id,
            total_amount = str(order.total_amount),
            return_url = 'http://www.xiaoxin.site:8080/pay_success.html',
            notify_url=None,
            subject = '商城订单%s' % order_id,  # 支付页面的订单标题

        )
        # 拼接支付宝支付页面网址url
        alipay_url = settings.ALIPAY_URL + "?" + order_string

        # 返回
        return Response({'alipay_url': alipay_url})



2.用户登录,进行支付。(无需考虑)

3.用户付款之后,支付宝分为三种方式告知商户

3.1 支付宝通过get请求returnURL将用户重定向到商户页面

3.2 支付宝通过post请求notifyUrl,主动告知商户

3.3 商户通信息过alipay.trade.query主动查看交易状态,支付宝返回交易

                        

  以下通过第三种方法演示:

class PaymentStatusView(APIView):

    def put(self,request):
        # 获取请求参数
        alipay_req_data = request.query_params
        if not alipay_req_data:
            return Response({'message': "缺少参数"}, status=status.HTTP_400_BAD_REQUEST)
        alipay_req_dict = alipay_req_data.dict()
        signature = alipay_req_dict.pop('sign')
        # 向支付宝发起连接请求
        alipay_clie = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        # 校验参数
        result = alipay_clie.verify(alipay_req_dict,signature)
        # 获取订单编号,支付流水号
        if result:
            # 订单编号
            order_id = alipay_req_dict.get('out_trade_no')
            # 支付宝支付流水号
            trade_id = alipay_req_dict.get('trade_no')
        # 保存支付流水号以及订单编号
            Payment.objects.create(
                order_id=order_id,
                trade_id=trade_id
            )
        # 修改订单状态
            OrderInfo.object.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
            return Response({'trade_id': trade_id})
        else:
            return Response({'message': "请求参数有误"}, status=status.HTTP_400_BAD_REQUEST)



成功页面:

python支付系统 python对接支付宝支付_python支付系统_03



搭建开发环境