該項目使用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})