【Node.js】实现微信小程序在线支付功能

news/2024/7/20 2:03:38 标签: 微信小程序, node.js, 小程序

实战项目名称:小程序>微信小程序实现在线支付功能
- 文章结尾附上小程序>微信小程序码,扫码登录后即可体验!!

文章目录

  • 一、实战步骤
    • 1. 前期准备
    • 2. 添加`wechatpay-node-v3`和`fs`插件
    • 3. 预设微信下单的数据
    • 4. 将上一步骤的下单信息返回给前端
    • 5. 小程序前端接收数据 并发起支付
  • 二、完整源码
  • 三、在线体验


一、实战步骤

1. 前期准备

注意:对接微信支付功能,必须得先有微信支付的商户号,不然你是测试不了微信支付功能的。

  • 原因:
  1. 微信官网不提供微信支付的测试账号
  2. 微信支付一切都以商户号为基础,没有商户号一切等于0

需要用到的资料和账号

  • AppID(小程序ID),AppSecret(小程序密钥)
  • 商户号(mchid)
  • 微信支付证书源文件,微信支付API证书序列号
  • 商户号APIv3秘钥,用于微信支付成功后回调

2. 添加wechatpay-node-v3fs插件

  • 添加插件示例
// 添加插件示例
yarn add wechatpay-node-v3 fs
//或者
npm install wechatpay-node-v3 fs
  • 使用代码示例
// 使用插件示例
import WxPay from 'wechatpay-node-v3'
import fs from 'fs'  //读取

 async startPay(){
  const pay = new WxPay({
            appid: config.app.appid,      //换成你的小程序appid
            mchid: config.wxpay.mchid,    //换成商户号mchid
            publicKey: fs.readFileSync('./apiclient_cert.pem'), // 微信支付证书公钥
            privateKey: fs.readFileSync('./apiclient_key.pem'), // 微信支付证书秘钥
  });
 }

3. 预设微信下单的数据

注意: 微信支付成功的回调notify_url地址千万别写错,关于更多的回调通知,请点击访问该地址了解更多。

记得一定要检查APIv3秘钥有设定,不然就算你写一万行代码支付通知API也不起作用!!!

代码如下(示例):

const params = {
            description: name, // 订单描述
            out_trade_no: order_id, // 订单号,一般每次发起支付都要不一样,可使用随机数生成
            notify_url: 'https://cccccccc/notify_url', //支付成功后,微信会向该地址发起请求
            amount: {
                total: total, // 支付金额,单位为分
            },
            attach:`[{"amount":"${amount}"},{"remark":"${remark}" },{"product_id":"${product_id}"}]`,   //一些自定义的数据
            payer: {
                openid: openid, // 小程序>微信小程序用户的openid,一般需要前端发送过来
            },
            scene_info: {
                payer_client_ip: 'ip', // 支付者ip,这个不用写也没有问题
            },
        };

4. 将上一步骤的下单信息返回给前端

利用插件的transactions_jsapi方法进行处理

代码如下(示例):

 const result = await pay.transactions_jsapi(params);

5. 小程序前端接收数据 并发起支付

  • 订阅功能的实现在我的另一篇文章中,可以点击去看看如何实现,订阅消息通知。

代码如下(示例):

// this.message就是后端返回的数据,下面是示例的数据结构 

//{
//	appId: '******',
//    timeStamp: '******',
//    nonceStr: '******',
//    package: '******',
//    signType: 'RSA',
//    paySign: '******'
//}

wx.requestPayment({
					timeStamp: this.message.timeStamp,
					nonceStr: this.message.nonceStr,
					package: this.message.package,
					signType: this.message.signType,
					paySign: this.message.paySign,
					success(res) {
						uni.showToast({
							title: '支付成功'
						})
						that.close()
						// 支付成功后,可以添加一个订阅功能
						uni.requestSubscribeMessage({
							// 模板id:可以在微信公众平台 -> 功能 -> 订阅信息进行选择
							tmplIds: ['1FcVK9Vp86j7l8_mlLTepX4A6hwhRvW2uDDRr1tP5Io'],
							success: res => {
								console.log(res)
							},
							fail: e => {
								console.log(e)
							}
						})
					},
					fail(res) {
						uni.showToast({
							title: '支付失败',
							icon:'error'
						})
					}
				})

