Hapi 框架实现微信支付,遇到的 Bug 及处理方式

阅读时长 6 分钟读完

在前端开发中,支付功能是必不可少的一部分。而微信支付作为移动支付中的佼佼者,它的快速、安全和方便性也让它成为了具有广泛应用场景的支付方式之一。本文将详细介绍如何使用 Hapi 框架实现微信支付功能,并分享在开发过程中遇到的 Bug 及处理方式,帮助读者更好地掌握 Hapi 和微信支付的实现技巧。

环境搭建

在开始开发之前,我们需要准备好以下环境:

  • 一个微信公众号(或小程序)的 appId 和 secretKey
  • Node.js 开发环境
  • Hapi 框架

我们先介绍一下如何申请微信支付需要的信息。在微信支付开发者文档中,选择"申请开发者权限",依次填写相关信息如商户账号、邮箱等,提交后会收到审核通过的邮件,并获得自己的 appId 和 secretKey。此时我们已经可以开始在 Hapi 框架中实现微信支付功能。

功能实现

统一下单接口

微信支付流程的第一步是通过微信支付接口向微信后台发起请求,生成预付款订单,之后微信会返回响应结果并附带了 prepay_id(预付款订单号),接口定义如下:

-- -------------------- ---- -------
-- ----
----- -------- ----------------------- ---------- ------- ------- -
  --- -------- - ------------- -- ------------
  --- --------- - -------------- -- ---
  --- ---------- - -------------------------------- -- -----

  -- -----
  --- ---- - -
    ------ ------------------
    ------- -------------------
    ---------- ---------
    ----- ------- -- ----
    ------------- ----------- -- -----
    ---------- ------- -- ----------
    ----------------- ---------- -- ----
    ----------- -------------------------------------------------- -- ----------
    ----------- -------- -- ---------
    ------- ------ -- -- ------
  -

  -- -------------------------
  --- ---- - --------------
  --------- - ----
  --- ------ - ----- ---------------------------------------- ---------------

  -- ----
  --- -------- - ---------------------
  -- --
-

其中,重点需要注意的是在调用微信支付前需要对请求参数进行签名处理。签名算法有比较严格的要求,具体可以参考微信支付开发者文档中的操作方法,或者在第三方的微信支付 SDK 中查找算法。

订单查询接口

订单查询接口是用于查询订单最新状态,但需要注意的是,退款也属于一种 order_status 的状态,查询到“order_status”为“REFUND”并不意味着该订单已完成支付,接口定义如下:

-- -------------------- ---- -------
-- ----
----- -------- ---------------------- -
  --- -------- - ------------- -- ------------
  --- --------- - -------------- -- ---

  -- -----
  --- ---- - -
    ------ ------------------
    ------- -------------------
    ---------- ---------
    ------------- ------- -- -----
  -

  -- -------------------------
  --- ---- - --------------
  --------- - ----
  --- ------ - ----- -------------------------------------- ---------------

  -- ----
  --- ---------- - -----------------------
  --- ---------- - ----------------------- -- ----
  --- -------- - --------------------- -- -----
  -- --
-

定义微信支付回调

微信支付支付成功后将异步回调商户服务器,通知支付结果。所以我们需要在服务器端定义回调逻辑。在 Hapi 框架中,可以使用 server.route() 函数创建一个 POST 请求处理路由,接收微信支付回调的 XML 报文,并对其进行验签和业务处理,示例代码如下:

-- -------------------- ---- -------
-- --------
--------------
  ------- -------
  ----- ------------------
  -------- ----- -------- --------- ------ -
    --- -
      --- ---- - ----- ------------------------- -- ----------- --- --

      -- -------------------- - -- ------------
        --- - ------------- ----------- - - --------
        --- ---------- - -------------------- -- ----

        -- ------------ --- --------- -- ---------- --- ---------- - -- ----------
          -------------------------------------------

          -- ------------------------------------------
          -- --
        -
      -
    - ----- --- -
      --------------
    -

    ---------------- -- -------------------------
  -
--

遗留 Bug 及解决方案

在实际开发过程中,我们也会遇到一些问题,例如开发中出现提示“ERR_SSL_VERSION_OR_CIPHER_MISMATCH”,这是因为微信支付接口采用了 TLS1.2 协议,所以需要升级 Node.js 版本以支持该协议。同时,如果时间戳配置不正确可能会导致签名校验失败,所以需要开启 NTP 服务,并将时间同步为北京时间。

此外,还有一种比较常见的问题:对于一些特殊字符(如“+”、“&”等),微信支付会对其进行 URL 编码,而如果在验签的过程中没有进行 URL 解码,则会导致签名验证失败。所以,在验证签名之前需要将 XML 报文中的字符数据进行 URL 解码。

总结

本文详细介绍了如何使用 Hapi 框架实现微信支付功能,并分享了在开发过程中遇到的 Bug 及处理方式,希望能够帮助读者更好地掌握 Hapi 和微信支付的实现技巧。我们需要注意签名算法的处理、订单状态查询的注意事项,在回调业务处理成功之后,需要及时保存订单状态及相关数据到数据库。

在实际开发中,如果我们需要进行更加复杂的逻辑处理,例如多个订单的批量处理等,可以选择使用队列、定时器等技术方案。本文提供的示例代码可以作为一个参考,并在实际开发中加以调整和优化,以适应不同场景的需求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a77cdcadd4f0e0ff09cc47

纠错
反馈