跑腿业务和支付业务的具体实现流程

校园云项目

跑腿业务的具体业务分析

该流程适用于很多接单相关的业务场景,或多或少都可以从中得到启发;

整个流程描述:

  1. 任务发布:
    • 用户在平台上发布任务,描述需要完成的任务内容,包括取件地址、送达地址、物品类型等信息。
  2. 任务接收:
    • 平台将任务分配到前端合适的人员,当有配送员接收任务后准备执行。
  3. 任务执行:
    • 配送员按照任务要求前往取件地址,取得物品后运送到指定的送达地址。
  4. 任务完成:
    • 配送员顺利将物品送达目的地,并进行拍照取证,用户确认收到物品后,任务状态更新为已完成。
  5. 异常处理:
    • 如果在任务执行过程中出现问题,用户可以发起工单请求平台处理,平台会协助解决问题并保障用户权益。
  6. 任务下架:
    • 如果在一定时间内无人接受任务,或者用户不再需要该任务,用户可以选择取消任务。

对整个业务过程分析:

可以抽离出6个任务状态:

  • 发布(初始状态),

  • 已接收

  • 已提交待确认(接收任务者上传凭证后,发起任务者未确认前),

  • 已完成(发起任务者点击确认完成任务),

  • 异常(发起任务者发起工单),

  • 已下架(设定时间内无人接收或者上传任务者点击下架);

​ 就足够包含整个业务流程;

对每个状态中牵扯到的变化再进行具体的分析处理

  • 当派单用户发起任务后,用户的余额=原余额-任务金额(优先减兑换码的余额),若剩余金额不足返回提示错误,若足够返回发布成功; 最好全部用事务进行包裹

  • 若任务下架时(从已发布变成已下架)(可能因为时间到设定时间或者发起人主动取消,只有发布和已接受状态能下架,其他状态不能主动下架),余额=原余额+任务余额

  • 若任务异常了(从已接收变成任务异常),钱仍在订单中(钱自动放入接单人的已冻结金额中),后台判谁得到,谁的可提现金额=原可提现金额+任务金额,同时接单人已冻结金额=原已冻结金额-任务金额;

  • 若任务异常(从已提交待确认变成任务异常),钱会变成已冻结金额(接单人待提现金额=原待提现金额-任务金额&&接单人已冻结金额=原已冻结金额+任务金额),当工单被解决时,(两种情况,若后台判发起人胜,这笔钱会从接收人的已冻结移动到发起人的可提现金额,当后台判接单人胜,这笔钱会直接从接单人的已冻结转到可提现),异常解决时该任务会直接从异常转变为已完成;

​ 若变成已完成状态,需要进行流水表的记录

  • 当任务表状态变成已提交待确认后,用户待转入金额=原待转入金额+任务金额;等待到凌晨4点后,接单用户的待转入金额=原金额-任务金额&&接单用户的可提现余额=原余额+任务金额,更改任务状态为已完成;同时进行流水表的记录;

  • 当发起人直接点击确认完成后,用户待转入金额=原金额+任务金额;等待时间12h后,待转入金额=原金额-任务金额&&接单用户的可提现余额=原余额+任务金额(不受理任务异常); -------(或,可以直接改成不等待:接单用户的可提现余额=原余额+任务金额) ,进行流水表的更新。

    如果你以为这就结束了,那就太天真了,一个完整的业务逻辑,应该将所有能预料到的情况都包含在内,例如,这些方法中若一些方法的sql语句执行成功,一些失败,应该怎么处理?当多个用户同时接单,同时对数据库中状态进行修改时,应该怎么处理等。

上边这些状态最好全部用事务进行包裹,防止一些未预料到的情况或错误发生时,可以进行回滚操作;

上边这些状态或多或少都会出现高并发的情况,需要进行上锁,异步等的处理操作;

优化:

充值业务场景分析:

以微信充值为例,实际支付宝支付的整个流程差别不大;

前置条件:需要获取支付所需的前置条件:参数申请 - 通用规则 | 微信支付商户文档中心 (qq.com),配置API key - 通用规则 | 微信支付商户文档中心 (qq.com),下载并配置商户证书 - 通用规则 | 微信支付商户文档中心 (qq.com)待都配置完成后进入第一步开发

充值都可以分成两大步来进行分析,更容易理解:

第一步(提交充值请求):具体来说就是,用户在前端点击下单后,先生成本地订单存储在服务器中(记录一些重要信息),然后再生成符合微信格式的订单并发送给微信官方(同时需要对本次请求头使用前置条件中的内容生成签名信息操作:具体生成过程的代码:如何生成请求签名 - 通用规则 | 微信支付商户文档中心 (qq.com),也可以直接调用官方方法,以go为例使用 Go SDK 快速开始 - SDK&开发工具 | 微信支付服务商文档中心 (qq.com)),包含了加密的过程,最终微信服务器给我们返回一个二维码。(整个过程也是需要使用进行事务处理的,防止本地有订单远程未发送,或者远程生成了订单,但本地不存在的情况)。image-20240423152130347让我们进行官方代码刨析:简述:首先定义必要参数,建立客户端,调用客户端中native的支付方法,返回支付二维码。

【详细解释】:

cilent这个客户端方法,可能很多人并不清楚到底是什么东西,他在这些接口业务中到底是什么作用(包括支付,钉钉🤖通信,微服务架构等等都会出现这个知识),接下来就先科普一下什么是Client,通俗来说:

初始化一个客户端其实就是创建一个包含了多个方法的包,并传入一些必要的参数来配置这个客户端的过程。之后,可以直接调用这个方法体中的方法来访问客户端中封装好的方法,执行相应的操作。在微信支付的情境中,这个客户端包含了发送预支付请求、查询订单状态、退款等方法,通过初始化客户端并调用这些方法,可以方便地进行微信支付相关的操作。

第二步(处理充值请求):wechatpay-apiv3/wechatpay-go: 微信支付 APIv3 的官方 Go Library (github.com)

这是微信官方的sdk仓库,在readme中包含了回调验签的代码示例,

整个过程包含两个步骤:

回调通知的验签与解密

  1. 使用微信支付平台证书(验签)和商户 APIv3 密钥(解密)初始化 notify.Handler
  2. 调用 handler.ParseNotifyRequest 验签,并解密报文。

具体实现:

初始化
  • 方法一(大多数场景):先手动注册下载器,再获取微信平台证书访问器。

适用场景: 仅需要对回调通知验证签名并解密的场景。例如,基础支付的回调通知。

代码:

ctx := context.Background()
// 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器
err := downloader.MgrInstance().RegisterDownloaderWithPrivateKey(ctx, mchPrivateKey, mchCertificateSerialNumber, mchID, mchAPIV3Key)
// 2. 获取商户号对应的微信支付平台证书访问器
certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID)
// 3. 使用证书访问器初始化 `notify.Handler`
handler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))

验签:

transaction := new(payments.Transaction)
notifyReq, err := handler.ParseNotifyRequest(context.Background(), request, transaction)
// 如果验签未通过,或者解密失败
if err != nil {fmt.Println(err)return
}
// 处理通知内容
fmt.Println(notifyReq.Summary)
fmt.Println(transaction.TransactionId)

写到一起就可以做到回调验签解密了;

具体跑腿项目的代码仓库:

CampusCloudAid: 用于开发校园云互助 (gitee.com)

可直接运行包含了上边的所有逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981633.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于文件流操作文件系统

stream 文件流ScannerWriter遍历目录删除指定文件把目标文件复制为源文件小结 文件流 文件的内容本质上都是来自于硬盘,而硬盘由操作系统管理. 使用java来操作文件,就要用到java的api.这里涉及一系列的类: 字节流: InputStream和OutputStream是以操作字节为单位(二进制文件). …

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制,读写锁,和锁的粒度 并发控制的概述 在数据库系统中,并发控制是一种用于确保当多个用户同时访问数据库时,系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术,其中包括锁机制、多…

pytorch-解决过拟合之regularization

目录 1.解决过拟合的方法2. regularization2. regularization分类3. pytorch L2 regularization4. 自实现L1 regularization5. 完整代码 1.解决过拟合的方法 更多的数据降低模型复杂度 regularizationDropout数据处理早停止 2. regularization 以二分类的cross entropy为例&…

YesPMP众包平台最新项目

YesPMP一站式互联网众包平台,最新外包项目,有感兴趣的用户可进入平台参与竞标。 (竞标后由项目方直接与服务商联系,双方直接对接) 1.查看项目:个人技术-YesPMP平台 2.查看项目&#xff1…

运维 kubernetes(k8s)基础学习

一、容器相关 1、发展历程:主机–虚拟机–容器 主机类似别墅的概念,一个地基上盖的房子只属于一个人家,很多房子会空出来,资源比较空闲浪费。 虚拟机类似楼房,一个地基上盖的楼房住着很多人家,相对主机模式…

大数据学习第四天

文章目录 yaml 三大组件的方式交互流程hive 使用安装mysql(hadoop03主机)出现错误解决方式临时密码 卸载mysql (hadoop02主机)卸载mysql(hadoop01主机执行)安装hive上传文件解压解决版本差异修改hive-env.sh修改 hive-site.xml上传驱动包初始化元数据在hdfs 创建hive 存储目录启…

人工智能基础-Python之Pandas库教程

文章目录 前言一、Pandas是什么?二、使用步骤1.引入库2.数据读取2.1 数据类型2.2 数据读取1.常见操作2.txt读取 3.pandas的数据结构3.1 Series1.属性2.创建Series3.查询 3.2 DataFrame1.创建DataFrame 4.查询数据4.1 data.loc 根据行列标签值进行查询1.使用单个labe…

javaWeb项目-社区医院管理服务系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Java技术 Java语…

机器学习中常见的数据分析,处理方式(以泰坦尼克号为例)

数据分析 读取数据查看数据各个参数信息查看有无空值如何填充空值一些特殊字段如何处理读取数据查看数据中的参数信息实操具体问题具体分析年龄问题 重新划分数据集如何删除含有空白值的行根据条件删除一些行查看特征和标签的相关性 读取数据 查看数据各个参数信息 查看有无空…

【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423

【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423 感谢拉钩教育的教学。 (五)我们介绍了四种路由导航,这一节我们介绍他们的嵌套传参和框架的整体原理。到这里,大家已经能用RN框架进行一些…

电商价格监测的价值是什么

品牌做电商价格监测的原因多是为了渠道管控,即控价,管控价格前需要对渠道中的价格数据进行监测,通过监测价格,对渠道中低价数据进行全面的了解,如有授权低价率,非授权低价率,非授权低价店铺的总…

python与上位机开发day02

1.常见运算符 1.1 赋值运算符 赋值运算符主要用来对变量进行赋值,包括如下这些: 运算符描述赋值加等于-减等于*乘等于/除等于//整除等于%模等于**幂等于 实例如下: a 10 a 5 # 等价于 a a5 a *2 # 等价于 a a*21.2 比较运算符 比较运算符主要用来比较两个数据的大小…

Windows 搭建自己的大模型-通义千问

1、安装 pytorch https://pytorch.org/get-started/locally/ 点击进入官网,如图选择自己的环境得到pip安装依赖的命令: pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu 2、拉取代码并安…

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行,并确保覆盖以下关键方面: 当回答问题时,可以根据自己的经验和知识,从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性,并强调测试的重要性以及如何与开发团…

AIGC-stable-diffusion(文本生成图片)+PaddleHub/HuggingFace

功能 stable-diffusion(文本生成图片)PaddleHub,HuggingFace两种调用方式 PaddleHub 环境 pip install paddlepaddle-gpu pip install paddlehub 代码 from PIL import Image import paddlehub as hub module hub.Module(namestable_diffusion)## 保存在demo…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口,它表示一个类能够感知到(aware of)Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

jackson.dataformat.xml 反序列化 对象中包含泛型

重点: JacksonXmlProperty localName 指定本地名称 JacksonXmlRootElement localName 指定root的根路径的名称,默认值为类名 JsonIgnoreProperties(ignoreUnknown true) 这个注解写在类上,用来忽略在xml中有的属性但是在类中没有的情况 Jack…

索引的最左匹配原则

索引的最左匹配原则 我们先创建一张测试表,表的两个字段用来创建联合索引 CREATE TABLE test(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,col1 INT,col2 INT,col3 INT );CREATE INDEX idx_c1c2 ON test(col1, col2);现在我们就可以分析查询sql脚本了 1.使用联合索…

CentOS 7.9.2007 中Docker使用GPU

一、安装nvidia驱动 1.1,查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2,进入 PCI devices ,输入上一步查询到的 2204 1.3,进入 官方驱动 | NVIDIA,查询 Geforce RTX 3090 驱动并下载 1.4,禁用…

《XR806开发板试用》硬件IIC驱动MPU6050

1.环境配置 总结一下遇到的问题: 1.需要修改配置文件中的文件路径 2.固件编译出现以下问题时,需要修改文件内容 2.工程目录结构 device/xradio/xr806/ohosdemo/car_demo └── src #源文件 └── main.c #主函数 └── mpu6050.c #驱动代码 └…