整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

如何实现扫描支付二维码支付成功后进入指定功能页面

如何实现扫描支付二维码支付成功后进入指定功能页面


Dreamweaver中实现扫描二维码支付,支付成功后进入指定功能页面,通常需要以下几个步骤:

  1. 1.
  2. 生成二维码:首先,你需要生成一个包含支付信息的二维码。这通常涉及到后端服务,它会根据支付请求生成一个二维码图片,并将支付信息存储在服务器上。
  3. 2.
  4. 用户扫描二维码:用户使用微信或其他支付应用扫描二维码,完成支付。
  5. 3.
  6. 支付状态回调:支付完成后,支付平台会向你的服务器发送一个支付成功的回调通知。这个通知通常包含支付结果和订单信息。
  7. 4.
  8. 服务器处理回调:你的服务器接收到支付成功的回调后,需要验证回调信息的合法性,并更新订单状态为已支付。
  9. 5.
  10. 页面跳转:一旦订单状态更新为已支付,服务器可以生成一个包含支付成功信息的页面,并通过HTTP重定向或AJAX请求将用户引导到这个页面。

在Dreamweaver中,你可以使用HTML、CSS和JavaScript来创建用户界面,并通过AJAX与服务器进行交互。以下是一个简化的示例流程:

  • HTML页面:创建一个包含二维码的HTML页面,用户可以扫描这个二维码进行支付。


  • 服务器端处理:在服务器端,你需要编写代码来处理支付回调,并在支付成功后更新订单状态,并生成一个支付成功的页面。


  • 页面跳转:在支付成功后,服务器返回的页面中可以包含一个JavaScript代码,用于在支付成功后自动跳转到指定的功能页面。

请注意,这只是一个简化的示例,实际的实现可能会更复杂,需要考虑安全性、用户体验和错误处理等因素。此外,具体的实现细节会根据你使用的支付平台和后端技术栈有所不同。在实际开发中,你可能需要查阅支付平台的开发文档,了解如何生成二维码、处理支付回调以及如何与前端页面进行交互。有需要完整源码的朋友,加关注线下沟通。

附:代码仅供需要的朋友参考(为便于展示显示图片效果)

支付成功后,微信异步回调页面为notify_wxpay.php,在根目录中,可根据情况修改

微信支付功能开发

、介绍

电商购物系统。使用Python作为主要开发语言,前端采用HTML、CSS、BootStrap等技术实现界面,后端采用Django作为开发框架。实现一个电商购物系统。用户可以登录、注册、查看商品、添加购物车、购买商品、查看订单、评论等。管理员可以编辑用户和商品信息。

二、系统展示图片

三、演示视频 and 代码 and 介绍

视频+代码+介绍:电商购物 · 语雀

四、Django介绍

Django 是一个开源的、基于 Python 的 web 框架。它的主要目标是使得 Web 开发更加快速、更简单,同时还要保证代码的可重用性和可维护性。以下是 Django 的一些主要特点:

  1. MTV 架构:Django 遵循 MTV(Model-Template-View)设计模式,这与经典的 MVC(Model-View-Controller)模式有些许不同。在 Django 中,Model 代表数据模型,Template 是负责展示的部分,而 View 负责处理用户请求并返回响应。
  2. DRY 原则:Django 遵循 “Don't Repeat Yourself” (DRY) 原则,鼓励代码的重用。
  3. 自带管理界面:Django 包括一个自动生成的、为内容管理定制的管理界面,只需很少的代码即可完成。
  4. ORM:Django 自带了一个强大的 ORM(对象关系映射)系统,可以轻松地与多种数据库进行交互,同时还支持数据库的迁移。
  5. 安全性:Django 有内置的防护措施,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)和 SQL 注入等。
  6. 中间件支持:Django 的中间件系统允许开发者在处理请求和响应的过程中插入自定义的处理方法。

以下是一个简单的 Django 项目和应用的示例代码:

  1. 创建一个新的 Django 项目:
django-admin startproject myproject
  1. 进入项目目录并创建一个新的 Django 应用:
cd myproject
python manage.py startapp myapp
  1. 定义模型 (在 myapp/models.py 中):
