该项目使用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})