使用第三方包来完成支付宝sdk调用:
安装
# 安装python-alipay-sdk
pip install python-alipay-sdk --upgrade
# 对于python2, 请安装2.0以下版本:
pip install python-alipay-sdk==1.1
生成密钥文件
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
在支付宝上下载的公钥是一个字符串,你需要在文本的首尾添加标记位,若已有则不需要再添加
-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY-----
实例:
def test(request):
# 获取前端传来的订单id
order_id = request.GET.get('order_id')
data = {
'order_id': order_id
}
# 将订单id作为json格式返回
return JsonResponse(data=data)
def alipay(request):
# 获取订单id
order_id = request.GET.get('order_id')
# 在数据库中根据订单id查找对应的订单对象
order = Order.objects.get(id=order_id)
# 订单价格
order_price = order.o_price
# 订单商品
order_goods = OrderGoods.objects.filter(o_order_id=order_id)
# 获取订单商品名字和数量,存在列表中
order_goods_list = []
for good in order_goods:
order_goods_list.append('{}*{}'.format(good.o_goods.prodectlongname, good.o_goods_num))
# 创建alipei对象
alipay_client = AliPay(
appid=ALIPAY_APPID, # 在settings中创建的支付宝appid,需要在支付宝官网生成应用之后获取appid
app_notify_url=None, # 定义默认回调url
app_private_key_string=APP_PRIVATE_KEY, # 在支付宝官网根据文档操作生成的应用私钥
alipay_public_key_string=ALIPAY_PUBLIC_KEY, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=False, # 默认False
verbose=False, # 输出调试数据
config=AliPayConfig(timeout=15), # 可选, 请求超时时间
)
subject = str(order_goods_list)
# 传给支付宝的订单信息
order_string = alipay_client.api_alipay_trade_page_pay(
out_trade_no=order_id, # 订单id
total_amount=order_price, # 订单金额
subject=subject, # 订单明细
return_url="https://opendocs.alipay.com/", # 支付完成后的跳转页面
notify_url="https://opendocs.alipay.com/" # 可选, 不填则使用默认notify url
)
# 将订单信息发送给支付宝生成交易订单
return redirect('https://openapi.alipaydev.com/gateway.do?' + order_string)
$(function () {
# 在html页面的支付按钮上添加点击事件
$("#alipay").click(function () {
console.log('pay')
var order_id = $(this).attr('order_id')
# 调用test函数获取订单id
$.getJSON('/axf/test/', {
"order_id": order_id}, function (data) {
# 将订单id作为路由参数传给服务器,生成支付宝订单
window.open('/axf/alipay/?order_id=' + data['order_id'])
# 获取订单支付状态
$.getJSON('/axf/payed', {
"order_id": order_id}, function (data) {
console.log(data)
window.open('/axf/mine_icon/',target="_self")
})
})
})
})