【Node.js】实现微信小程序在线支付功能
创始人
2024-04-30 08:58:47

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

文章目录

  • 一、实战步骤
    • 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,      //换成你的小程序appidmchid: config.wxpay.mchid,    //换成商户号mchidpublicKey: 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},

三、在线体验

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

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...