nodejs环境下接微信支付

前言:
最近在项目中需要接通微信支付接口,然后自己也是深受其害,一个前端小白写接口写的要哭了,也百度了很多东西,也查了很多的资料,后面发现的确是有点坑……然后就想着总结下开发中遇到的坑,让大家不要在踩我的坑了,前端小白,求轻喷

技术栈:
- nodejs
- ajax(项目封装好的)
- express

  1. 下载一些所需要依赖的包文件
    npm install md5
    npm install xml2js
  2. 在服务层里面写需要的请求接口,扔给前端进行请求
    router.post('/payGet', function (req, res) {
    1.引用一下会用到的外部依赖
    let MD5 = require('md5')
    let request = require('request')
    let xml2js = require('xml2js')
    2.配置微信需要的信息
    let url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
    let appid = xxxxxx(appid号)
    let mchId = xxxxx(商户号)

    let notifyUrl = 'http://xxxxxxx.com/api/users/receive'(支付成功微信返回的回调函数)
    let outTradeNo = req.body.outTradeNo(我们自己的订单号)
    let totalFee = parseFloat(req.body.money) * 100 (这个就是钱啦,但是要注意单位是分的)
    let body = '会费缴纳'(这个是我们要给这个商品的介绍)
    let nonceStr = new Date().getTime() (这个是需要一个随机字符串)
    let tradeType = 'NATIVE' (我个人理解是什么支付方式)

    注意:还有很多可以配置的参数,请到微信官方api查看,这里就不一一介绍了
    3.生成字符串和对应的签名(特别重要)
    let stringA = 'appid='+appid+'&body='+body+'&mch_id='+mchId+'&nonce_str='+nonceStr+'&notify_url='+notifyUrl+'&out_trade_no='+outTradeNo+'&spbill_create_ip='ip白名单'&total_fee='+totalFee+'&trade_type='+tradeType'
    let stringSignTemp = stringA + '&key=UvibcDS4s83vhZ5XVn4DK5Hnlkas0Yw0'
    let sign = MD5(stringSignTemp).toUpperCase()

    4.生成对应的xml并进行请求
    const formData = <xml><appid>${appid}</appid><body>${body}</body><mch_id>${mchId}</mch_id><nonce_str>${nonceStr}</nonce_str><notify_url>${notifyUrl}</notify_url><out_trade_no>${outTradeNo}</out_trade_no><spbill_create_ip>IP白名单</spbill_create_ip><total_fee>${totalFee}</total_fee><trade_type>NATIVE</trade_type><sign>${sign}</sign></xml>
    return request({
    url: url,
    method: 'POST',
    body: formData,
    header: 'Content-Type: text/html; charset=utf-8'(这里有一个坑,没设置有时候会报"签名错误")
    }, function (err, response, body) {
    if (!err && response.statusCode === 200) {
    xml2js.parseString(body, function (err, json) {
    if (!err) {
    var result = formMessage(json.xml)
    res.json(result)
    }
    })
    }
    })
    })

    5.处理xml的对应方法(参照别人写的方法)
    function formMessage(result) {
    var message = {}
    if (typeof result === 'object') {
    var keys = Object.keys(result)
    for (var i = 0; i < keys.length; i++) {
    var item = result[keys[i]]
    var key = keys[i]
    if (!(item instanceof Array) || item.length === 0) {
    continue
    }
    if (item.length === 1) {
    var val = item[0]
    if (typeof val === 'object') {
    message[key] = formMessage(val)
    } else {
    message[key] = (val || '').trim()
    }
    } else {
    message[key] = []
    for (var j = 0, k = item.length; j < k; j++) {
    message[key].push(formMessage(item[j]))
    }
    }
    }
    }
    return message
    }

    6.回调接口处理
    router.post('/receive', function (req) {
    var xml2js = require('xml2js')
    var xmlParser = new xml2js.Parser({ explicitArray: false, ignoreAttrs: true })
    xmlParser.parseString(req.body, function (err, result) {
    let data = JSON.parse(JSON.stringify(result)).xml.out_trade_no
    //把微信返回回来的对应数据存进数据库,我是以订单号是否存在的
    User.paylog(data, {'jsonData': req.body})
    })
    })

    注意:这里是要返回给微信一个收到信息的标示,但是我不知道怎么传递,有知道的大神麻烦告诉下我,这个东西我有点懵
  3. 前端操作(请求对应接口去生成对应需要支付的二维码)
    http.post('/api/users/payGet', {
    money: $('.payMoney').data('money'),
    outTradeNo: $('.payMoney').data('oid')
    })
    .then(c => {
    $('#code').qrcode({
    render: 'canvas',
    size: 150,
    text: JSON.parse(c).code_url
    })
    })
  4. 监控微信支付是否成功
    我的做法是写一个接口去调用查订单的操作,然后根据返回的状态判断是否支付成功或是其他状态再去进行对应的逻辑操作。这个接口我是写了一个定时器,每500ms就去进行一次请求,然后但支付成功后,我会清除这个定时器。
  5. 接微信签名一直报错的一些地方
    1.商户的密钥错了,我在开发过程中,就遇到这种情况,在微信的校验接口上面怎么测都没问题,但是我请求的接口一直报签名错误,后面看到别人也出现这个问题,就重新生成密钥,然后就可以了。。。
    2.还有一个就是签名的时候没有按照正确的ascii进行先后排序,开发的时候也遇到问题了,这个还真的不怎么会注意,但是不注意就过不了
    3.我们请求的时候没有在请求头加上utf-8,这个问题我没遇到过,因为一上来就写好了,但是你body介绍商品的时候肯定是会有中文的。

