python對接支付寶支付接口

該項目使用django對接支付寶網站支付接口

前期準備

1. APPID
2. 支付寶公鑰-應用公鑰-應用私鑰
3. 安裝支付寶平臺python SDK
pip install python-alipay-sdk --upgrade (非官方)

調用支付接口

一般支付流程爲:
前端向後端發送一個ajax post請求,攜帶訂單id;

經過一部分的邏輯處理,我們調用支付寶電腦網站支付接口,支付寶根據我們的請求參數 最終返回支付頁面的地址。此時,我們得到了支付頁面的url,我們需要將它傳給前端

from alipay import AliPay
class PayView(View):
    '''訂單支付'''
    def post(self,request):
        #當用戶點擊去付款後,經過前面的判斷後,
        # 進入下面的業務處理:使用python sdk調用支付寶的支付接口
        app_private_key_string = '-----BEGIN PRIVATE KEY-----\n' + '你的應用私鑰' + '\n-----END PRIVATE KEY-----'
        alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + '你的支付寶公鑰' + '\n-----END PUBLIC KEY-----'
        #初始化
        alipay = AliPay(
            appid="2016102500754813", #應用id
            app_notify_url=None,  #默認回調url; 支付寶後臺完成支付的時候異步通知到商戶的後臺服務器的URL地址
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            debug=True
        )
        #調用支付接口,電腦網站支付
        order_string = alipay.api_alipay_trade_page_pay(  # 調用支付寶接口,立刻返回 部分支付頁面的url,我們需要引導用戶去點擊
            subject="測試訂單",
            out_trade_no=request.POST.get('order_id',''),
            total_amount=100,
            return_url='https://www.baidu.com',  # 同步訪問,支付成功後支付頁面要跳轉到哪個頁面  django網站地址,並會傳遞參數,告訴網站用戶支付的結果
            notify_url=None
        )
        # 支付寶處理完後 最終返回支付頁面的地址,我們需要引導用戶進入該地址頁面
        # 將調用接口返回的url與固定url鏈接起來,就是完整的支付頁面url
        pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string
        return JsonResponse({'pay_url':pay_url,'status':"SUCCESS"})

前端ajax得到後端響應 進入對應回調函數,得到支付頁面的地址,並跳轉到該支付頁面;
由於我們是沙箱環境,所以只能通過api_alipay_trade_query接口查詢交易結果,所以在跳轉語句後還需向服務器發送一個ajax 請求,查詢交易結果
在這裏插入圖片描述

前端代碼:

success: function (result, text_status) {  {# 成功以後的回調 返回字面量對象,描述狀態的字符串 #}
                console.log(result, typeof result);
                console.log(text_status);
                if (result['status'] == 'SUCCESS') {
                    //引導用戶到支付頁面
                     window.open(result['pay_url']);
                    //瀏覽器訪問 /order/check ,獲取支付交易的結果
                    $.post({% url 'check' %},{
                        'order_id': order_id,
                'csrfmiddlewaretoken': '{{ csrf_token }}'
                    },function (data) {
                        if (data["res"] == 1){
                            alert(data['msg']);
                            window.open('https://www.baidu.com');
{#                            location.reload();//刷新頁面#}
                        }else{
                            alert(data['msg']);
                        }

                    });

                }
                else {
                    alert(result['ajax_delete_error_msg']);
                }
            }

在查詢交易結果的視圖中,我們同樣需要初始化;由於用戶支付時間不確定,所以我們需要在While中,不間斷的請求支付寶查詢接口,根據交易狀態進行返回或者繼續循環

class CheckView(View):
    def post(self,request):
        '''查看訂單支付的結果'''
        app_private_key_string = '-----BEGIN PRIVATE KEY-----\n' + '你的用私鑰' + '\n-----END PRIVATE KEY-----'
        alipay_public_key_string = '-----BEGIN PUBLIC KEY-----\n' + '你的應用公鑰' + '\n-----END PUBLIC KEY-----'
        # 初始化
        alipay = AliPay(
            appid="2016102500754813",  # 應用id
            app_notify_url=None,  # 默認回調url; 支付寶後臺完成支付的時候異步通知到商戶的後臺服務器的URL地址
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            debug=True
        )


        while True:
            # 調用支付寶交易查詢接口,返回交易結果 字典類型
            response = alipay.api_alipay_trade_query(
                out_trade_no=request.POST.get('order_id', '')   #訂單號,必須是支付了的訂單後,與上面的pay訂單號一致
            )
            code = response.get('code')
            print(response)
            if code == '10000' and response.get('trade_status') == "TRASW_SUCCESS":
                #支付成功
                return JsonResponse({'res':1,'msg':'支付成功啦!'})
            elif code=="40004" or code=="10000" and response.get('trade_status') == 'WAIT_BUYER_PAY':
                #等待買家付款
                import time
                time.sleep(5)
                continue
            else:
                #支付出錯
                return JsonResponse({'res':1,'msg':response})


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章