from django.db import models

class Article(models.Model):
    title=models.CharField(max_length=200)
    content=models.TextField()
    pub_date=models.DateTimeField('date published')

    def __str__(self):
        return self.title
  1. 在 myproject/settings.py 中添加 'myapp' 到 INSTALLED_APPS 列表:
INSTALLED_APPS=[
    ...
    'myapp',
    ...
]
  1. 迁移数据库:
python manage.py makemigrations myapp
python manage.py migrate
  1. 创建一个简单的视图 (在 myapp/views.py 中):
from django.http import HttpResponse
from .models import Article

def index(request):
    articles=Article.objects.all()
    output=', '.join([a.title for a in articles])
    return HttpResponse(output)
  1. 配置 URL (在 myapp/urls.py 中):
from django.urls import path
from . import views

urlpatterns=[
    path('', views.index, name='index'),
]
  1. 在 myproject/urls.py 中连接应用的 URLs:
from django.contrib import admin
from django.urls import path, include

urlpatterns=[
    path('admin/', admin.site.urls),
    path('articles/', include('myapp.urls')),
]
  1. 运行开发服务器:
python manage.py runserver

当您访问 127.0.0.1:8000/articles/,您应该会看到数据库中所有文章的标题(如果有的话)。

程背景介绍

每年的春节是中国人的传统节日,大多数中国人都会在这一天选择回家团聚。为了方便用户进行购票,2012 年春节,铁道部推出 12306 网站,进行网络实名购票。然而,历年春节假期,巨大的访问请求都让中国铁路客户服务中心网站(www.12306.cn)陷入“万劫不复”。根据新浪的调查,在 2013 年春节,有近 90%的网友表示 12306 网站缓慢、页面崩溃,严重影响正常购票。

世界级的人口迁徙带来了一个世界级的难题:要如何通过网络,把火车票及时卖给有需要的人

铁道部在线车票发售网站 12306 基本不存在大量图片、视频这些占带宽资源的东西,所面临的主要问题就是数据库的高并发量——用中国的人口基数来算,这是一个极为恐怖的并发量,在车票发售的高峰时间点,向 12306 发起的并发请求数量大得就像一场国家规模的 DDOS 攻击。

12306 网站所面临的问题分析:

中国铁路客户服务中心网站(www.12306.cn)是世界规模最大的实时交易系统之一,媲美 Amazon.com,节假日尤其是春节的访问高峰,网站压力巨大。据统计,在 2012 年初的春运高峰期间,每天有 2000 万人访问该网站,日点击量最高达到 14 亿。

而到了 2013 年春节期间,12306 的网站订票系统系统峰值负载达 2.6 万 QPS(每秒钟 2.6 万次访问请求)或 11 万 TPS(TPS 指每秒服务器处理、传输的事物处理个数,一条消息输入、一条消息输出、一次数据库访问,均可以折算成 TPS),与 2012 淘宝双 11 活动峰值负载基本相当。



所以 12306 所面临的难题本质上也是属于高并发访问问题,类似与一些电商网站所搞的"秒杀"活动一样。通过对 12306 的深度优化,2015 年 12306网站顺利过关,没有“瘫痪”,是值得庆祝的。而我们本次课题主要就是来探究一下如何对 12306 网站做深度优化来抵御高并发访问。

高并发访问

那么 12306 做了什么样的优化,才解决了高并发访问呢?

12306 技术部主任单杏花在接受一次记者采访的时候有说到:我们研发了分布式的内存计算的余票计算技术,让余票计算变得非常高效。与此同时单杏花及其团队还研发了异步交易排队系统,这种系统采用售取分离、读写分离的核心系统架构等多种技术,为 12306 售票系统提供技术支撑。

其实通过她的描述,我们可以得出一些处理高并发访问方式:

  1. 采用内存计算(使用缓存系统)
  2. 异步处理请求(进行流量消峰)
  3. 数据库进行读写分离操作
  4. 常见的分布式缓存系统:MongoDB , Redis,MemCache

流量消峰的方案

