安装python-alipay-sdk

pip install python-alipay-sdk --upgrade

配置

视图函数orders/views.py

# 订单支付
# /order/pay
from alipay import AliPay, ISVAliPay
import os
from django.conf import settings
class OrderPayView(View):
def post(self, request):
'''支付页面'''
# 判断用户是否登录
user = request.user
if not user.is_authenticated():
return JsonResponse({'res':0, 'errmsg':'用户尚未登录'})
# 接收订单id
order_id = request.POST.get('order_id')
# 校验订单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调用支付宝的支付接口
# 支付宝信息 不能放在settings里 会报错
alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调url 如果为空的话不能用'' 要用None
# 个人私钥
app_private_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/app_private_key.pem'),
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/alipay_public_key.pem'),
# 加密方式
sign_type="RSA2", # RSA 或者 RSA2
# 沙箱是True 正式环境是False
debug=True # 默认False
)
# 调用支付接口
# 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string 实际地址
# 沙箱地址 https://openapi.alipaydev.com/gateway.do? + order_string 沙箱地址在alipay后面加上dev
total_price = order.total_price + order.transit_price # Decimal
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id, # 订单id
total_amount=str(total_price), # 支付总金额 因为Decimal格式不能序列化 所以先转成字符串
subject='天天生鲜%s'%order_id,
return_url=None,
notify_url=None # 可选, 不填则使用默认notify url
)
# 返回应答
pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
return JsonResponse({'res':3, 'pay_url':pay_url})

配置路由urls.py

from django.conf.urls import url
from orders.views import OrderPlaceView, OrderCommitView, OrderPayView urlpatterns = [
url(r'^place$', OrderPlaceView.as_view(), name='place'), # 提交订单页面
url(r'^commit$', OrderCommitView.as_view(), name='commit'), # 提交订单处理
url(r'^pay$', OrderPayView.as_view(), name='pay'), # 订单支付 ]

用户订单页面user_center_order.html

{% block bottomfiles %}
<script src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
<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')
// 获取订单id
order_id = $(this).attr('order_id')
console.log(status)
if (status == 1){
// 进行支付
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{
alert(data.errmsg)
}
})
}
else if (status == 4){
// 其他情况
// 跳转到评价页面
location.href = '/order/comment/'+order_id
}
})
</script>
{% endblock bottomfiles %}

点击去付款,报错

ValueError at /order/pay
RSA key format is not supported Request Method: POST
Request URL: http://192.168.199.130:8000/order/pay
Django Version: 1.8.2
Python Executable: /home/python/.virtualenvs/bj19/bin/python
Python Version: 3.5.2
Python Path: ['/home/python/bj19/ttsx/dailyfresh/apps', '/home/python/bj19/ttsx/dailyfresh', '/home/python/.virtualenvs/bj19/lib/python35.zip', '/home/python/.virtualenvs/bj19/lib/python3.5', '/home/python/.virtualenvs/bj19/lib/python3.5/plat-x86_64-linux-gnu', '/home/python/.virtualenvs/bj19/lib/python3.5/lib-dynload', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/home/python/.virtualenvs/bj19/lib/python3.5/site-packages', '/home/python/bj19/ttsx/dailyfresh']
Server time: 星期四, 17 十月 2019 15:21:03 +0800
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tinymce',
'user',
'cart',
'goods',
'orders',
'haystack')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware') Traceback:
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "/home/python/bj19/ttsx/dailyfresh/apps/orders/views.py" in post
374. debug=True # 默认False
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/alipay/__init__.py" in __init__
81. self._load_key()
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/alipay/__init__.py" in _load_key
89. self._app_private_key = RSA.importKey(content)
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/Cryptodome/PublicKey/RSA.py" in import_key
754. raise ValueError("RSA key format is not supported") Exception Type: ValueError at /order/pay
Exception Value: RSA key format is not supported
Request information:
GET: No GET data

查找原因 视图函数中Alipay{}中

 alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调url 如果为空的话不能用'' 要用None
# 个人私钥
app_private_key_path=os.path.join(settings.BASE_DIR, 'keys/app_private_key.pem'), # 此处是路径用path 不是string
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_path=os.path.join(settings.BASE_DIR, 'keys/alipay_public_key.pem'), # 此处是路径用path 不是string
# 加密方式
sign_type="RSA2", # RSA 或者 RSA2
# 沙箱是True 正式环境是False
debug=True # 默认False
)

OK,解决问题,继续

让网站知道已经支付成功

视图函数views.py中添加支付查询功能