最后,感谢大家看我写的东西,我第一次写博客,也不知道该怎么写,只能把开发过程中遇到的一些问题写出来,写的也不是很好,我会继续努力的,谢谢

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
老规矩,先看本节效果图我们实现这个支付功能完全是借助小程序云开发实现的,不用搭建自己的服务器,不用买域名,不用备案域名,不用支持https。只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。核心代码就下面这些一,创建一个云开发小程序关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我之前的文章,或者看下我录制的视频:https://edu.csdn.net/course/play/9604/204528创建云开发小程序有几点注意的1,一定不要忘记在app.js里初始化云开发环境。2,创建完云函数后,一定要记得上传二, 创建支付的云函数1,创建云函数pay三,引入三方依赖tenpay我们这里引入三方依赖的目的,是创建我们支付时需要的一些参数。我们安装依赖是使用里npm 而npm必须安装node,关于如何安装node,我这里不做讲解,百度一下,网上一大堆。1,首先右键pay,然后选择在终端中打开2,我们使用npm来安装这个依赖。在命令行里执行 npm i tenpay安装完成后,我们的pay云函数会多出一个package.json 文件到这里我们的tenpay依赖就安装好了。四,编写云函数pay完整代码如下//云开发实现支付 const cloud = require('wx-server-sdk')cloud.init() //1,引入支付的三方依赖 const tenpay = require('tenpay'); //2,配置支付信息 const config = ;exports.main = async(event, context) => 一定要注意把appid,mchid,partnerKey换成你自己的。到这里我们获取小程序支付所需参数的云函数代码就编写完成了。不要忘记上传这个云函数。出现下图就代表上传成功五,写一个简单的页面,用来提交订单,调用pay云函数。这个页面很简单,1,自己随便编写一个订单号(这个订单号要大于6位)2,自己随便填写一个订单价(单位是分)3,点击按钮,调用pay云函数。获取支付所需参数。下图是官方支付api所需要的一些必须参数。下图是我们调用pay云函数获取的参数,和上图所需要的是不是一样。六,调用wx.requestPayment实现支付下图是官方的示例代码这里不在做具体讲解了,完整的可以看视频。实现效果1,调起支付键盘2,支付完成3,log日志,可以看出不同支付状态的回调上图是支付成功的回调,我们可以在支付成功回调时,改变订单支付状态。下图是支付失败的回调,下图是支付完成的状态。到这里我们就轻松的实现了微信小程序的支付功能了。是不是很简单啊,完整的讲解可以看视频。
### 回答1: 我可以为您提供一些关于使用Node.js来实现微信扫码支付的指南:首先,您需要在Node.js中安装微信SDK,这可以通过npm完成,然后您需要创建一个微信支付订单,并使用微信SDK调用微信支付API来实现扫码支付。在完成扫码支付后,您可以获取订单的状态信息,并进行相应的处理。 ### 回答2: 使用Node.js编写微信扫码支付需要以下步骤: 1. 首先,确保已安装Node.js环境和相关的npm包管理器。 2. 创建一个新的Node.js项目并初始化,在项目目录中运行`npm init`命令来生成`package.json`文件。 3. 在项目中使用npm下载微信支付的官方SDK,可以通过运行`npm install @vivaxy/wechat-pay`来安装。 4. 引入支付SDK并初始化微信支付: ```javascript const wechatPay = require('@vivaxy/wechat-pay'); // 初始化微信支付 const payment = new wechatPay.Payment({ appid: 'YOUR_APPID', mch_id: 'YOUR_MCHID', key: 'YOUR_KEY', // ... }); ``` 5. 创建Express应用并定义扫码支付的路由: ```javascript const express = require('express'); const app = express(); app.get('/pay', async (req, res) => { // 生成订单号和价格 const outTradeNo = 'ORDER_NUMBER'; const totalFee = 100; // 单位为分 // 构建扫码支付参数 const result = await payment.getNativePayParams({ outTradeNo, totalFee, body: 'ORDER_DESCRIPTION', // ... }); // 返回参数给前端 res.send(result); }); app.listen(3000, () => { console.log('Server running on port 3000'); }); ``` 6. 启动应用,并访问`http://localhost:3000/pay`获取扫码支付参数。 7. 在前端页面中使用生成的扫码支付参数调用微信支付接口,生成支付二维码供用户扫码支付。 8. 在后端根据微信异步通知或者查询支付结果的方式完成支付的验证。 以上是使用Node.js编写微信扫码支付的基本步骤,具体的实现和细节可能根据项目需求和微信支付官方文档的变动而有所不同。 ### 回答3: 使用Node.js编写微信扫码支付的流程如下: 1. 首先,在微信商户平台上注册并获取到商户号和密钥。商户号用于标识商户身份,密钥用于签名和加密通信数据。 2. 安装Node.js并使用npm命令行工具安装相关依赖包,包括express、request、crypto和xml2js等。 3. 创建一个Express应用程序,并设置路由来处理微信支付的相关请求。 4. 在服务器端生成一个唯一的订单号,将订单号和一些必要的信息(如订单金额、商品描述等)传递给微信支付接口。 5. 根据微信支付文档的要求,对订单信息进行签名。可以使用crypto模块中的HMAC-SHA256算法来创建签名。 6. 将订单信息和签名组装成XML格式的数据,并通过request库发送POST请求到微信支付统一下单接口。 7. 微信支付接口会返回一个预支付交易会话标识prepay_id。页面通过此标识生成一个二维码,供用户扫码支付。 8. 使用轮询的方式查询用户是否已完成支付。可以使用setInterval函数定时向微信查询支付状态。 9. 当用户支付成功后,微信服务器会发送一个支付成功的通知(异步通知)到服务器的回调地址。应在回调函数中验证通知的真实性。 10. 如果验证成功,修改订单状态,并返回给微信服务器一个成功的响应。微信服务器会将支付结果通知给用户的手机。 11. 可以创建一个页面用于显示支付结果,包括支付成功、支付失败等页面。 以上是使用Node.js编写微信扫码支付的大致流程。在具体实现过程中,还需要考虑到安全性、异常处理、用户体验等方面的问题。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值