django对接阿里云支付
第三方支付-支付宝接入相关
1,注册开发者账号
调试支付宝支付需要先 在 支付宝开放平台 进行注册,入驻为 “自助研发者”;链接为 https://open.alipay.com/platform/home.htm
第一次进入需要填写详细信息 - 注意:切换为 自研开发者
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izzsqltQ-1619270557404)(images\1584197606859.png)]
2,进入沙箱
完善个人信息后,在个人管理后台可看到 “沙箱” 服务
注:沙箱为支付宝提供的调试支付的测试环境,在该环境下,可模拟和调试支付流程
具体位置如下: 开发者中心 - 首页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbnun72B-1619270557410)(images\1584258109763.png)]
3,查看沙箱
点击 研发服务 - 进入沙箱后, 在沙箱应用选项中可以看到支付宝提供的测试应用
注:当您的网站上线运营时,需要在开放平台申请一个应用;并填写相关信息审核后,方可使用支付功能;沙箱应用为支付宝提供开发者测试用的应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQLIHTXt-1619270557412)(images\1584258794452.png)]
4,生成&添加 RSA 公私钥
4-1 生成钥匙
支付过程中涉及到请求和响应的签名校验;
在linux终端中 输入openssl 进入 交互环境
tarena@tedu:~$openssl
OpenSSL> genrsa -out app_private_key.pem 2048 #私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #导出公钥
OpenSSL> exit
tarena@tedu:~$lsapp_private_key.pem app_public_key.pem
RSA 钥匙用途
公钥加密/私钥解密
私钥签名/公钥验签
4-2 添加公钥
点击 沙箱应用展示信息页中的 RSA2密钥 的 设置/查看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pr2YkmTr-1619270557416)(images\1584259358341.png)]
在弹出的对话框中,选择 公钥 模式
并将您刚才生成出的 app_public_key.pem 中的内容 复制到 红色大框体内,并保存复制
注意,生成公钥如下, 只复制 -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 之间的内容即可
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA871I3CXvQWXcbwbcyEJB
r7Prxfhf34z1lzZWEaeBugCiUNjK2llrVKyV5tcHqxv9xTzQXz6Mg4n0jmhqkqtI
B6gCNAo5bYMN9nDRnqZ33ojJmZMmxupWUZCvz+3Svft0P0hd/oKc0OZOTI8MPPNV
y5HsovhABUfVsTgSH/AlMoKEz7sM7Cqtb2LT8nZewSdrnEhLrw7KFkDyNfftO8CF
yls6MbNeI4CHmc0PTcXJ7O8+Fx0WOJrYDKPMHW25OxB1IT3Pdn8PnAbtYeRoiUU1
Yfp/qZMmnedZgF0Qpr+ZIZLPhAZrRwqfMcfSIiNJvmcsUKVGLBal10frAIztHKmW
eQIDAQAB
-----END PUBLIC KEY-----
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcJQRd0O-1619270557418)(images\1584259487199.png)]
4-3 保存支付宝公钥
提交我方公钥后,弹框会显示 支付宝公钥;该公钥需要复制保存下来;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNca72GZ-1619270557420)(images\1584260105387.png)]
保存流程如下:
1,用户目录下
vim alipay_public_key.pem2,进入vim后手动添加如下两行
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----3,光标在BEGIN处 点击 键盘o 进入插入模式,此时光标停留在 BEGIN和END的两行之间;粘贴支付宝公钥 最终格式如下-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgVjSs4PrjOsJ/c/m7SDYoPKPIwvEwq3U6p2dzpB0X/wVsYsZEHLrWEeVZfTHi9J0yrvwnxgUPlCGKv4EaJuc8msWuuH3TxEvurTPJxYUCOiBIQYeG5iRTh3fWyCkMlLNm8UXv0v+KRVK9bZ17cWB0vBM7iwrytGbfKg0vhIjsybbOd4VM/m4bWZOFdkXAmJfbO+pfMsa9TzF5zYmSpoHuBAkGu9m7EtzzBlXifthYkhvyEAX/XWG3rgaEe+l8W+NlPZ1uudZ2AIWLvnLl5Jjrcz1yMJqOhsobBrPiWbnwnRsMz1Sn9W9rl/cGITcboPlEMgs988Vcd/o21gHDNwNKQIDAQAB
-----END PUBLIC KEY-----4,esc退出插入模式, 执行 :wq 退出保存
5, 安装 python 的 支付宝组件
# 安装python-alipay-sdk
sudo pip3 install python-alipay-sdk -i https://pypi.tuna.tsinghua.edu.cn/simple#安装成功后执行如下命令 校验安装结果
tarena@tedu:~$ pip3 freeze|grep -i ali
python-alipay-sdk==2.0.1 #输出此结果 则表示安装成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEVctcu4-1619270557421)(images/支付宝交互时序图.png)]
关于return_url和notify_url的问题
return_url 【GET】
- 如果不给return_url支付宝处理完业务会留在自己的网页不做跳转
- 重定向时会带上订单编号等参数
notify_url 【POST】
支付结果异步通知
对于 PC 网站支付的交易,在用户支付完成之后,支付宝会根据 API 中商户传入的 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商户系统。
详见(https://docs.open.alipay.com/270/105902/)
代码演示
6, 正式接入支付宝
当您在沙箱环境测试完毕后,且您的网站基础功能均已开发完毕,需要在支付宝开放平台 申请应用 方可 正式接入到支付宝
6-1 创建应用
开放平台首页- 创建应用 - 网页&移动应用 - 支付接入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wPzsRu8-1619270557422)(images\1584262028920.png)]
6-2 填写应用信息
填写应用相关信息后 点击 - 确认创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hiUerKiE-1619270557423)(images\1584262225057.png)]
6-3 签约 快捷即时到账 功能
快捷即时到账 即为 支付宝的 网页支付功能,该功能需要 在应用显示页面手动添加才可支持
步骤1 点击 添加能力
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGYn0TX2-1619270557424)(images\1584262610212.png)]
步骤2 选择 快捷即时到账
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UMhQIHO-1619270557425)(images\1584262807310.png)]
6-4 添加公钥 - 同 沙箱流程
在当前应用信息显示页下方,设置 接口加签方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EmmPfZeH-1619270557426)(images\1584262861802.png)]
########################################################################
#代码
安装 python -django和 支付宝组件
# 安装python-alipay-sdk
pip3 install django
sudo pip3 install python-alipay-sdk -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install alipay
创建django项目及应用
django-admin startproject alipay_test
cd alipay_test
python3 manage.py startapp payment
mkdir -p templates static/js static/key_file
cd ~
cp -r app_private_key.pem app_public_key.pem alipay_public_key.pem /opt/alipay_test/static/key_file
alipay_test/settings.py
vim alipay_test/settings.py
"""
Django settings for alipay_test project.Generated by 'django-admin startproject' using Django 2.2.12.For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""import os# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '$4tskf_#avav07j6aesl)!txzf5$8mgj65e1+g9t7v%a4+22*&'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = '*'# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',#'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'alipay_test.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'alipay_test.wsgi.application'# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}
}# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/STATIC_URL = '/static/'
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)ALIPAY_APP_ID = '2021000117644254357'
ALIPAY_KEY_DIR = os.path.join(BASE_DIR,'static/key_file/')
ALIPAY_RETURN_URL='http://127.0.0.1:8000/payment/result/'
ALIPAY_NOTIFY_URL='http://127.0.0.1:8000/payment/result/'
alipay_test/urls.py
vim alipay_test/urls.py
"""alipay_test URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('payment/', include('payment.urls')),
]
payment/urls.py
vim payment/urls.py
from django.urls import path
from . import views
urlpatterns = [# http://127.0.0.1:8000/payment/jump/path('jump/',views.JumpView.as_view()),path('result/',views.ResultView.as_view()),]
payment/views.py
vim payment/views.py
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.views import View
from alipay import AliPay
from django.conf import settingsimport jsonapp_private_key_string = open(settings.ALIPAY_KEY_DIR + 'app_private_key.pem').read()
alipay_public_key_string = open(settings.ALIPAY_KEY_DIR + 'alipay_public_key.pem').read()ORDER_STATUAS = 1 # 1 待付款 2 已付款 3 付款失败# Create your views here.# 定义一个alipay视图类(基类),负责初始化支付相关的参数的
class MyAlipay(View):def __init__(self, **kwargs):super().__init__(**kwargs)self.alipay = AliPay(appid=settings.ALIPAY_APP_ID,app_notify_url=None,app_private_key_string=app_private_key_string,alipay_public_key_string=alipay_public_key_string,sign_type='RSA2',debug=True)print(settings.ALIPAY_APP_ID)def get_trade_url(self, order_id, amount):base_url = 'https://openapi.alipaydev.com/gateway.do'order_string = self.alipay.api_alipay_trade_page_pay(out_trade_no=order_id,total_amount=amount,subject=order_id,return_url=settings.ALIPAY_RETURN_URL,notify_url=settings.ALIPAY_NOTIFY_URL)return base_url + '?' + order_stringdef get_trade_result(self,order_id):result = self.alipay.api_alipay_trade_query(out_trade_no=order_id)if result.get('trade_status')=='TRADE_SUCCESS':return Truereturn Falsedef get_verify_result(self, data, sign):# 验证签名return self.alipay.verify(data, sign)class JumpView(MyAlipay):def get(self, request):return render(request, 'ajax_alipay.html')def post(self, request):json_obj = json.loads(request.body)order_id = json_obj['order_id']pay_url = self.get_trade_url(order_id, 199)return JsonResponse({'pay_url': pay_url})class ResultView(MyAlipay):def get(self, request):# return_url ,不带支付信息,一般会从数据中查询订单信息request_data = {k: request.GET[k] for k in request.GET.keys()}print('-----------------request data-----------------')print(request_data)order_id = request_data['out_trade_no']if ORDER_STATUAS == 1:# 证明可能post有bug,需要我们【主动向支付宝的服务器查询】result = self.get_trade_result(order_id)if result:return HttpResponse('主动查询支付成功')else:return HttpResponse('支付失败')def post(self, request):# 支付完成后,post对应的url是ALIPAY_NOTIFY_URL[带支付信息的]# 讲支付宝服务器传递过来的数据转换为标准的Python字典request_data = {k: request.POST[k] for k in request.POST.keys()}# 取出数据中签名sign = request_data.pop('sign')# 验证数据是否由支付宝服务器发送is_verify = self.get_verify_result(request_data,sign)if is_verify:# 取出交易状态trade_status = request_data['trade_status']if trade_status == 'TRADE_SUCCESS':# 将数据库的订单状态修改为已付款return HttpResponse('ok')else:# 将数据库的订单状态修改为支付失败return HttpResponse('error')else:return HttpResponse('非法访问')
下载 jquery-1.11.3.js
cp jquery-1.11.3.js /static/js/
templates/ajax_alipay.html
vim templates/ajax_alipay.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="/static/js/jquery-1.11.3.js"></script>
<body><script>function rand(min,max) {return Math.floor(Math.random()*(max-min))+min;}//模拟数据 向后端传订单idvar random_id = rand(1000,9999)var order_id = "2019111821315602" + random_id.toString()post_data = {"order_id": order_id}console.log(post_data)$(function(){$("#Btn_pay").click(function () {$.ajax({url:"http://127.0.0.1:8000/payment/jump/",type:"post",contentType: "application/json",dataType:"json",data: JSON.stringify(post_data),success:function (data) {window.location = data.pay_url},error:function(errors){console.log("错误")console.log(errors)}})})})</script><button id="Btn_pay">点击暴富</button>
</body>
</html>
测试
python3 manage.py runserver 0.0.0.0:8000
http://127.0.0.1
django对接阿里云支付相关推荐
- Rancher通过Aliyun-slb服务对接阿里云SLB教程
阿里云负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS)的流量分发控制服务. 本文将详尽演示Rancher如何通过Aliyun-slb服务对接 ...
- IDC机房对接阿里云
此篇文章主要内容为自有IDC机房Server对接阿里云的场景,此实验前提为私有IDC机房需和阿里云机房有物理链路对接,实验阿里云上产品均使用按量计费,为方便测试,具体如下拓扑: 网络拓扑(取材自阿里云 ...
- 基于SAML 2.0对接阿里云的SSO(单点登录)
背景 公司使用的阿里云作为公有云,每次员工入职或离职时同时需要维护两套账号(一套内部账号,一套阿里云RAM账号),为了让用户能够使用内部账号能访问阿里云,所以决定对接阿里云的SSO 主流程介绍 用户访 ...
- PLC通过智能网关 MQTT对接阿里云(带CA证书加密),实现物模型数据显示
IGT-SER系列智能网关支持各种PLC的以太网和串口协议,以及DL/T645.Modbus通讯,通过网关所带的参数配置工具软件,不用编程,即可打包和解析JSON格式的设备数据,通过MQTT.HTTP ...
- 对接阿里云短信服务(附视频教程)
阿里云短信服务文档使用指引: https://help.aliyun.com/document_detail/59210.html B站视频教程链接: https://www.bilibili.com ...
- Rancher通过Aliyun-slb服务对接阿里云SLB教程 1
概要 阿里云负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(Elastic Compute Service,简称 ECS)的流量分发控制服务. 负载 ...
- 手把手教你对接阿里云短信服务
正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年. 那么如何对接阿里云短信,需要做哪些操作? 可以参考https://help.aliyun.com/d ...
- go 服务接入短信验证码功能(对接阿里云平台)
简介 短信验证码还是比较常用的功能,已经有了很成熟的方案,本篇介绍的是对接阿里云的短信服务,一条短信大概两分钱. 基本的流程是: 到对应的云平台申请权限,大致费用都差不多 照着官方文档进行对接,并集成 ...
- SpringBoot集成阿里云支付
阿里云支付 支付宝官方文档说明 https://opendocs.alipay.com/open/203/107091 开发准备 1.登录支付宝开发平台(支付宝账号) 地址: https://open ...
最新文章
- android 不重新加载,android – 返回Activity而不重新创建(不调用onCreate())
- 斯坦福2021版图机器学习课程完结,视频、PPT全放送,大神主讲
- linux 设备树调试必须知道的几个路径
- DNS服务器的默认区域文件名,DNS服务器全攻略之三 :创建与管理DNS区域.doc
- malloc、calloc、realloc和free
- @font-face详细用法+实例——Web响应式前端学习笔记
- 王义成:阿里云Redis服务助力游戏行业发展
- 劝你要看一些有门槛的机会
- IDEA: .java文件和.class不一致
- ADS仿真学习:s2p文件导入ADS
- Linux安全模块(LSM)学习——简单的LSM demo(1)
- iOS 中可能用到的数学公式(绝对值、平方、取整、正余弦)
- python语言转换为go_从 Python 到 Golang-Go语言中文社区
- 亚马逊领导力准则14条
- 设计模式:访问者模式-vistor
- 2021新宁二中高考喜报成绩查询,新宁二中举行2021年高考倒计时100天誓师大会
- 广州蓝景分享—遇到网页慢,我们该怎么办?
- 1001: 植树问题 ZZULIOJ
- ssh日志审计_linux操作命令日志汇总审计【rsyslog】
- 从欧美到亚洲,2019年全球有多少个软件工程师?