博客

使用 Laravel 和 WordPress 集成 Yappy 及巴拿马支付

更新于: 15 分钟阅读
Yappy支付LaravelWordPress巴拿马BACPaguelo Fácil

在巴拿马商户中集成 Yappy,远不止添加一个支付按钮。你需要清晰的流程、在服务器端签名的金额、能在用户中断后仍然保留的状态,以及能够解释订单为何已付或未付的后端。

本文介绍基于 Laravel 的后端优先模式;当前端是 WordPress 或 WooCommerce 时,将 CMS 作为展示和结账界面,把敏感逻辑移出主题。适用于 Yappy、BAC Credomatic、Paguelo Fácil 及统一网关的集成。

Yappy 的实际运作方式

Yappy(Banco General)是巴拿马广泛使用的收款方式。典型商业集成流程:

  1. 在商户门户完成商户注册并获取凭证(merchantId / secret)。
  2. 由服务器生成支付 URL 或支付意图。
  3. 用户在 Yappy 流程中完成支付(app / redirect)。
  4. 系统通过 redirect + 端点通知接收结果并更新订单。

黄金法则:支付从后端发起

在前端显示按钮之前,服务器必须:

  1. 创建或获取订单,包含商品、货币和税费。
  2. 在服务器端计算总额(绝不信任浏览器 JSON)。
  3. pending 状态保存支付记录,并关联内部 order_id
  4. 向 Yappy 请求带有这些金额的支付 URL / token。
  5. 仅向前端返回继续流程所需的信息或重定向。

WordPress / WooCommerce:不污染主题

在使用 Elementor、定制主题或 WooCommerce 的 WordPress 站点中,密钥不应放在 functions.php 或页面构建器代码片段里。

推荐模式:

  • WooCommerce 创建本地订单。
  • 轻量端点或插件调用 Laravel API(网关)。
  • Laravel 与 Yappy / BAC / Paguelo Fácil 通信。
  • 后端确认后,WordPress 同步状态。

Laravel 实现

  1. 带规范化状态的 Order + Payment 模型。
  2. 带接口适配器的 PaymentGateway 服务。
  3. 受保护的支付发起端点:验证购物车、计算总额、持久化 pending
  4. 回调/IPN 端点:验证签名、保证幂等、分发对账任务。
  5. 返回页查询数据库状态;不根据 query string 标记 paid
  6. 银行延迟通知时的重试队列。
  7. 密钥仅存在于主机环境变量中(Coolify:服务变量,而非 Git 中的 .env)。

规范化状态

内部状态含义
pending已创建意图;尚无可靠确认
paid通过回调/签名验证确认收款
rejected被提供商拒绝
cancelled用户中止
expired操作超时

技术检查清单

  1. 凭证仅存放在环境变量中。
  2. 沙箱与生产环境分离。
  3. 幂等性:同一 order_id 不创建两笔扣款。
  4. 持久化 payload 以供审计。
  5. 验证提供商回传的数据。
  6. 对账重试任务。
  7. 日志中不含密钥或卡数据。
  8. 结果页查询后端状态。
  9. 部署时 healthcheck 和 worker 正常运行。
  10. 密钥轮换和 IPN 重处理的 runbook。

生产环境常见错误

  • 仅因用户访问 /pago-exitoso 就确认销售。
  • 将 secret 留在已纳入 Git 版本控制的 WordPress 插件中。
  • 把 Yappy、BAC 和 Paguelo Fácil 的逻辑混在一个巨大的 if 里。
  • 忽略"用户已付款但关闭 app"且没有回调的情况。
  • 使用 latest 部署并将密钥烘焙进 Docker 镜像。

本集成与以下主题相关: Docker、CI/CD 和 Coolify安全审计在线支付 .

常见问题

Yappy 可以只在前端集成吗?

不可以。按钮或重定向可以放在前端,但金额、订单和签名必须在后端生成。如果由浏览器决定价格,就会被人篡改。

适用于 WordPress 和 WooCommerce 吗?

适用。对于 WordPress/WooCommerce 店铺,应将结账连接到与 Yappy、BAC 或 Paguelo Fácil 通信的 Laravel API(或后端模块),而不是把密钥混在主题里。

如果用户在支付中途关闭 app 怎么办?

因此必须持久化状态(pending、executed、rejected、cancelled)并处理 callback/IPN。不能仅因用户回到成功 URL 就确认订单。

能否将 Yappy 与 BAC 和 Paguelo Fácil 统一?

可以。这是统一网关模式:Laravel 中的内部契约 + 各提供商的适配器。这样每次换银行都不必重写电商系统。

一次干净的集成需要多久?

做好单笔收款(沙箱、回调、基础对账)通常需要数天,而非数月。订阅、按比例计费或多提供商会扩大范围,应在编码前书面定义。