当前位置:  首页>> 技术小册>> 微信小程序全栈开发实战(下)

126|微信支付:安装微信支付模块 koa3-wechat

在微信小程序的全栈开发过程中,集成微信支付功能是提升用户体验、实现商业变现的重要一环。本章节将详细介绍如何在基于Koa3框架的服务器项目中安装并配置koa3-wechat模块,以实现微信支付的集成。koa3-wechat是一个专为Koa3框架设计的微信开发库,它封装了微信支付的API调用细节,使得开发者能够更便捷地在Node.js环境下处理微信支付相关的业务逻辑。

一、准备工作

在开始之前,请确保你的开发环境已经安装了Node.js和npm(Node Package Manager),并且已经创建了一个基于Koa3的服务器项目。此外,你还需要在微信公众平台注册账号,并开通微信支付功能,获取必要的API密钥、商户ID(MCHID)、商户API密钥(APIv3密钥)、商户证书等信息。

二、安装koa3-wechat模块

在你的Koa3项目根目录下,打开终端或命令行工具,执行以下npm命令来安装koa3-wechat模块及其依赖:

  1. npm install koa3-wechat --save

此命令会将koa3-wechat及其所有依赖项添加到你的项目package.json文件的dependencies部分,并下载到node_modules目录中。

三、配置微信支付参数

安装完koa3-wechat后,你需要在你的Koa3应用中配置微信支付的相关参数。这通常涉及到设置商户ID、API密钥、商户证书等敏感信息。为了安全起见,建议不要在代码中直接硬编码这些敏感信息,而是通过环境变量或配置文件来管理。

以下是一个简化的配置示例,假设你已将敏感信息存储在环境变量中:

  1. const Koa = require('koa');
  2. const WechatPay = require('koa3-wechat').WechatPay;
  3. const fs = require('fs');
  4. const app = new Koa();
  5. // 读取商户证书(假设为PEM格式)
  6. const merchantCert = fs.readFileSync('/path/to/your/merchant_cert.pem');
  7. const merchantPrivateKey = fs.readFileSync('/path/to/your/merchant_private_key.pem');
  8. // 微信支付配置
  9. const wechatPayConfig = {
  10. appid: process.env.WECHAT_APPID, // 小程序AppID
  11. mchid: process.env.WECHAT_MCHID, // 商户号
  12. serialNo: process.env.WECHAT_SERIAL_NO, // 商户API证书序列号
  13. privateKey: merchantPrivateKey.toString(), // 商户私钥
  14. certs: [
  15. {
  16. serialNo: process.env.WECHAT_SERIAL_NO,
  17. cert: merchantCert.toString(), // 商户证书内容
  18. }
  19. ],
  20. v3Key: process.env.WECHAT_APIV3KEY, // APIv3密钥
  21. notifyUrl: 'https://your-domain.com/wechatpay/notify', // 微信支付异步通知地址
  22. };
  23. // 初始化微信支付模块
  24. const wechatPay = new WechatPay(wechatPayConfig);
  25. // 接下来,你可以使用wechatPay对象来调用微信支付的API

注意:上述代码中的证书路径、环境变量名称等需根据实际情况调整。

四、实现支付功能

配置好微信支付模块后,你就可以开始实现具体的支付功能了。这通常包括生成预支付交易会话标识(prepay_id)、处理支付结果通知等步骤。

4.1 生成预支付交易会话标识

用户在小程序端发起支付请求时,后端需要生成一个预支付交易会话标识(prepay_id),并将其返回给小程序端。小程序端使用这个prepay_id来调起支付界面。

  1. async function createPrepayId(orderInfo) {
  2. try {
  3. const result = await wechatPay.unifiedOrder({
  4. body: orderInfo.body,
  5. out_trade_no: orderInfo.out_trade_no,
  6. total_fee: orderInfo.total_fee,
  7. spbill_create_ip: orderInfo.spbill_create_ip,
  8. notify_url: wechatPayConfig.notifyUrl,
  9. trade_type: 'JSAPI', // 小程序支付类型
  10. openid: orderInfo.openid, // 用户openid
  11. });
  12. return result.prepay_id;
  13. } catch (error) {
  14. console.error('Create prepay_id failed:', error);
  15. throw error;
  16. }
  17. }
  18. // 假设在某个路由中调用此函数
  19. app.use(async ctx => {
  20. if (ctx.path === '/api/createPrepayId') {
  21. const orderInfo = {
  22. // ... 填充订单信息
  23. };
  24. const prepayId = await createPrepayId(orderInfo);
  25. ctx.body = { prepayId };
  26. }
  27. });
4.2 处理支付结果通知

微信支付完成后,微信服务器会向商户服务器发送支付结果通知。商户服务器需要验证通知数据的真实性和完整性,并据此更新订单状态。

  1. app.use(async ctx => {
  2. if (ctx.path === '/wechatpay/notify') {
  3. // 验证通知数据的真实性和完整性
  4. // ...(此处省略验证逻辑)
  5. // 假设验证通过,处理订单逻辑
  6. const xmlData = ctx.request.body; // 假设已解析为XML对象
  7. // 根据xmlData中的信息更新订单状态
  8. // 回复微信服务器,表示通知已处理
  9. ctx.body = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
  10. ctx.type = 'text/xml';
  11. }
  12. });

注意:实际开发中,支付结果通知的验证逻辑较为复杂,包括签名验证等,这里仅作简化说明。

五、总结

通过本章节的学习,你应该已经掌握了如何在Koa3项目中安装并配置koa3-wechat模块以实现微信支付功能。这包括准备工作、安装模块、配置微信支付参数、实现支付功能等步骤。在实际开发中,你还需要根据业务需求调整和优化代码,确保支付流程的顺畅和安全。

此外,微信支付还提供了丰富的API接口和文档,支持多种支付场景和支付方式。建议深入阅读微信支付官方文档,以充分利用微信支付的功能和优势。


该分类下的相关小册推荐: