微信小程序支付的一些细节

微信小程序支付时序图

一、微信支付生成预付单的作用

在微信支付时序图中,第5步(商户系统生成预支付订单)第6步(微信支付系统返回预支付会话标识) 是连接商户系统与微信支付系统的核心交互,负责完成支付前的订单信息确认与会话建立,具体流程如下:

第5步:商户系统向微信支付系统发起“预支付订单”请求

当用户在商家小程序中确认订单并点击“支付”后(第4步),商家的后端系统(商户系统)需要先向微信支付系统发起一个“创建预支付订单”的请求。这一步的核心目的是:让微信支付系统“知晓并记录”这笔订单的关键信息,为后续用户实际支付做准备。

二、微信支付中两次签名的作用

你的理解非常准确!在微信支付流程中,商户系统确实会进行两次核心签名,分别对应不同的交互场景,目的都是确保支付信息的安全性和完整性。具体区别如下:

第一次签名:创建预支付订单(对应第5步)
  • 场景:商户系统向微信支付系统发起“统一下单”请求时。
  • 签名参数
    包括商户号(mch_id)、appid、商户订单号(out_trade_no)、支付金额(total_fee)、notify_urltrade_type、用户openid所有业务参数,最后拼接商户API密钥。
  • 加密算法:按微信支付规定(通常是HMAC-SHA256或MD5,取决于接口版本)。
  • 作用
    证明“创建预支付订单的请求”来自合法商户,且参数未被篡改,微信支付系统会验证该签名,通过后才会生成prepay_id

第二次签名:生成小程序支付参数(对应第7步)
  • 场景:商户系统拿到微信返回的prepay_id后,生成给小程序的支付信息时。
  • 签名参数
    包括appidtimeStamp(当前时间戳)、nonceStr(随机字符串)、package(固定格式为prepay_id=xxx,即第6步返回的预支付标识)、signType(签名算法类型),最后拼接商户API密钥。
  • 加密算法:与第一次签名一致(需和signType对应)。
  • 作用
    小程序调用wx.requestPayment时会携带这些参数,微信支付系统会再次验证签名,确保“用户发起的支付请求”对应的是之前创建的预支付订单(通过prepay_id关联),且参数未被篡改。

为什么需要两次签名?

两次签名分别对应两个不同的交互环节,保护不同阶段的信息安全:

  1. 第一次签名保护“商户→微信支付”的订单创建请求,防止恶意商户伪造订单。
  2. 第二次签名保护“小程序→微信支付”的用户支付请求,防止支付参数在商户系统到小程序的传输中被篡改(比如修改prepay_id指向其他订单)。

两次签名都依赖商户的API密钥(仅商户和微信支付系统知晓),确保了整个支付流程的端到端安全。

