## 开始前

开始本场景前，应已完成[开发前准备](../开始接入/开发前准备.md)和[请求与签名](../开始接入/请求与签名.md)，并准备：

- 已在目标商户小程序中申请、添加并配置MiniPayPro插件。
- 当前门店和设备对应的终端参数。
- 小程序可返回的业务页面路径。
- 可执行主动查询并接收异步通知的商户后台。

## 配置MiniPayPro插件

- 目标：确保目标商户小程序能够调用MiniPayPro。
- 配置来源：插件`appid`、版本、权限和商户关系按MiniPayPro文档及对接信息配置。
- 完成结果：开发版小程序可以正常进入插件订单页，并能够返回指定商户页面。
- 下一步：创建商户订单并准备插件参数。

插件配置未完成、版本未发布或商户关系不匹配时，不要通过修改订单参数绕过校验。

## 创建商户订单

- 目标：在跳入插件前保存一笔可追踪的待支付订单。
- 输入来源：商品、金额、顾客和门店信息来自商户系统。
- 商户系统处理：生成全局唯一的商户订单号，保存订单金额、插件调用状态和创建时间。
- 输出用途：作为插件支付、主动查询、回调、退款和幂等履约的关联标识。
- 下一步：准备并调用插件支付接口。

## 调用插件支付

- 目标：让顾客进入MiniPayPro订单页并完成付款。
- 调用接口：**[插件支付接口](https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx55540b288c5ce319&token=930559648&lang=zh_CN)**。
- 输入来源：商户订单号、金额和商品简介来自已保存订单；`return_url`来自商户小程序页面配置；其他插件参数来自开通和终端配置。
- 输出用途：插件接收订单数据，展示支付确认页并调用微信支付。
- 下一步：跳转插件成功5秒后，商户后台开始查询原订单。

完整插件参数、调用方法和返回结构以插件文档为准，不在本指南重复字段表。

## 处理插件返回

- 目标：顾客离开插件后返回正确的商户页面。
- 输入来源：插件完成、取消或中断后返回的页面信息。
- 页面处理：提示“正在确认支付结果”，并向商户后台读取订单状态。
- 输出用途：只控制页面展示和导航。
- 下一步：继续等待商户后台查询或异步通知。

插件返回成功不等于支付最终成功，插件返回失败也不能证明交易一定失败。商户小程序不得根据插件返回值直接履约。

## 主动查询

- 目标：确认插件订单的最终交易状态。
- 调用接口：**[查询接口](https://open.shouqianba.com/docs/payment/71?category_id=54)**。
- 输入来源：使用创建订单时保存的原商户订单号或已取得的收钱吧订单号。
- 签名凭证：商户后台使用当前终端的`terminal_sn`和`terminal_key`。
- 输出用途：更新商户后台的原订单状态。
- 下一步：最终成功则履约；最终失败则结束；非最终状态按本场景节奏继续查询。

跳转插件成功5秒后开始查询；第0至1分钟每3秒一次，第1至5分钟每10秒一次，第6分钟执行最后一次查询。

## 接收支付回调

- 目标：异步补偿主动查询和页面中断。
- 对接接口：**[回调接口](https://open.shouqianba.com/docs/payment/70?category_id=54)**。
- 输入来源：收钱吧发送到商户公网回调地址的原始通知。
- 商户系统处理：验签，通过商户订单号定位原订单，并与主动查询共用状态机。
- 输出用途：确认最终交易结果。
- 下一步：成功落库后返回`success`；最终成功时只履约一次。

## 完成履约

- 触发条件：商户后台通过查询或验签回调确认最终支付成功。
- 执行动作：继续销售流程、出货、发券或开通服务。
- 幂等要求：以商户订单号作为幂等键，只创建一个履约任务。

## 发起退款

- 目标：退回已经确认支付成功的订单资金。
- 调用接口：**[退款接口](https://open.shouqianba.com/docs/payment/72?category_id=54)**。
- 输入来源：原支付订单标识、唯一退款流水号、金额和原因来自商户售后系统。
- 签名凭证：由商户后台使用终端参数签名。
- 输出用途：保存退款流水并关联原支付订单。
- 下一步：非最终结果或请求超时时查询原退款流水。

## 完成标准

- [ ] 目标小程序已正确添加和配置MiniPayPro。
- [ ] 商户订单号全局唯一，插件调用前已经落库。
- [ ] 插件参数来源明确，前端不持有终端密钥。
- [ ] 插件返回只用于页面展示，不直接履约。
- [ ] 跳转成功5秒后按规定节奏查询原订单。
- [ ] 回调和查询更新同一订单，并只履约一次。
- [ ] 4分钟支付有效期和第6分钟最后查询已经实现。
- [ ] 结果未知时不会履约或重复发起支付。
