支付寶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("支付異常")