django-支付宝支付
安装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-支付宝支付的更多相关文章
- $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)
一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...
- django支付宝支付集成
概要 本文是关于django集成支付宝[电脑网站支付]功能的过程记录. 功能逻辑主要分为两块: 用户下单跳转至支付宝支付界面 支付成功的回调验证 本文用到的alipay-sdk是基于阿里开发文档htt ...
- Django——支付宝支付功能
前期准备 首先我们需要获得支付宝提供的权限与接口,在蚂蚁开放平台进行相关申请:https://openhome.alipay.com/platform/appDaily.htm?tab=info 申请 ...
- 基于python-django框架的支付宝支付案例
目录 @ 一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式 ...
- 在django中实现支付宝支付(支付宝接口调用)
支付宝支付 正式环境:用营业执照,申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付 ...
- Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付
- python调用支付宝支付接口详细示例—附带Django demo代码
项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公钥 2.应用公钥 3.应用私钥 4.APPID 5.Django 1.11. ...
- django中使用事务以及接入支付宝支付功能
之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下. 商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入.先来看看订单 ...
- Python Django 支付宝 扫码支付
安装python-alipay-sdk pip install python-alipay-sdk --upgradepip install crypto 如果是python 2.7安装0.6.4这个 ...
- Django 对接 支付宝支付, 回调
平台 点击这里进入 蚂蚁金服开放平台 沙箱 点击这里进入 沙箱环境 初始界面 设置公钥 下载创建秘钥工具 1. 进入文档中心 这里 2. 选中 电脑网站支付 3. 进入后选中 API 列表 中的 统 ...
随机推荐
- apt-get命令使用
1.apt-get命令 apt-get命令是Debian Linux发行版中的APT软件包管理工具,所有基于Debian的发行都使用这个包管理系统. (1)命令语法 apt-get(选项)(参数) ( ...
- 天际PRO-CR16 改装方案
本人现有红色CR16一台,宿舍在7楼,最近找了一份长期兼职,不想挤公交,想骑车去,经常上下楼很是痛苦,琢磨了两天两夜,终于出来第一套小该方案,有不合理地方,或者有个好的零件选择,请各位指点.本人不胜感 ...
- 大数据技术 - 为什么是SQL
在大数据处理以及分析中 SQL 的普及率非常高,几乎是每一个大数据工程师必须掌握的语言,甚至非数据处理岗位的人也在学习使用 SQL.今天这篇文章就聊聊 SQL 在数据分析中作用以及掌握 SQL 的必要 ...
- jq动画插件,自制基于vue的圆形时钟
首先附上jq插件库,里面的东西太炫了,建议学前端的可以看看学习下:http://www.jq22.com/ 里面有个“超个性动画版本的个人简历”,通过屏幕上不断打印内容,改变相应样式来实现动画简历,我 ...
- linux学习 - 基本命令篇
关机重启命令 基本操作之修改用户名(Ubuntu) 查看系统版本号 查看系统是32位还是64位 系统进程信息查看 查看某个端口被占用的情况 查看磁盘分区使用情况 df 命令 fdisk 关机重启命令 ...
- Spring Security 解析(三) —— 个性化认证 以及 RememberMe 实现
Spring Security 解析(三) -- 个性化认证 以及 RememberMe 实现 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...
- Qt Graphics-View的打印功能实现
本文来研究一下Qt Graphics-View的打印功能实现. 在Qt的官方文档中介绍了Graphics-View的打印相关内容. Qt中对打印的支持是有一个独立的printsupport模块来完成的 ...
- 英语gzibeads天珠gzibeads单词
天珠英语是gZiBeads,藏语叫(si , 斯)汉语译为“斯”或“瑟”,又称“天降石”.在<藏汉大辞典>里天珠的解释为:“亚玛瑙,猫睛石,一种宝石,俗称九眼珠.入药能治脑溢血”.最早的天 ...
- Web前端面试总结(别人的)
http://note.youdao.com/noteshare?id=0bfbe45de0de0bc4735f867e5a6c528f&sub=D52F5C079DDE49F99A5118D ...
- linux-ifconfig 查看没有IP
ifconfig 查看没有IP,如图: 解决方法: 1.切换路径到 2.进入编辑ifcfg-ens33文件(文件名可能不同)模式 3.ONBOOT改为yes 4.点击ESC,输入:wq进行保存 5.输 ...