第三方支付-支付宝接入相关

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对接阿里云支付相关推荐

  1. Rancher通过Aliyun-slb服务对接阿里云SLB教程

    阿里云负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS)的流量分发控制服务. 本文将详尽演示Rancher如何通过Aliyun-slb服务对接 ...

  2. IDC机房对接阿里云

    此篇文章主要内容为自有IDC机房Server对接阿里云的场景,此实验前提为私有IDC机房需和阿里云机房有物理链路对接,实验阿里云上产品均使用按量计费,为方便测试,具体如下拓扑: 网络拓扑(取材自阿里云 ...

  3. 基于SAML 2.0对接阿里云的SSO(单点登录)

    背景 公司使用的阿里云作为公有云,每次员工入职或离职时同时需要维护两套账号(一套内部账号,一套阿里云RAM账号),为了让用户能够使用内部账号能访问阿里云,所以决定对接阿里云的SSO 主流程介绍 用户访 ...

  4. PLC通过智能网关 MQTT对接阿里云(带CA证书加密),实现物模型数据显示

    IGT-SER系列智能网关支持各种PLC的以太网和串口协议,以及DL/T645.Modbus通讯,通过网关所带的参数配置工具软件,不用编程,即可打包和解析JSON格式的设备数据,通过MQTT.HTTP ...

  5. 对接阿里云短信服务(附视频教程)

    阿里云短信服务文档使用指引: https://help.aliyun.com/document_detail/59210.html B站视频教程链接: https://www.bilibili.com ...

  6. Rancher通过Aliyun-slb服务对接阿里云SLB教程 1

    概要 阿里云负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(Elastic Compute Service,简称 ECS)的流量分发控制服务. 负载 ...

  7. 手把手教你对接阿里云短信服务

    正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年. 那么如何对接阿里云短信,需要做哪些操作? 可以参考https://help.aliyun.com/d ...

  8. go 服务接入短信验证码功能(对接阿里云平台)

    简介 短信验证码还是比较常用的功能,已经有了很成熟的方案,本篇介绍的是对接阿里云的短信服务,一条短信大概两分钱. 基本的流程是: 到对应的云平台申请权限,大致费用都差不多 照着官方文档进行对接,并集成 ...

  9. SpringBoot集成阿里云支付

    阿里云支付 支付宝官方文档说明 https://opendocs.alipay.com/open/203/107091 开发准备 1.登录支付宝开发平台(支付宝账号) 地址: https://open ...

最新文章

  1. android 不重新加载,android – 返回Activity而不重新创建(不调用onCreate())
  2. 斯坦福2021版图机器学习课程完结,视频、PPT全放送,大神主讲
  3. linux 设备树调试必须知道的几个路径
  4. DNS服务器的默认区域文件名,DNS服务器全攻略之三 :创建与管理DNS区域.doc
  5. malloc、calloc、realloc和free
  6. @font-face详细用法+实例——Web响应式前端学习笔记
  7. 王义成:阿里云Redis服务助力游戏行业发展
  8. 劝你要看一些有门槛的机会
  9. IDEA: .java文件和.class不一致
  10. ADS仿真学习:s2p文件导入ADS
  11. Linux安全模块(LSM)学习——简单的LSM demo(1)
  12. iOS 中可能用到的数学公式(绝对值、平方、取整、正余弦)
  13. python语言转换为go_从 Python 到 Golang-Go语言中文社区
  14. 亚马逊领导力准则14条
  15. 设计模式:访问者模式-vistor
  16. 2021新宁二中高考喜报成绩查询,新宁二中举行2021年高考倒计时100天誓师大会
  17. 广州蓝景分享—遇到网页慢,我们该怎么办?
  18. 1001: 植树问题 ZZULIOJ
  19. ssh日志审计_linux操作命令日志汇总审计【rsyslog】
  20. 从欧美到亚洲,2019年全球有多少个软件工程师?

热门文章

  1. 温州中小企业信息化:只穿合脚的鞋
  2. linux fceux 源码,Linux游戏资源整理(一)游戏模拟器
  3. 怎么用电脑把mkv格式转换成mp4
  4. autojs教程:全民种豆app脚本代码
  5. PaddleDetection 快速上手
  6. 【数学物理方法】导入总结
  7. 像素与毫米的转换公式
  8. webgis二次开发
  9. Arensis携手施耐德电气开发智能微电网和ENTRADE IO区块链技术
  10. 高性能API网关Kong介绍