随着移动支付的普及,微信支付已成为许多企业和个人的首选支付方式。在前端开发中,如何利用 Fastify 框架实现微信支付功能呢?本文将介绍微信支付的完整流程,并提供示例代码和指导意义。
1. 准备工作
在开始前,我们需要进行一些准备工作:
- 微信公众号或小程序的 AppID 和 AppSecret
- 商户号和 API 密钥
- 服务器的 SSL 证书
其中,微信公众号或小程序的 AppID 和 AppSecret 可以在微信公众平台申请。商户号和 API 密钥则需要在微信商户平台进行申请。SSL 证书可以通过购买或自己生成。
2. 支付流程
微信支付的流程可以分为以下几步:
2.1. 统一下单
用户在前端页面选择商品后,前端向后端发送请求,后端调用微信支付 API 的统一下单接口,生成一个预支付交易会话标识(prepay_id)。
-- -------------------- ---- -------
----- ------------ - ----- ------- -- -
----- ------ - ----- ------------------------------------------------------------ -
------ ------
------- -------
---------- -----------
----- ------------------
------------- --------------
---------- -------------
----------------- ---------
----------- -----------
----------- --------
------- ------------
--
----- - ------------ ------------ --------- - - ---------------------
-- ------------ --- --------- -- ----------- --- ---------- -
------ ---------
- ---- -
----- --- ------------------
-
-其中,APPID 和 MCH_ID 分别是微信公众号或小程序的 AppID 和商户号。nonce_str 是一个随机字符串,用于防止重放攻击。body 是商品描述。out_trade_no 是商户订单号,需要保证唯一性。total_fee 是订单总金额,单位为分。spbill_create_ip 是用户的 IP 地址。notify_url 是支付结果通知的回调地址。trade_type 是交易类型,JSAPI 表示公众号支付或小程序支付。openid 是用户的 openid。
2.2. 签名
生成 prepay_id 后,需要对数据进行签名。签名算法如下:
- 将参数按照字典序排序。
- 将参数用 URL 键值对的格式拼接成字符串。
- 在拼接的字符串末尾加上 API 密钥。
- 将上一步得到的字符串进行 MD5 运算,得到签名值。
-- -------------------- ---- -------
----- ---- - -------- -- -
----- ------------ - --------------------------------------- ---- -- -
-------- - -----------
------ ---
-- ---
----- ------ - ----------------------------------- - ------- - -------
------ -------------------------
-其中,querystring 是 Node.js 内置模块,用于处理 URL 查询字符串。md5 是一个第三方库,用于计算 MD5 值。
2.3. 前端调用
将 prepay_id 和签名值传给前端,前端调用微信支付 API 的 JSAPI 支付接口,实现支付功能。
-- -------------------- ---- -------
----- ------------- - -- -- -
----------------------
----------------------- -
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- ------
-------- ------
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- -----
--
--
----- -- -
-- ------------ --- ----------------------------- -
-------------
- ---- -
-------------
-
-
-
-
-- ------- -------------- --- ------------ -
-- --------------------------- -
------------------------------------------------ -------------- ------
- ---- -- ---------------------- -
------------------------------------------- --------------
--------------------------------------------- --------------
-
- ---- -
---------------
-其中,timestamp 和 nonceStr 分别是一个时间戳和一个随机字符串,用于防止重放攻击。
3. 后端实现
在后端,我们使用 Fastify 框架实现微信支付功能。具体步骤如下:
3.1. 安装依赖
npm install fastify fastify-xml-body-parser axios querystring md5
其中,fastify 是 Fastify 框架的核心模块,fastify-xml-body-parser 是用于解析 XML 格式的请求体,axios 是用于发送 HTTP 请求,querystring 和 md5 是用于处理签名的。
3.2. 创建服务器
-- -------------------- ---- -------
----- ------- - --------------------
------- -----
------ -
---- ---------------------------
----- ---------------------------
-
--
-------------------- ----- --------- ------ -- -
----- ----- - ------------
--- -
----- -------- - ----- -------------------
----- ------ - -
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- ------
-------- ------
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- -----
--
-
------------------
- ----- ------- -
-------------------------------------
-
--
-------------------- ----- -------- -- -
-- ----- -
----------------------
---------------
-
------------------------ --------- -- ------------
--其中,key.pem 和 cert.pem 是 SSL 证书的私钥和公钥。unifiedOrder 是前面介绍的统一下单函数。reply.send 和 reply.status 分别用于发送响应和设置响应状态码。
3.3. 示例代码
完整的代码如下:
-- -------------------- ---- -------
----- ------- - --------------------
------- -----
------ -
---- ---------------------------
----- ---------------------------
-
--
----- ----- - ----- ------
----- --------- - ----- ----------
----- ------ - ----- -------
----- ------- - ----- --------
----- ---------- - ----- -----------
----- -------- - -- -- -
------ ------------------------------------ ---
-
----- --------- - -- -- -
------ --------------------- - ----------------
-
----- -------- - ----- -- -
------ ----------- - -------- ---- ------
-
----- ------------ - ----- ------- -- -
----- ------ - ----- ------------------------------------------------------------ -
------ ------
------- -------
---------- -----------
----- ------------------
------------- --------------
---------- -------------
----------------- ---------
----------- -----------
----------- --------
------- ------------
--
----- - ------------ ------------ --------- - - ---------------------
-- ------------ --- --------- -- ----------- --- ---------- -
------ ---------
- ---- -
----- --- ------------------
-
-
----- ---- - -------- -- -
----- ------------ - --------------------------------------- ---- -- -
-------- - -----------
------ ---
-- ---
----- ------ - ----------------------------------- - ------- - -------
------ -------------------------
-
-------------------- ----- --------- ------ -- -
----- ----- - ------------
--- -
----- -------- - ----- -------------------
----- ------ - -
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- ------
-------- ------
------ ------
---------- ------------
--------- -----------
-------- ------------ - ---------
--------- -----
--
-
------------------
- ----- ------- -
-------------------------------------
-
--
-------------------- ----- -------- -- -
-- ----- -
----------------------
---------------
-
------------------------ --------- -- ------------
--4. 指导意义
本文介绍了利用 Fastify 框架实现微信支付功能的完整流程,包括统一下单、签名和前端调用。通过本文的学习,我们可以了解到微信支付的原理和实现方式,掌握 Fastify 框架的使用方法,提高前端开发的技能水平。
在实际开发中,我们还需要注意安全性和稳定性。例如,需要对用户输入的参数进行校验和过滤,防止 SQL 注入和 XSS 攻击。同时,需要进行性能优化和错误处理,保证系统的可靠性和可扩展性。
总之,微信支付是一项重要的功能,我们需要不断学习和实践,提高自己的技术水平,为用户提供更好的支付体验。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/6796fc97504e4ea9bddfa826