要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。在这里,消息队列就像“水库”一样,拦蓄上游的洪水,削减进入下游河道的洪峰流量,从而达到减免洪水灾害的目的。


进行答题

你是否还记得,最早期的秒杀只是纯粹地刷新页面和点击购买按钮,它是后来才增加了答题功能的。那么,为什么要增加答题功能呢?这主要是为了增加购买的复杂度,从而达到两个目的。

第一个目的是防止部分买家使用秒杀器在参加秒杀时作弊。2011 年秒杀非常火的时候,秒杀器也比较猖獗,因而没有达到全民参与和营销的目的,所以系统增加了答题来限制秒杀器。增加答题后,下单的时间基本控制在 2s 后,秒杀器的下单比例也大大下降。答题页面如下图所示。


第二个目的其实就是延缓请求,起到对请求流量进行削峰的作用,从而让系统能够更好地支持瞬时的流量高峰。这个重要的功能就是把峰值的下单请求拉长,从以前的 1s 之内延长到 2s~10s。

这样一来,请求峰值基于时间分片了。这个时间的分片对服务端处理并发非常重要,会大大减轻压力。而且,由于请求具有先后顺序,靠后的请求到来时自然也就没有库存了,因此根本到不了最后的下单步骤,所以真正的并发写就非常有限了。

分时间段进行产品上架处理


其实处理高并发访问还有两种常见手段:静态化、集群

静态化: 分布式缓存是为了解决数据库服务器和 Web 服务器之间的瓶颈,如果一个网站流量很大这个瓶颈将会非常明显,每次数据库查询耗费的时间将不容乐观。对于更新速度不是很快的站点,可以采用静态化来避免过多的数据查询,可使用 Freemaker 或 Velocity 来实现页面静态化。

集群: 使用多台服务器去处理并发请求

系统架构介绍

基于以上几点高并发的处理方案,我们本次所设计的 12306 后端系统架构如下所示。

数据同步架构


系统管理员通过后台管理系统基于一些基础数据(座位数据,列车车次数据,乘车计划数据)生成指定日期的乘车计划数据。然后我们通过 logstash将生成的数据同步到 ES 和 Redis 中。

Logstash 常见的数据获取方式拉,推。上述架构给大家展示的是拉的模式,但是这种方式我们当前这个系统环境中不太适合,原因是因为我们使用了 MyCat 进行分库分表的处理,而 Logstash 在进行拉取数据的时候如果数据量较大我们就需要进行分页拉取,那么此时 Logstash 就会生成类似这样的一条 sql 语句:select count(*) as `count` from ....来查询满足条件总条数,但是这个 count 别名使用了反引号,而这个反引号在 MyCat 中无法使用,因此就会产生异常。

因此本次我们在进行数据同步的时候使用的是 Logstash 的推模式进行数据同步,如下所示:



数据搜索架构

数据同步完毕以后,用户就可以搜索相关的乘车计划数据了。具体的搜索架构如下所示:


用户下单架构

通常订票系统要处理生成订单、减扣库存、用户支付这三个基本的阶段,我们系统要做的事情是要保证火车票订单不超卖、不少卖,每张售卖的车票都必须支付才有效,还要保证系统承受极高的并发。


这种方案也就是单杏花主任所提出的异步交易排队系统。当然 12306 网站的还有一个改造的关键技术建立可伸缩扩展的云应用平台

根据互联网上的新闻,中国铁道科学研究院电子计算技术研究所副所长,12306 网站技术负责人朱建生说,为了应对 2015 年春运售票高峰,该网站采取 5 项措施:

  1. 利用外部云计算资源分担系统查询业务,可根据高峰期业务量的增长按需及时扩充。
  2. 对系统的互联网接入带宽进行扩容,并可根据流量情况快速调整,保证高峰时段旅客顺畅访问网站。
  3. 防范恶意抢票,通过技术手段屏蔽抢票软件产生的恶意流量,保证网站健康运行,维护互联网售票秩序。
  4. 制定了多套应急预案,以应对突发情况。

用户下单

下单流程



下单页面