到了这一步,基本的微信支付功能就已经实现,下一期再讲解解密微信支付回调结果


二、完整源码

import fs from 'fs'
import WxPay from 'wechatpay-node-v3'

async startPay(_, { openid,name,total,amount,remark,product_id }) {
        const pay = new WxPay({
            appid: config.app.appid,
            mchid: config.wxpay.mchid,
            publicKey: fs.readFileSync('./apiclient_cert.pem'), // 公钥
            privateKey: fs.readFileSync('./apiclient_key.pem'), // 秘钥
        });
        // console.log(pay)

        // console.log(order_id)
        // let openid = 'xxxxx'; 可以自定义一个测试
        const params = {
            description: name, // 订单描述
            out_trade_no: order_id, // 订单号,一般每次发起支付都要不一样,可使用随机数生成
            notify_url: 'https://xxxxxxxx/notify_url',
            amount: {
                total: total, // 支付金额,单位为分
            },
            attach:`[{"amount":"${amount}"},{"remark":"${remark}" },{"product_id":"${product_id}"}]`,
            payer: {
                openid: openid, // 小程序>微信小程序用户的openid,一般需要前端发送过来
            },
            scene_info: {
                payer_client_ip: 'ip', // 支付者ip,这个不用写也没有问题
            },
        };
        // console.log(params)
        const result = await pay.transactions_jsapi(params);
        // console.log(result)
        //将数据返回给前端
      return result
    },


三、在线体验

  • 扫下方小程序>微信小程序码即可体验,支付后相关源码也是会正常发送到你留言的邮箱的。
    在这里插入图片描述

http://www.niftyadmin.cn/n/19991.html

相关文章

RabbitMQ——延迟队列

目录 一、延迟队列的应用场景 1. 场景:"订单下单成功后,15分钟未支付自动取消" ① 传统处理超时订单 ② RabbitMQ延时队列方案 二、延迟队列中的消息投递和消息消费 1.TTL 和 DLX ① TTL ② DLX和死信队列 ③ 延迟队列 ④ 开发步骤 …

跳槽、换房、不忘输出,与你分享我匆忙的 2022~

前些日子下班回家的瞬间,忽然想起去年春节还在跟老爸吐露职场的困境和对房子的无奈。哪曾想过了不到半年的时间竟全部解决,令我不禁感叹人生的捉摸不透。 让我姑且花点文字记录下,与你分享我这一年的匆匆忙忙~ 目录前瞻&#xf…

「设计模式」享元模式

「设计模式」享元模式 文章目录「设计模式」享元模式[toc]一、概述二、结构三、案例实现四、优缺点五、JDK中的享元模式六、小结一、概述 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源&#x…

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容,可私信我。 开发环境:VS2013sql2012 C/S架构 一、门诊系统: 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能,包括门诊安排的管理,号表的生成及维护,门诊预约管理和挂号处理&…

企业邮件讲解

企业邮件讲解 1、邮件的概述 电子邮件服务器是处理邮件交换的软硬件设施的总称,包括电子邮件程序、电子邮箱等。为用户提供基于 E-mail 服务的电子邮件系统,人们通过访问服务器实现邮件的交换; 常见的邮件服务器 服务器端: Se…

18、Mysql高级之日志

18、Mysql高级之日志 文章目录18、Mysql高级之日志1、错误日志2、二进制日志2.1、概述2.2、日志格式2.3、日志读取2.4、日志删除3、查询日志4、慢查询日志4.1、文件位置和格式4.2、日志的读取在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的…

腾讯云轻量应用服务器使用 Cloudreve 应用镜像搭建个人私有云盘!

Cloudreve 是一款开源的网盘软件,支持服务器本机及腾讯云对象存储 COS 等多种存储方式,提供离线下载、拖拽上传、在线预览等功能,能够帮助您快速搭建个人使用或多人共享的云盘系统。该镜像基于 CentOS 8.2 64位操作系统,已集成宝塔…

【Python基础】列表 元组 集合 字典

常用方法 序号方法功能对象 列表基本操作 1增加lst.append(x)将x追加至列表尾部,长度加1:len(s)len(s)1列表lst.insert(index,x)在列表index位置插入x列表lst1.extend(lst2)将列表L中所有元素追加至列表尾部:len(lst1)len(lst1)len(lst2)用于…