支付宝开放平台登录,进入沙箱环境
https://open.alipay.com/platform/home.htm
开发文档:
https://openhome.alipay.com/developmentDocument.htm
https://docs.open.alipay.com/270/
发送给支付的请求都需要进行签名:
https://docs.open.alipay.com/291/106118
GitHub的python-alipay-sdk开发文档:
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md#python-alipay-sdk
小鸡活动网
http://xiaojihuodong.com
订单支付_网站对接支付宝流程图
订单支付_订单支付代码
使用python工具包:
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
使用教程
安装:
安装python-alipay-sdk
在ubuntu中运行,需要管理员权限
pip3 install python-alipay-sdk --upgrade --user
或
sudo pip3 install python-alipay-sdk --upgrade
生成秘钥文件
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
会生成私钥和公钥文件
把文件里的公钥设置在支付宝上
把支付宝的公钥复制粘贴到文件里
把生成的私钥和支付宝的公钥放在django里
开始写代码
订单支付
alipay.trade.pay(统一收单交易支付接口):https://docs.open.alipay.com/api_1/alipay.trade.pay/
alipay.api_alipay_trade_page_pay
from alipay import AliPay
from django.conf import settings
import os
#订单支付
#ajax post
#前端传递参数:订单id(order_id)
#/order/pay
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_id:订单id,user:用户,pay_method=3:支付方式(支付宝),order_status:订单状态(未支付)
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="2016092200568545", #APPID
app_notify_url=None, # 默认回调url,可以传也可以不传
app_private_key_path=os.path.join(settings.BASE_DIR,"apps/order/app_private_key.pem"), #私钥的路径
alipay_public_key_path=os.path.join(settings.BASE_DIR,"apps/order/app_public_key.pem"),#支付宝公钥的路径
sign_type="RSA2", # RSA 或者 RSA2,签名的算法
debug = True # 默认False,沙箱环境改成True
)
#借助alipay对象,向支付宝发起支付请求
#电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do?+order_string
total_pay = order.total_price + order.transit_price #订单总金额
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id, #订单id
total_amount=str(total_pay), #支付宝总金额
subject="天天生鲜%s"%order_id, #订单标题
return_url=None,
notify_url=None
)
#返回应答
pay_url = "https://openapi.alipaydev.com/gateway.do?"+order_string
return JsonResponse({"res":3,"pay_url":pay_url})
配置URL
url(r'^pay$',OrderPayView.as_view(),name="pay"),#订单支付
配置前端
...
{% load staticfiles %}
...
{% csrf_token %}
...
<!-- order_id:订单id,status:支付状态 -->
<a href="#" order_id={{ order.order_id }} status="{{ order.order_status }}" class="oper_btn">去付款</a></td>
...
<script src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
<script>
$('.oper_btn').click(function () {
console.log('1')
//获取status订单状态
status=$(this).attr('status');
if(status ==1){
//进行支付
//获取订单id
order_id = $(this).attr('order_id');
csrf = $('input[name="csrfmiddlewaretoken"]').val();
//组织参数
params = {"order_id":order_id,"csrfmiddlewaretoken":csrf};
//发起ajax post请求,访问/order/pay,传递参数:order_id
$.post('/order/pay',params,function (data) {
if(data.res == 3){
//引导用户到支付页面
window.open(data.pay_url)
}else{
alart(data.errmsg)
}
})
}else{
//其他情况
}
});
</script>
查看订单支付的结果
alipay.trade.query(统一收单线下交易查询) :https://docs.open.alipay.com/api_1/alipay.trade.query/
api_alipay_trade_query
#查看订单支付的结果
#ajax post
#前端传递参数:订单id(order_id)
#/order/check
class CheckPayView(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":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= '2016092200568545',
app_notify_url=None,
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/order/app_private_key.pem"), # 私钥的路径
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/order/app_public_key.pem"), # 支付宝公钥的路径
sign_type="RSA2",
debug=True
)
while True:
response = alipay.api_alipay_trade_query(order_id)
code = response.get("code")
#如果返回码为10000和交易状态为交易支付成功
if code == "10000" and response.get("trade_status") == "TRADE_SUCCESS":
#支付成功
#获取支付宝交易号
trade_no = response.get("trade_no")
#更新订单状态
order.trade_no = trade_no
order.order_status = 4 #待评价
order.save()
return JsonResponse({"res":3,"message":"支付成功"})
#返回码为40004 或 交易状态为等待买家付款
elif code == "40004" or (response.get("trade_status") == "WAIT_BUYER_PAY"):
#等待买家付款
#业务处理失败,可能一会就会成功
import time
time.sleep(5)
continue
else:
#支付出错
return JsonResponse({"res":4,"errmsg":"支付失败"})
url
url(r'^check$',CheckPayView.as_view(),name="check"), #查询支付交易结果
前端
<script>
/*$(".oper_btn").each(function(){
//获取支付状态
status = $(this).attr('status');
if(status == 1){
$(this).text("去支付")
}else if(status == 4){
$(this).text("去评价")
}else if(status ==5){
$(this).text("已完成")
}
});
$('.oper_btn').click(function () {
//获取status订单状态
status=$(this).attr('status');
order_id = $(this).attr('order_id');
if(status ==1){
//进行支付
//获取订单id
csrf = $('input[name="csrfmiddlewaretoken"]').val();
//组织参数
params = {"order_id":order_id,"csrfmiddlewaretoken":csrf};
//发起ajax post请求,访问/order/pay,传递参数:order_id
$.post('/order/pay',params,function (data) {
if(data.res == 3){
//引导用户到支付页面
window.open(data.pay_url);
*/
//浏览器访问/order/check,获取支付交易的结果
$.post('/order/check',params,function (data) {
if(data.res == 3){
//刷新页面
location.reload()
/*
}else{
alert(data.errmsg)
}
})
}else{
alart(data.errmsg)
}
})
}else{
//其他情况
//跳转到评价页面
location.href="/order/comment/"+order_id
}
});
*/
</script>