微信小程序支付时序图

一、微信支付生成预付单的作用
在微信支付时序图中,第5步(商户系统生成预支付订单) 和第6步(微信支付系统返回预支付会话标识) 是连接商户系统与微信支付系统的核心交互,负责完成支付前的订单信息确认与会话建立,具体流程如下:
第5步:商户系统向微信支付系统发起“预支付订单”请求
当用户在商家小程序中确认订单并点击“支付”后(第4步),商家的后端系统(商户系统)需要先向微信支付系统发起一个“创建预支付订单”的请求。这一步的核心目的是:让微信支付系统“知晓并记录”这笔订单的关键信息,为后续用户实际支付做准备。
二、微信支付中两次签名的作用
你的理解非常准确!在微信支付流程中,商户系统确实会进行两次核心签名,分别对应不同的交互场景,目的都是确保支付信息的安全性和完整性。具体区别如下:
第一次签名:创建预支付订单(对应第5步)
- 场景:商户系统向微信支付系统发起“统一下单”请求时。
- 签名参数:
包括商户号(mch_id)、appid、商户订单号(out_trade_no)、支付金额(total_fee)、notify_url、trade_type、用户openid等所有业务参数,最后拼接商户API密钥。 - 加密算法:按微信支付规定(通常是HMAC-SHA256或MD5,取决于接口版本)。
- 作用:
证明“创建预支付订单的请求”来自合法商户,且参数未被篡改,微信支付系统会验证该签名,通过后才会生成prepay_id。
第二次签名:生成小程序支付参数(对应第7步)
- 场景:商户系统拿到微信返回的
prepay_id后,生成给小程序的支付信息时。 - 签名参数:
包括appid、timeStamp(当前时间戳)、nonceStr(随机字符串)、package(固定格式为prepay_id=xxx,即第6步返回的预支付标识)、signType(签名算法类型),最后拼接商户API密钥。 - 加密算法:与第一次签名一致(需和
signType对应)。 - 作用:
小程序调用wx.requestPayment时会携带这些参数,微信支付系统会再次验证签名,确保“用户发起的支付请求”对应的是之前创建的预支付订单(通过prepay_id关联),且参数未被篡改。
为什么需要两次签名?
两次签名分别对应两个不同的交互环节,保护不同阶段的信息安全:
- 第一次签名保护“商户→微信支付”的订单创建请求,防止恶意商户伪造订单。
- 第二次签名保护“小程序→微信支付”的用户支付请求,防止支付参数在商户系统到小程序的传输中被篡改(比如修改
prepay_id指向其他订单)。
两次签名都依赖商户的API密钥(仅商户和微信支付系统知晓),确保了整个支付流程的端到端安全。
具体操作:
- 整理订单核心参数
商户系统会按微信支付接口要求,整理以下关键信息:
-
- 商户号(
mch_id):商户在微信支付平台的唯一标识 - 应用ID(
appid):对应小程序的微信开放平台ID - 商户订单号(
out_trade_no):商户系统自己生成的唯一订单号(如2025092412345678) - 支付金额(
total_fee):订单金额(单位为分,如100元需传10000) - 终端IP(
spbill_create_ip):发起支付的用户终端IP - 通知地址(
notify_url):支付结果异步通知商户的回调地址(微信支付会在支付完成后向该地址推送结果) - 交易类型(
trade_type):小程序支付固定为JSAPI - 用户标识(
openid):当前支付用户的微信唯一标识(通过小程序登录获取) - 签名(
sign):商户系统用API密钥对以上参数加密生成的签名(验证请求合法性)
- 商户号(
- 调用微信支付接口
商户系统通过HTTPS协议,向微信支付的“统一下单接口”(https://api.mch.weixin.qq.com/pay/unifiedorder)发送上述参数,请求创建预支付订单。
第6步:微信支付系统返回“预支付会话标识(prepay_id)”
微信支付系统接收到商户的预支付订单请求后,会进行一系列校验,确认无误后生成一个预支付会话标识(prepay_id),并返回给商户系统。
具体过程:
- 微信支付系统的校验
-
- 验证签名:检查商户发送的签名是否正确(防止请求被篡改或伪造)
- 验证参数合法性:检查商户号、appid是否已开通支付权限,订单号是否重复,金额是否符合规则等
- 风控检查:对订单进行风险评估(如是否为异常交易、用户是否有支付限制等)
- 生成并返回prepay_id
若所有校验通过,微信支付系统会在内部创建一条预支付订单记录,并生成一个唯一的prepay_id(格式如wx2421b5582005320f7d4f00162250620),作为这笔订单在微信支付系统中的“临时会话ID”。
同时,微信支付系统会将prepay_id及其他辅助信息(如返回状态码return_code、业务结果result_code等)通过XML或JSON格式返回给商户系统。
这两步的核心意义
- 第5步是商户系统向微信支付“报备”订单信息的过程,确保微信支付系统认可这笔订单的合法性。
- 第6步的
prepay_id是后续用户实际支付的“钥匙”——没有这个标识,微信支付系统不会认可后续的支付请求。
简单说,这两步完成了“商户与微信支付之间的订单信息同步”,为用户最终的支付操作(如输入密码、确认支付)铺平了道路。
接下来,商户系统会用这个prepay_id生成带签名的支付信息(第7步),再返回给小程序调起支付界面。
三、微信支付中商家签名的作用
在该微信支付时序图中,第7步“生成带签名支付信息” 是保障支付请求合法性与安全性的关键环节,下面从技术逻辑和作用两方面详细解释:
一、技术逻辑:签名的生成与作用
微信支付要求商户发起的支付请求必须经过签名验证,目的是防止支付请求在传输过程中被恶意篡改(比如修改支付金额、订单号等关键信息),同时证明该请求确实来自合法的商户(而非伪造)。
生成带签名支付信息的具体过程大致如下:
- 收集支付关键参数:商户系统后台会整理与当前支付相关的核心参数,通常包括:
-
- 商户号(
mch_id):商户在微信支付平台的唯一标识。 - 应用ID(
appid):对应发起支付的小程序/应用的ID。 - 订单号(
out_trade_no):商户系统内的订单编号。 - 支付金额(
total_fee):订单的支付总金额(单位通常为分)。 - 随机字符串(
nonce_str):用于增加签名的随机性,防止重复攻击。 - 支付回调地址(
notify_url):支付结果异步通知商户的地址。 - 交易类型(
trade_type):如小程序支付对应JSAPI。
- 商户号(
- 按规则拼接参数:按照微信支付规定的参数排序和拼接规则(通常是按参数名ASCII码从小到大排序后拼接),将上述参数组合成字符串。
- 加入密钥并加密:在拼接好的参数字符串后,加入商户的API密钥(在微信支付商户平台配置),然后通过指定的哈希算法(如
HMAC-SHA256或MD5,不同版本支付接口要求不同)进行加密,生成签名(sign)。 - 封装成支付信息:将原始参数与生成的签名一起,封装成完整的“带签名支付信息”。
二、作用:保障支付安全与流程合法性
- 防篡改:因为签名是基于支付参数和商户专属密钥生成的,若支付请求在传输中被篡改(比如把支付金额从100元改成1元),微信支付系统在接收到请求后,会用同样的参数和商户密钥重新生成签名,与请求中携带的签名对比,若不一致则会拒绝该支付请求,避免商户资金损失。
- 身份验证:只有知晓商户API密钥的合法商户系统,才能生成正确的签名。这就确保了发起支付请求的是商户自身,而非第三方伪造的请求,防止“假支付”等欺诈行为。
- 为后续支付请求铺路:生成的“带签名支付信息”会被传递给商家小程序(第8步),小程序再带着这些信息调用微信支付接口(第9步
wx.requestPayment)时,微信支付系统会验证签名的合法性,只有签名合法,支付流程才能继续进行。
总结来说,第7步是支付安全的核心保障环节,通过签名机制,在技术上确保了支付请求的“真实性”和“完整性”,为后续用户顺利、安全地完成支付提供基础。
四、微信支付系统验证支付安全的关键步骤
在该微信支付时序图中,第10步到第12步 是用户侧与微信支付系统交互、完成支付授权的关键流程,下面分步详细解释:
第10步:请求调起支付
商家小程序在接收到商户系统后台返回的“带签名支付信息”(第8步)后,会调用微信提供的小程序支付接口 wx.requestPayment(这是微信小程序内置的支付能力API),向微信支付系统发起支付请求。
此时,小程序会把包含签名的支付参数(如订单号、支付金额、商户信息、签名等)传递给微信支付系统,请求微信支付系统弹出支付授权界面。
第11步:验证支付授权权限
微信支付系统接收到小程序的支付请求后,会进行一系列权限验证,确保该支付请求是“合法且可执行”的:
- 验证签名合法性:检查支付请求中携带的签名是否合法(即是否与商户系统后台生成签名的逻辑一致,防止请求被篡改)。
- 验证商户与订单状态:确认商户号、应用ID是否有效,订单是否处于可支付状态(比如订单未被支付、未被取消等)。
- 验证用户身份与支付资格:初步校验当前小程序用户是否有支付权限(比如是否登录、是否被风控限制支付等)。
只有当这些验证都通过后,微信支付系统才会允许调起用户侧的支付授权界面。
第12步:返回支付授权
微信支付系统完成权限验证后,会向商家小程序返回“支付授权界面的唤起指令”。
此时,用户的小程序界面会弹出微信支付的授权窗口(通常包含支付金额、订单简要信息,并提供“确认支付”“取消”等操作按钮),等待用户进行下一步的支付确认(如输入支付密码、刷脸等,具体取决于用户的支付设置)。
流程核心意义
这三步是用户从“发起支付”到“可主动确认支付”的过渡环节:
- 第10步是“商户侧触发支付”的动作;
- 第11步是“微信侧保障支付安全”的校验;
- 第12步是“把支付控制权交还给用户”的关键节点(让用户能看到支付信息,并自主选择是否完成支付)。
后续用户“确认支付、输入密码”(第13步)的动作,就基于这一步弹出的授权界面来完成。
1125

被折叠的 条评论
为什么被折叠?



