網站接入支付寶支付業務


 支付寶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