注意:下单之前需要初始化一些用户数据到 Redis 中(train_manager:userInfo),默认用户已经登录下单页面:12306\otn\confirmPassenger\initDc.html

订单服务实现

下单接口定义

实体类创建


订单工程环境搭建

  1. 导入下单工程(itheima-train-manager-order)
  2. 在 nacos 配置中心中添加配置项(itheima-train-manager-order-dev.yml)


下单接口定义



Nginx 配置

反向代理配置

# 下单服务的代理转发地址

upstream train-manager-order {

server 127.0.0.1:9056 ;

}

# 配置下单工程的反向代理

server {

listen 80;

server_name www.trainmanager.order.com;

access_log logs/host.access.order.log main ; # nginx 访问日志

location / {

proxy_pass http://train-manager-order ;

}

error_page 500 502 503 504 /50x.html;

location=/50x.html {

root html;

}

}

在 hosts 文件中配置 www.trainmanager.order.com 域名映射

Nginx 限流配置

为了防止一些抢票助手所发起的一些无用请求,我们可以使用 nginx 中的限流策略进行限流操作。

常见的限流算法:计数器、漏桶算法、令牌桶算法

计数器限流算法

计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于 A 接口来说,我们 1 分钟的访问次数不能超过 100 个。那么我们可以设置一个计数器 counter,其有效时间为 1 分钟(即每分钟计数器会被重置为 0),每当一个请求过来的时候,counter 就加 1,如果 counter的值大于 100,就说明请求数过多;如下图所示:


这个算法虽然简单,但是有一个十分致命的问题,那就是临界问题。

如下图所示,在 1:00 前一刻到达 100 个请求,1:00 计数器被重置,1:00 后一刻又到达 100 个请求,显然计数器不会超过 100,所有请求都不会被拦截;然而这一时间段内请求数已经达到 200,远超 100。



漏桶算法

漏桶算法其实很简单,可以粗略的认为就是注水漏水过程,往桶中以一定速率流出水,以任意速率流入水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。如下图所示:


令牌桶算法

令牌桶是一个存放固定容量令牌的桶,按照固定速率 r 往桶里添加令牌;桶中最多存放 b 个令牌,当桶满时,新添加的令牌被丢弃;当一个请求达到时,会尝试从桶中获取令牌;如果有,则继续处理请求;如果没有则排队等待或者直接丢弃;可以发现,漏桶算法的流出速率恒定,而令牌桶算法的流出速率却有可能大于 r;



从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。

Nginx 的限流策略

Nginx 的限流主要是两种方式:限制访问频率限制并发连接数

Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

Nginx 官方版本限制 IP 的连接和并发分别有两个模块:

  • limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法 "leaky bucket"。
  • limit_conn_zone:用来限制同一时间连接数,即并发限制。

limit_req_zone


limit_conn_zone

使用语法:limit_conn_zone key zone

  • key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。
  • zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的访问信息,10M 可以存储 16W IP 地址访问信息。


生成订单

预扣库存




分配座位

具体的实现步骤如下所示:

  1. 获取所有的指定座位类型的所有车厢的 key(集合)
  2. 遍历集合获取每一个车厢数据(集合)
  3. 遍历集合获取每一个座位所对应的状态值
  4. 状态值如果是 0,记录座位标号
  5. 更改座位状态值

具体的代码实现如下所示:





生成订单

为了提高数据响应速度,我们在构建订单数据的时候可以使用一个线程来完成。并且在该线程执行完毕以后,要获取执行结果,因此这个任务类我们需要使用 Callable,执行这个任务的线程我们可以使用线程池来完成。具体的实现步骤如下所示:

  1. 创建雪花算法对应的类对象
  2. 创建线程池对象
  3. 获取指定日期的乘车计划数据,并将其封装到一个 TbRidingPlanDate 对象中
  4. 生成订单

具体的代码实现如下所示:







Redis 排队

采用 Redis 中的 ZSet 集合存储排队信息,使用:列车编号 + 乘车日期 + 用户 id 作为 key,使用当前系统时间的纳秒值作为 value


同步 ES 库存

发送同步数据

那么我们首先来完成一下生产者的代码,具体的步骤如下所示:

  1. 定义要同步的数据的 JavaBean



  1. 添加消息队列的相关配置

nacos 配置中心添加 rabbitmq 的配置信息


RabbitmqConfiguration 配置类添加如下配置


  1. 定义发送数据的 service(直接复制 itheima-train-manager 工程中的 RabbitmqProducer)
  2. 更改 OrderService 构建 OrderSynEs 对象,发送同步数据


接收同步数据

接下来我们就需要在 itheima-train-manager-es 同步数据工程中来接收同步数据,更新 ES 的库存信息。具体的实现步骤如下所示:

  1. 在 RabbitmqConfiguration 配置类添加如下配置:



  1. 在 EsConsumer 类中添加监听同步库存队列的方法,方法代码逻辑如下所示


ESIndexService 类添加如下方法:

发送订单数据

实现思路

按照我们最初的想法,我们只需要将订单 Order 对象发送到 Mq 中,然后订单处理服务从队列中监听到 Order 数据生成订单即可。但是我们后续还有另外一个操作,就是在下单成功以后,我们需要将下单状态通过 websocket 推送给用户,因此我们需要在订单处理服务中不单单需要获取到订单数据,还需要获取到用户的数据。因此在发送下单数据的时候单单发送订单的数据时不够的。我们需要创建一个实体类,用来封装订单以及该订单所对应的用户数据(OrderHandler)。

代码实现

具体的实现步骤如下所示:

  1. 创建实体类(OrderHandler)(用于封装发送给 MQ 的订单数据)



  1. RabbitmqConfiguration 配置类添加如下配置



  1. 更改 OrderService 发送订单数据


查询排队接口

当用户下单完毕以后,就会跳转到下单成功页面。那么在下单成功页面就需要调用查询排队接口,去查询排队信息。

接口定义

业务逻辑实现


订单数据库架构

订单数据特点:写并发量大于读并发量

如何提高我们写数据的能力,给用户良好的用户体验,就是我们需要研究的目标!

设计方向:

  1. 多个节点进行数据写入
  2. 进行读写分离操作,提高单节点写数据的并发能力
  3. 要保证每一个写入节点的高可用,当主节点出现问题以后,从节点立马升级为主节点

基于以上几点的设计思路,我们所设计出来的订单数据库的架构如下所示:


MySql 主从复制

主从复制简介

就是有两个数据库服务器,一个是主(master)数据库服务器,另一个是从(slave)数据库服务器。当主(master)数据库有数据写入,包括插入、删除、修改,都会在从(slave)数据库上操作一次。这样的操作下,主从(slave)数据库的数据都是一样的,就相当于时刻在做数据备份,就算主(master)数据库的数据全部丢失了,还有从(slave)数据库的数据,我们就可以把从(slave)数据库的数据导出来进行数据恢复

主从复制原理

主从复制原理主要有三个线程不断在工作:

1、主(master)数据库启动 bin 二进制日志,这样会有一个 Dump 线程,这个线程是把主(master)数据库的写入操作都会记录到这个 bin 的二进制文件中。

2、然后从(slave)数据库会启动一个 I/O 线程,这个线程主要是把主(master)数据库的 bin 二进制文件读取到本地,并写入到中继日志(Relay log)文件中。

3、最后从(slave)数据库其他 SQL 线程,把中继日志(Relay log)文件中的事件再执行一遍,更新从(slave)数据库的数据,保持主从数据一致。


一主一从介绍

一主一从部署

在 Mycat 中,读写分离可以说有两种:一种是一主一从,另一种是多主多从。接下来我们就来首先给大家介绍一下一主一从的部署。分为两步进行实现:

  1. 一主一从的数据库配置实现
  2. MyCat 一主一从实现读写分离配置

一主一从的 MySql 部署步骤如下所示:

  1. 在指定的目录下创建对应的文件夹(做 mysql 容器的目录映射)


  1. 将 docker 中的 mysql 配置文件分别复制到 mysql10/config 和 mysql11/config 目录中
  2. 对两个节点的配置文件(/usr/local/mysql-master-slave/mysql10/config/mysql.conf.d)做如下配置: