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

校园云项目

跑腿业务的具体业务分析

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

整个流程描述:

  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://www.mfbz.cn/a/569486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

typedef 定义函数指针

typdef int(*FUNC_TYPE)(int,int) FUNC_TYPE p NULL; 定义了一个函数指针 函数指针作为函数的参数的用法demon

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用,主要包含以下功能: 播放应用中的音频资源文件,并可进行上一曲、下一曲、播放、暂停、切换播放模式(顺序播放、单曲循环、随机播放)等操作。结合后台任务管理模块&…

python实现钉钉通讯录导出Excel表

Python工具开源专栏 Py0004 python实现钉钉通讯录导出Excel表 Python工具开源专栏前言目录结构部分演示完整代码已在GitHub上开源 前言 需求来源于公司,需要将钉钉通讯录以Excel表的形式导出到本地,方便定期备份。导出的Excel需要处理钉钉用户兼任多部门…

AppleWatch是真的能够减少我iPhone的使用时长

我应该是比较专情的果粉了,我有一台MacBook Pro、iPad Pro、airpods pro 2和iPhone 15 Pro Max。但我还从来没有用过苹果手表。 然后,我就去买了AppleWatchSeries9蜂窝款,并试用了一周,我想知道它是否能帮助我减少使用iPhone的时间…

Sectigo证书申请流程及价格介绍

Sectigo 是一家全球知名的数字证书颁发机构(Certificate Authority, CA),自1998年起就开始提供 SSL 证书服务,是全球最早的 CA 机构之一。 一 Sectigo证书申请流程 1 确定证书类型 根据自身的需求确定证书的类型,一…

源码篇--Nacos服务--中章(5):Nacos客户端启动-实例注册-grpc连接建立

文章目录 前言一、 前奏:二、客户端连接的建立:2.1 NacosNamingService 创建:2.2 NacosNamingService 初始化:2.3 NamingClientProxyDelegate 长连接建立:2.3.1 grpc 代理对象创建:2.3.2 NamingGrpcClientP…

Meta Llama 3本地部署

感谢阅读 环境安装收尾 环境安装 项目文件 下载完后在根目录进入命令终端(windows下cmd、linux下终端、conda的话activate) 运行 pip install -e .不要控制台,因为还要下载模型。这里挂着是节省时间 模型申请链接 复制如图所示的链接 然后…

每周一算法:多起点最短路

题目描述 有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。 现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。 已知城市中共包含 n n n个车站(编号 …

Adobe Firefly Image 3:创新步伐与挑战并存的AI图像生成技术升级

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

编写你的第一个java 程序

1.安装 jdk 网址: Java Downloads | Oracle 一般我们安装jdk 17 就行了 自己练习 自己学习 真正的开发中我们使用jdk 8 这个是最适合开发java 应用程序的 当然你也可以选择你的 系统 来安装这个java 在文件资源管理器打开JDK的安装目录的bin目录,会发…

VSCode通过跳板机免密连接远程服务器的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Android Monkey工具介绍与使用

过于爽快的承认失败,就可能发觉不了曾经与正确非常接近。大家好,依旧是在翻看旧文档的时候,发现一篇关于Monkey的介绍和使用,Monkey这款工具在软件测试中主要用于进行压力测试和稳定性测试。它可以模拟大量随机的用户操作&#xf…

618买什么最划算?618买什么东西便宜?必备数码好物清单分享

​只不,马上又到了618购物节咯,数码产品的优惠力度尤为显著,是购买数码产品的绝佳时机。接下来,我将为大家分享几款性价比超高的数码产品,相信总有一款能吸引你的目光。 一、南卡OE MIX开放式蓝牙耳机 在618购物狂欢节…

javaScript中的闭包

什么是闭包 在理解 JavaScript 中的闭包前先了解以下两个知识点: JavaScript 中的作用域和作用域链JavaScript 中的垃圾回收 简单回顾一下这两个知识点: 1. JavaScript 中的作用域和作用域链 作用域就是一个独立的地盘,让变量不会外泄、…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

逆数对(树状数组的方法)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 4 5 1 3 2 输出 7 思路&#xff1a; 根据题意&#xff0c;求逆序对总数。 逆序对含义&#xff1a;如果数组中的两个不同位置&#xff0c;前面的数字比后面的数字严格大&…

投票刷礼物链接怎么弄?最新投票活动创建系统源码 轻松创建活动

投票刷礼物链接怎么弄&#xff1f;投票活动创建系统的作用和功能多种多样&#xff0c;为用户提供一个便捷、高效且功能强大的平台&#xff0c;用于创建、管理和执行各种投票活动。分享一个最新投票活动创建系统源码&#xff0c;源码开源可二开&#xff0c;含完整代码包和详细搭…

SCA-CNN-LSTM多输入回归预测|正余弦优化算法-卷积-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

[笔试训练](五)

013 游游的you__牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 组成一个you需要一个o且能得2分&#xff0c;而组成相邻字母oo需要两个o&#xff0c;只能得1分。优先考虑组成尽可能多的you&#xff0c;再考虑剩下的o&#xff0c;放一起。 #include <iostream…