具体操作:
  1. 整理订单核心参数
    商户系统会按微信支付接口要求,整理以下关键信息:
    • 商户号(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密钥对以上参数加密生成的签名(验证请求合法性)
  1. 调用微信支付接口
    商户系统通过HTTPS协议,向微信支付的“统一下单接口”(https://api.mch.weixin.qq.com/pay/unifiedorder)发送上述参数,请求创建预支付订单。

第6步:微信支付系统返回“预支付会话标识(prepay_id)”

微信支付系统接收到商户的预支付订单请求后,会进行一系列校验,确认无误后生成一个预支付会话标识(prepay_id,并返回给商户系统。

具体过程:
  1. 微信支付系统的校验
    • 验证签名:检查商户发送的签名是否正确(防止请求被篡改或伪造)
    • 验证参数合法性:检查商户号、appid是否已开通支付权限,订单号是否重复,金额是否符合规则等
    • 风控检查:对订单进行风险评估(如是否为异常交易、用户是否有支付限制等)
  1. 生成并返回prepay_id
    若所有校验通过,微信支付系统会在内部创建一条预支付订单记录,并生成一个唯一的prepay_id(格式如wx2421b5582005320f7d4f00162250620),作为这笔订单在微信支付系统中的“临时会话ID”。
    同时,微信支付系统会将prepay_id及其他辅助信息(如返回状态码return_code、业务结果result_code等)通过XML或JSON格式返回给商户系统。

这两步的核心意义
  • 第5步是商户系统向微信支付“报备”订单信息的过程,确保微信支付系统认可这笔订单的合法性。
  • 第6步prepay_id是后续用户实际支付的“钥匙”——没有这个标识,微信支付系统不会认可后续的支付请求。
    简单说,这两步完成了“商户与微信支付之间的订单信息同步”,为用户最终的支付操作(如输入密码、确认支付)铺平了道路。

接下来,商户系统会用这个prepay_id生成带签名的支付信息(第7步),再返回给小程序调起支付界面。

三、微信支付中商家签名的作用

在该微信支付时序图中,第7步“生成带签名支付信息” 是保障支付请求合法性与安全性的关键环节,下面从技术逻辑和作用两方面详细解释:

一、技术逻辑:签名的生成与作用

微信支付要求商户发起的支付请求必须经过签名验证,目的是防止支付请求在传输过程中被恶意篡改(比如修改支付金额、订单号等关键信息),同时证明该请求确实来自合法的商户(而非伪造)。

生成带签名支付信息的具体过程大致如下:

  1. 收集支付关键参数:商户系统后台会整理与当前支付相关的核心参数,通常包括:
    • 商户号(mch_id):商户在微信支付平台的唯一标识。
    • 应用ID(appid):对应发起支付的小程序/应用的ID。
    • 订单号(out_trade_no):商户系统内的订单编号。
    • 支付金额(total_fee):订单的支付总金额(单位通常为分)。
    • 随机字符串(nonce_str):用于增加签名的随机性,防止重复攻击。
    • 支付回调地址(notify_url):支付结果异步通知商户的地址。
    • 交易类型(trade_type):如小程序支付对应JSAPI
  1. 按规则拼接参数:按照微信支付规定的参数排序和拼接规则(通常是按参数名ASCII码从小到大排序后拼接),将上述参数组合成字符串。
  2. 加入密钥并加密:在拼接好的参数字符串后,加入商户的API密钥(在微信支付商户平台配置),然后通过指定的哈希算法(如HMAC-SHA256MD5,不同版本支付接口要求不同)进行加密,生成签名(sign
  3. 封装成支付信息:将原始参数与生成的签名一起,封装成完整的“带签名支付信息”。

二、作用:保障支付安全与流程合法性
  1. 防篡改:因为签名是基于支付参数和商户专属密钥生成的,若支付请求在传输中被篡改(比如把支付金额从100元改成1元),微信支付系统在接收到请求后,会用同样的参数和商户密钥重新生成签名,与请求中携带的签名对比,若不一致则会拒绝该支付请求,避免商户资金损失。
  2. 身份验证:只有知晓商户API密钥的合法商户系统,才能生成正确的签名。这就确保了发起支付请求的是商户自身,而非第三方伪造的请求,防止“假支付”等欺诈行为。
  3. 为后续支付请求铺路:生成的“带签名支付信息”会被传递给商家小程序(第8步),小程序再带着这些信息调用微信支付接口(第9步 wx.requestPayment)时,微信支付系统会验证签名的合法性,只有签名合法,支付流程才能继续进行。

总结来说,第7步是支付安全的核心保障环节,通过签名机制,在技术上确保了支付请求的“真实性”和“完整性”,为后续用户顺利、安全地完成支付提供基础。

四、微信支付系统验证支付安全的关键步骤

在该微信支付时序图中,第10步到第12步 是用户侧与微信支付系统交互、完成支付授权的关键流程,下面分步详细解释:

第10步:请求调起支付

商家小程序在接收到商户系统后台返回的“带签名支付信息”(第8步)后,会调用微信提供的小程序支付接口 wx.requestPayment(这是微信小程序内置的支付能力API),向微信支付系统发起支付请求。

此时,小程序会把包含签名的支付参数(如订单号、支付金额、商户信息、签名等)传递给微信支付系统,请求微信支付系统弹出支付授权界面。

第11步:验证支付授权权限

微信支付系统接收到小程序的支付请求后,会进行一系列权限验证,确保该支付请求是“合法且可执行”的:

  1. 验证签名合法性:检查支付请求中携带的签名是否合法(即是否与商户系统后台生成签名的逻辑一致,防止请求被篡改)。
  2. 验证商户与订单状态:确认商户号、应用ID是否有效,订单是否处于可支付状态(比如订单未被支付、未被取消等)。
  3. 验证用户身份与支付资格:初步校验当前小程序用户是否有支付权限(比如是否登录、是否被风控限制支付等)。

只有当这些验证都通过后,微信支付系统才会允许调起用户侧的支付授权界面。

第12步:返回支付授权

微信支付系统完成权限验证后,会向商家小程序返回“支付授权界面的唤起指令”。

此时,用户的小程序界面会弹出微信支付的授权窗口(通常包含支付金额、订单简要信息,并提供“确认支付”“取消”等操作按钮),等待用户进行下一步的支付确认(如输入支付密码、刷脸等,具体取决于用户的支付设置)。

流程核心意义

这三步是用户从“发起支付”到“可主动确认支付”的过渡环节

  • 第10步是“商户侧触发支付”的动作;
  • 第11步是“微信侧保障支付安全”的校验;
  • 第12步是“把支付控制权交还给用户”的关键节点(让用户能看到支付信息,并自主选择是否完成支付)。

后续用户“确认支付、输入密码”(第13步)的动作,就基于这一步弹出的授权界面来完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值