网站接入支付宝支付业务


 支付宝python SDK接口文档:

https://pypi.org/project/alipay-sdk-python/#description

 

网站对接支付宝流程

 

 

 

 

 

 

 

获取支付宝付款二维码url:

class OrderPayView(View):
    """完成支付"""
    def post(self,request):
        # 用户是否登录
        user = request.user
        if not  user.is_authenticated:
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})
        # 接收参数
        order_id = request.POST.get('order_id')
        # 检验参数
        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '无效的订单id'})
        try:
            order=OrderInfo.objects.get(order_id=order_id,
                                  user=user,
                                  pay_method=3,
                                  order_status=1)
        except OrderInfo.DoesNotExist:
            # 无效订单
            return JsonResponse({'res': 2, 'errmsg': '无效的订单,目前只支持支付宝支付'})
        # 业务处理:使用python SDK 调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid=settings.ALI_PAY['default']['app_id'],  # 应用id
            app_notify_url='http://www.relishfruit.com',  # 默认回调url
            app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'],
            alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'],
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALI_PAY['default']['debug']  # 默认False
        )
        # 调用支付接口
        # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        total_pay = order.total_price+order.transit_price # Decimal
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,  # 订单id
            total_amount=str(total_pay),
            subject="ForYou-%s" % order_id,
            return_url=settings.ALI_PAY['default']['callback_url'],
            notify_url=settings.ALI_PAY['default']['callback_url']  # 可选, 不填则使用默认notify url
        )
        # 返回应答
        pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
        return JsonResponse({'res': 3, 'pay_url': pay_url})

 

 

查询支付结果

注意:

  • return_url(同步通知Get请求)页面回跳,用于指定支付宝支付完成后所要跳转的页面
  • 处理支付宝的notify_url(异步通知),当支付宝完成订单支付后就会向notify_url发送post请求,告知商户支付成功

 

 

class CheckPayView(View):
    """查看订单支付的结果"""
# return_url(同步通知Get请求)页面回跳,用于指定支付宝支付完成后所要跳转的页面 def get(self, request): """ 处理支付宝的return_url返回 :param request: :return: """ processed_dict = {} for key, value in request.GET.items(): processed_dict[key] = value sign = processed_dict.pop("sign", None) alipay = AliPay( appid=settings.ALI_PAY['default']['app_id'], app_notify_url=settings.ALI_PAY['default']['app_notify_url'], app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'], alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=settings.ALI_PAY['default']['debug'], # 默认False, ) verify_re = alipay.verify(processed_dict, sign) if verify_re is True: order_sn = processed_dict.get('out_trade_no', None) trade_no = processed_dict.get('trade_no', None) trade_status = processed_dict.get('trade_status') while True: response = alipay.api_alipay_trade_query(order_sn) code = response.get('code') if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS': # 支付成功 trade_status = 4 # 待评价 exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 for existed_order in exist_orders: existed_order.order_status = trade_status existed_order.trade_no = trade_no existed_order.create_time = datetime.now() existed_order.save() # 返回结果 break elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'): # 等待买家付款 # 业务处理失败,可能一会就会成功 import time time.sleep(5) continue else: # 支付出错 break response = redirect(settings.ALI_PAY['default']['return_url']) return response else: response = redirect("http://www.relishfruit.com:8000/index") return response
# 处理支付宝的notify_url(异步通知)
    # 当支付宝完成订单支付后就会向notify_url发送post请求,告知商户支付成功 def post(self, request):
"""查询支付结果""" processed_dict = {} for key, value in request.GET.items(): processed_dict[key] = value sign = processed_dict.pop("sign", None) alipay = AliPay( appid=settings.ALI_PAY['default']['app_id'], app_notify_url=settings.ALI_PAY['default']['app_notify_url'], app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'], alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=settings.ALI_PAY['default']['debug'], # 默认False, ) verify_re = alipay.verify(processed_dict, sign) if verify_re is True: order_sn = processed_dict.get('out_trade_no', None) trade_no = processed_dict.get('trade_no', None) trade_status = processed_dict.get('trade_status', 1) exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 while True: response = alipay.api_alipay_trade_query(order_sn) code = response.get('code') if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS': # 支付成功 trade_status = 4 # 待评价 exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 for existed_order in exist_orders: order_goods = existed_order.ordergoods_set.all() for order_good in order_goods: goods = order_good.sku goods.sales += order_good.count goods.save() existed_order.order_status = trade_status existed_order.trade_no = trade_no existed_order.create_time = datetime.now() existed_order.save() # 返回结果 return HttpResponse("success") elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'): # 等待买家付款 # 业务处理失败,可能一会就会成功 import time time.sleep(5) continue else: # 支付出错 return HttpResponse("支付异常")

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM