在前端开发中,支付功能是必不可少的一部分。而微信支付作为移动支付中的佼佼者,它的快速、安全和方便性也让它成为了具有广泛应用场景的支付方式之一。本文将详细介绍如何使用 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