前言
当今的互联网时代,各种开放平台层出不穷,微信、支付宝等已经成为人们日常生活不可或缺的一部分。而如何与这些开放平台对接,让后端开发者非常头疼,需要考虑到服务器的管理、部署、性能优化等问题,这些问题会对开发效率带来很大的影响,Serverless 的出现则非常好的解决了这些问题。
那么本文将介绍如何使用 Serverless 搭建 API 对接微信 / 支付宝等开放平台。
Serverless 是什么?
Serverless(无服务器架构)是一种新兴的云计算架构,不需要宿主操作系统,不需要维护操作系统、数据库、Web服务器的状态,不用关心网络层的操作等问题。它是一个让开发者可以专注于代码编写,而不是关注服务器架构和管理的云计算架构。
Serverless 最核心的特性就是“事件驱动”,服务器只有在接收到请求的时候才会去执行代码,所以减少了无意义的计算,从而减少了服务器的开销。另外,Serverless 服务具有自动扩容能力、冷启动时间短的特点,能够应对高并发场景。
Serverless 对接微信 / 支付宝等开放平台
准备工作
使用 Serverless 对接微信 /支付宝等开放平台,需要提前准备好以下工作:
一个可用的 Serverless 平台,这里推荐使用阿里云函数计算(FC)。
一个公众号或者服务窗口的账号,具体使用哪种账号,根据你的实际业务需求来选择。
微信支付或支付宝支付的商户号以及对应的 API 密钥。
构建 Serverless 项目
在阿里云函数计算上创建一个新的项目,这个项目将作为我们使用 Serverless 对接微信 / 支付宝等开放平台的基础。
创建项目后,在项目根目录下新建一个 config.js
文件,用于存储微信支付或支付宝支付的商户号以及对应的 API 密钥。
// javascriptcn.com 代码示例 // config.js module.exports = { wxpay: { mch_id: 'your_wechatpay_mch_id', appid: 'your_wechatpay_appid', key: 'your_wechatpay_key' }, alipay: { app_id: 'your_alipay_appid', private_key: 'your_alipay_private_key', alipay_public_key: 'your_alipay_public_key' } };
使用 Serverless 实现微信支付
创建项目
创建一个新的项目,并在项目的根目录下创建一个 payment
目录,该目录用于存放与微信支付相关的代码。在 payment
目录下创建一个 wechat.js
文件,用于存放微信支付相关的逻辑。
在 wechat.js
文件中引入 Serverless SDK,并在导出的函数中实现微信支付的逻辑。
// javascriptcn.com 代码示例 // wechat.js const WeChatPay = require('node-tenpay'); const { wxpay } = require('../config'); const wechatConfig = { appid: wxpay.appid, mchid: wxpay.mch_id, partnerKey: wxpay.key, notifyUrl: 'https://xxxx.com/pay/notify' // 回调地址 }; const wechatpay = new WeChatPay(wechatConfig); exports.payment = async (event, context) => { const result = await WeChatpay.getPayParams({...}); // 微信支付逻辑实现 return result; };
配置路由
为 Serverless 函数创建一个路由,与微信支付的接口路径相对应。 在项目的根目录下创建一个 app.js
文件,用于实现 Serverless 函数的路由。
// javascriptcn.com 代码示例 // app.js const serverless = require('serverless-http'); const express = require('express'); const wechat = require('./payment/wechat'); const app = express(); app.get('/wechat/payment', async (req, res) => { const data = await wechat.payment(req, res); res.json(data); }); module.exports.handler = serverless(app);
配置自动部署
Serverless 的项目需要配置好参数后,需要进行部署,才能通过 API 网关暴露出来。我们可以通过 Serverless 的功能进行自动部署。在项目根目录下,创建一个 serverless.yml
文件,并添加以下内容。
// javascriptcn.com 代码示例 # serverless.yml service: serverless-demo provider: name: aliyun functions: wechat: handler: app.handler events: - http: path: wechat/payment method: get # 更多配置详见官方文档
使用 Serverless 实现支付宝支付
创建项目
创建一个新的项目,并在项目的根目录下创建一个 payment
目录,该目录用于存放与支付宝支付相关的代码。在 payment
目录下创建一个 alipay.js
文件,用于存放支付宝支付相关的逻辑。
在 alipay.js
文件中引入 Serverless SDK,并在导出的函数中实现支付宝支付的逻辑。
// javascriptcn.com 代码示例 // alipay.js const Alipay = require('alipay-sdk').default; const { alipay } = require('../config'); const alipayConfig = { appId: alipay.app_id, signType: 'RSA2', charset: 'utf-8', gateway: 'https://openapi.alipaydev.com/gateway.do', rsaPrivate: alipay.private_key, rsaPublic: alipay.alipay_public_key }; const alipaySdk = new Alipay(alipayConfig); exports.payment = async (event, context) => { const result = await alipaySdk.exec('alipay.trade.pay', {...}); // 支付宝支付逻辑实现 return result; };
配置路由
为 Serverless 函数创建一个路由,与支付宝支付的接口路径相对应。在项目的根目录下创建一个 app.js
文件,用于实现 Serverless 函数的路由。
// javascriptcn.com 代码示例 // app.js const serverless = require('serverless-http'); const express = require('express'); const alipay = require('./payment/alipay'); const app = express(); app.get('/alipay/payment', async (req, res) => { const data = await alipay.payment(req, res); res.json(data); }); module.exports.handler = serverless(app);
配置自动部署
Serverless 的项目需要配置好参数后,需要进行部署,才能通过 API 网关暴露出来。我们可以通过 Serverless 的功能进行自动部署。在项目根目录下,创建一个 serverless.yml
文件,并添加以下内容。
// javascriptcn.com 代码示例 # serverless.yml service: serverless-demo provider: name: aliyun functions: alipay: handler: app.handler events: - http: path: alipay/payment method: get # 更多配置详见官方文档
总结
通过上面的介绍,我们可以知道 Serverless 架构相对于传统的服务器架构,优势非常明显:使用方便、冷启动时间短、自动扩容等特点,可以加快开发者的开发效率,减少运维成本。在与微信 / 支付宝等开放平台对接时,使用 Serverless 可以使对接过程更加方便简洁、高效。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654890977d4982a6eb2d3ebe