class OrderCheckView(View):
def post(self, request):
'''支付查询页面'''
# 判断用户是否登录
user = request.user
if not user.is_authenticated():
return JsonResponse({'res':0, 'errmsg':'用户尚未登录'})
# 接收订单id
order_id = request.POST.get('order_id')
# 校验订单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调用支付宝的支付接口
# 支付宝信息 不能放在settings里 会报错 alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调url 如果为空的话不能用'' 要用None
# 个人私钥
app_private_key_path=os.path.join(settings.BASE_DIR, 'keys/app_private_key.pem'),
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_path=os.path.join(settings.BASE_DIR, 'keys/alipay_public_key.pem'),
# 加密方式
sign_type="RSA2", # RSA 或者 RSA2
# 沙箱是True 正式环境是False
debug=True # 默认False
) # 调用支付宝交易查询接口
while True:
response = alipay.api_alipay_trade_query(order_id) # response = {
# "alipay_trade_query_response": {
# "trade_no": "2017032121001004070200176844", # 支付宝交易号
# "code": "10000", # 返回码
# "invoice_amount": "20.00",
# "open_id": "20880072506750308812798160715407",
# "fund_bill_list": [
# {
# "amount": "20.00",
# "fund_channel": "ALIPAYACCOUNT"
# }
# ],
# "buyer_logon_id": "csq***@sandbox.com",
# "send_pay_date": "2017-03-21 13:29:17",
# "receipt_amount": "20.00",
# "out_trade_no": "out_trade_no15",
# "buyer_pay_amount": "20.00",
# "buyer_user_id": "2088102169481075",
# "msg": "Success",
# "point_amount": "0.00",
# "trade_status": "TRADE_SUCCESS", # 交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
# "total_amount": "20.00"
# },
# "sign": ""
# } code = response.get('code')
if code == '' 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':'支付成功'})
elif code =='' or (code == '' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
# 等待买家付款
import time
time.sleep(5)
continue # 跳过本次循环 重新开始循环
else:
# 支付出错
return JsonResponse({'res':4, 'errmsg':'支付失败'})

模板中ajax转到查询

{% block bottomfiles %}
<script src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
<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')
// 获取订单id
order_id = $(this).attr('order_id')
console.log(status)
if (status == 1){
// 进行支付
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, 获取支付交易的结果
// ajax post 传递参数:order_id
$.post('/order/check', params, function (data){
if (data.res == 3){
alert(data.message)
// 刷新页面
location.reload()
}
else{
alert(data.errmsg)
}
})
}
else{
alert(data.errmsg)
}
})
}
else if (status == 4){
// 其他情况
// 跳转到评价页面
location.href = '/order/comment/'+order_id
}
})
</script>
{% endblock bottomfiles %}

django-支付宝支付的更多相关文章

  1. $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)

    一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...

  2. django支付宝支付集成

    概要 本文是关于django集成支付宝[电脑网站支付]功能的过程记录. 功能逻辑主要分为两块: 用户下单跳转至支付宝支付界面 支付成功的回调验证 本文用到的alipay-sdk是基于阿里开发文档htt ...

  3. Django——支付宝支付功能

    前期准备 首先我们需要获得支付宝提供的权限与接口,在蚂蚁开放平台进行相关申请:https://openhome.alipay.com/platform/appDaily.htm?tab=info 申请 ...

  4. 基于python-django框架的支付宝支付案例

    目录 @ 一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式 ...

  5. 在django中实现支付宝支付(支付宝接口调用)

    支付宝支付 正式环境:用营业执照,申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付 ...

  6. Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付

    一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付

  7. python调用支付宝支付接口详细示例—附带Django demo代码

    项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公钥 2.应用公钥 3.应用私钥 4.APPID 5.Django 1.11. ...

  8. django中使用事务以及接入支付宝支付功能

    之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下. 商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入.先来看看订单 ...

  9. Python Django 支付宝 扫码支付

    安装python-alipay-sdk pip install python-alipay-sdk --upgradepip install crypto 如果是python 2.7安装0.6.4这个 ...

  10. Django 对接 支付宝支付, 回调

    平台 点击这里进入 蚂蚁金服开放平台 沙箱 点击这里进入 沙箱环境 初始界面 设置公钥 下载创建秘钥工具 1.  进入文档中心 这里 2. 选中 电脑网站支付 3. 进入后选中 API 列表 中的 统 ...

随机推荐

  1. [原创]开源跨平台大型网络端口扫描器K8PortScan(支持批量A段/B段/C段/IP列表)

    0x000 K8PortScan Python版Cscan端口扫描器 Code: https://github.com/k8gege/K8PortScan K8portScan 1.0 Date: 2 ...

  2. Java里 equals 和 == 以及 hashcode

    本文探讨的是老掉牙的基础问题,先建个实体类 package com.demo.tools; public class User { private String name; public User(S ...

  3. Python做一个计时器的动画

    一.问题在做连连看的时候需要加一个计时器的动画,这样就完成了计时功能的设计. 二.解决主要思路: 1.先产生一个画布,用深颜色填充满. 2.产生一个新的矩阵用来覆盖画布,背景用白色,就可以渲染出来递减 ...

  4. H5+asp.net 微信开发 遇到过的坑

    一.微信授权登录 1. 根据code 获取_access_tokens 2. 根据取到的openid和_access_tokens获取用户信息最神奇的是我用我自己的微信账号测试,一开始还可以取到tok ...

  5. English--五大基本句型基本概念

    English|五大基本句型基本概念 英语的基本句型是整个英语的框架体系,所以,祝愿看到此文的伙伴们,都可以牢牢掌握! 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力 ...

  6. JavaSE02:第一个程序

    HelloWorld! 写第一个程序步骤 建一个文件,文件名改为HelloWorld.java 用文本编辑器打开并编写代码 public class HelloWorld{ public static ...

  7. 禁用浏览器自动给input填充账号和密码

    如果input输入框type为text,设置autoComplete="off" <el-input v-model="ruleForm.loginId" ...

  8. 前端工程师拿到全新的 Mac 需要做哪些准备

    最近苹果退出了新款 Mac,用了3年15款Pro之后,终于盼到18款的降价,于是含泪更新换代 但是每次换电脑,重装环境的好多东西记不清,于是记个笔记 一.终端 安装 zsh sh -c "$ ...

  9. 英语insuraunce保险insuraunce单词

    English Alternative forms insuraunce Etymology From the older form ensurance, see also assurance. Pr ...

  10. Web前端2019面试总结2

    1.js继承: 想要继承,就必须要提供个父类(继承谁,提供继承的属性) 组合继承(组合原型链继承和借用构造函数继承)(常用) 重点:结合了两种模式的优点,传参和复用 特点:1.可以继承父类原型上的属性 ...