微信支付用的V2版本

微信支付说明文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2    参数详细说明请自行查看

// https://github.com/klover2/wechatpay-node-v3-ts/blob/master/index.ts
 // https://blog.csdn.net/blackhost/article/details/100703911

微信支付2.0还是xml传输数据,用到了解析模块xml2js

接下来是请求微信支付,付款到零钱的主要代码,可以自行创建一个wxpay.js,将下面代码贴进去,

商户appid需要特别说明一下。如果你要是付款给公众号下的用户,就要填写公众号appid,付款给小程序下的用户,就要填写小程序的appid

我参与的项目,商户,小程序和公众号都有绑定,所以会稍稍复杂一点,当时我测试用的是小程序appid和小程序下的用户openid,大意了,应该是公众号的

const fs = require('fs')
const path = require('path')
const xml2js = require('xml2js')
const request = require('request')
const payUtil = require('./payUtil')
/**
* 微信-企业付款到零钱
*
* 注意的点是,企业付款到零钱,用的是公众号下的用户openid,所以appid要填成公众号的,保持一致,不能填小程序的
*/
exports.transfers = async (map) => {
let mapInfo = {}
// 商户appid
// 这里的商户appid是公众号appid
mapInfo.mch_appid = ''
// 商户id
mapInfo.mchid = ''
// 商户密钥
mapInfo.mchkey = ''
// 随机字符串
mapInfo.nonce_str = payUtil.getRnd32()
// 商户内部流水号
mapInfo.partner_trade_no = map.recordId
// 用户的openid
mapInfo.openid = map.openid
// 是否需要校验名字
mapInfo.check_name = 'NO_CHECK'
// 金额,单为是分
mapInfo.amount = map.amount * 100
// 描述
mapInfo.desc = '企业付款到零钱'
// ip,该IP同在商户平台设置的IP白名单中的IP没有关联,该IP可传用户端或者服务端的IP。
mapInfo.spbill_create_ip = ''
// 签名
let sign = wxpay.transfersSign(mapInfo) // 拼接xm字符串
let formData = "<xml>";
formData += "<mch_appid>" + mapInfo.mch_appid + "</mch_appid>";
formData += "<mchid>" + mapInfo.mchid + "</mchid>";
formData += "<nonce_str>" + mapInfo.nonce_str + "</nonce_str>";
formData += "<partner_trade_no>" + mapInfo.partner_trade_no + "</partner_trade_no>";
formData += "<openid>" + mapInfo.openid + "</openid>";
formData += "<check_name>" + mapInfo.check_name + "</check_name>";
formData += "<amount>" + mapInfo.amount + "</amount>";
formData += "<desc>" + mapInfo.desc + "</desc>";
formData += "<spbill_create_ip>" + mapInfo.spbill_create_ip + "</spbill_create_ip>";
formData += "<sign>" + sign + "</sign>";
formData += "</xml>";
console.log(formData)   // 请求路径
let url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'
return new Promise((resolve, reject) => {
request({
url: url,
       // 需要证书
agentOptions: {
cert: fs.readFileSync(path.resolve(`./public/config/cert/${payConfig.wx_cert}`)),
key: fs.readFileSync(path.resolve(`./public/config/cert/${payConfig.wx_key}`))
},
method: 'post',
body: formData,
}, function (err, response, body) {
if (!err && response.statusCode == 200) { // 创建一个解析xml的对象
let parser = new xml2js.Parser({
trim: true,
explicitArray: false,
explicitRoot: false
}); //解析签名结果xml转json
parser.parseString(body, (err, res) => {
console.log(res)
let result = {} // 判断return_code 为fail的时候,的错误信息
if (res.return_code == 'FAIL') {
result.msg = res.return_msg
reject(result)
} // return_code是success 的话, 只代表业务已受理, 并不代表已成功
// result_code是success 的话, 才算是付款成功, fail的话,返回错误信息
if (res.return_code == 'SUCCESS' && res.result_code == 'FAIL') {
result.msg = res.err_code_des
reject(result)
} else {
result.msg = ''
resolve(result)
}
})
}
reject(err)
})
})
}

在其他地方调用付款到零钱transfers方法

// 微信支付方法路径自行修改成自己的
const { transfers } = require('./wxpay')
const { createOrderNumber } = require('./payUtil') let map = {
// 金额
amount: 1,
// 备注
desc: '提现',
// 用户openid
openid: '',
// 系统内部流水号
recordId: createOrderNumber(),
}
try {
let result = await transfers(map)
ctx.body = {
code: 200,
msg: '提现到零钱成功,提醒用户稍后自行查看'
}
} catch (err) {
console.log(err)
// 捕捉请求微信支付的错误
ctx.body = {
code: 500,
msg: err.msg
}
return
}

下面贴一些工具方法,自行创建一个payUtil.js,将下面代码贴入即可

// 生成随机随机32 位  字符串
exports.getRnd32 = () => {
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
let result = ''
for (let i = 0; i < 32; i++) {
let rnd = Math.floor(Math.random() * str.length)
result += str[rnd]
}
return result
} // 生成时间戳
exports.createTimeStamp = () => {
return parseInt(new Date().getTime() / 1000) + '';
} // 生成订单编号
exports.createOrderNumber = () => {
let str = ''
for (let i = 0; i < 10; i++) {
let num = Math.floor(Math.random() * 10)
str += num
}
let time = new Date()
let year = time.getFullYear().toString()
let month = time.getMonth().toString() + 1
let day = time.getDate().toString()
let hours = time.getHours().toString()
let minutes = time.getMinutes().toString()
let seconds = time.getSeconds().toString()
let mill = time.getMilliseconds().toString()
str += year += month += day += hours += minutes += seconds += mill
return str;
} // 按照ascll码排序
function raw(args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function (key) {
newArgs[key] = args[key];
});
var string = '';
for (var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
} /**
* 企业付款到零钱签名
*/
exports.transfersSign = (map) => {
let ret = {
mch_appid: map.mch_appid,
mchid: map.mchid,
nonce_str: map.nonce_str,
partner_trade_no: map.partner_trade_no,
openid: map.openid,
check_name: map.check_name,
amount: map.amount,
desc: map.desc,
spbill_create_ip: map.spbill_create_ip,
}
console.log(ret)
var string = raw(ret);
var key = map.mchkey;
string = string + '&key=' + key;
var crypto = require('crypto');
return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
}

node-koa2 微信支付,企业付款到零钱的更多相关文章

  1. php微信支付企业付款到零钱报错call faild, errorCode:58

    这个报错一般是自己证书目录不是绝对目录,正确的目录结构应该是网站根目录下的:“C:\PHPWAMP_IN1\wwwroot\XXXX\XXXX.pem”.          还要注意的是文件夹命名一定 ...

  2. PHP微信商户支付 - 企业付款到零钱功能(即提现)技术资料汇总

    PHP实现微信开发中提现功能(企业付款到用户零钱) 一.实现该功能目的 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现: 官方文档:https:/ ...

  3. PHP实现微信商户支付企业付款到零钱功能代码实例

    本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下 微信支付开发文档 一.开通条件 企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付 ...

  4. PHP微信商户支付企业付款到零钱功能

    一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...

  5. 微信分账功能与微信支付企业付款相关内容详解(payjs版)

    PAYJS开通微信分账功能以来,有很多同学咨询相关情况.很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能.这里就介绍下微信分账的具体相关内容,可以完美解决问题. 一.什么是微信分账? ...

  6. php 微信支付企业付款

    1.所需参数 字段名 变量名 必填 示例值 类型 描述 公众账号appid mch_appid 是 wx8888888888888888 String 公众号的appId 商户号 mchid 是 19 ...

  7. JAVA微信支付——企业付款(企业向微信用户个人付款、转账)

    本地开发环境支付回调调试方法可以参考:https://www.cnblogs.com/pxblog/p/11623053.html 需要自行引入相关依赖 官方文档地址:https://pay.weix ...

  8. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)

    这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...

  9. PHP实现微信提现(企业付款到零钱)

    怎么开通企业付款到零钱? 有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5. 即可进入该功能页面,进行开通,不过要 ...

  10. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...

随机推荐

  1. Autodesk Maya无法打开 refrence file 解决办法

    删除预设 预设的位置在: 我的文档/maya/version/ prefs 备注: 我的文档/maya/version/ 无法确定是不是该路径下的所有文件夹都能删除,所以只剪切了 prefs 文件夹出 ...

  2. 五行八字在线排盘api接口免费版_json数据格式奥顺互联内部接口

    「八字在线排盘」谁都想知道自己一生中的事业.财运.婚姻.功名.健康.性格.流年运程将是怎样,通过八字排盘,四柱八字排盘会有你想知道的答案.一个人出生的年月时天干地支的排列组合(即八字)就是命.不过仅凭 ...

  3. 高通USB overview

    一,Dedicated Connectivity Ports (USB) 1,USB 3.1 Type-C with DisplayPort 2,Support USB3-DisplayPort Co ...

  4. USB协议详解第5讲(USB描述符-接口描述符)

    1.USB描述符 USB描述符有设备描述符.标准配置描述符.接口描述符.端点描述符.字符串描述符,HID设备有HID描述符.报告描述符和物理描述符.今天主要是学习USB接口描述符的组成. 2.接口描述 ...

  5. Java实用小工具系列1---使用StringUtils分割字符串

    经常有这种情况,需要将逗号分割的字符串,比如:aaa, bbb ,ccc,但往往是人工输入的,难免会有多空格逗号情况,比如:aaa, bbb , ccc, ,,这种情况使用split会解析出不正常的结 ...

  6. MySQL故障诊断常用方法手册(含脚本、案例)

    当你在使用MySQL数据库时,突然遇到故障,你是否会感到迷茫? ● 数据库响应变慢.SQL慢.数据库插入出现延时-- ● 表不见了.日志出现多个断连记录-- ● 非法断电造成MySQL启动报错.同步复 ...

  7. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺

    7月份的国产数据库流行度排行榜已经揭晓.本期榜单展示的136个数据库中,近三分之二实现了评分增长.笔者认为这与6月份中国信通院发布第十二批大数据产品能力评测结果有关,65家企业的120款产品通过了本次 ...

  8. 墨天轮沙龙 | Proxima 刘方:阿里巴巴大规模向量检索实时服务化引擎 Proxima SE

    导读 随着 AI 技术的广泛应用,以及数据规模的不断增长,向量检索也逐渐成了 AI 技术链路中不可或缺的一环. 在11月16日举办的[墨天轮数据库沙龙-向量数据库专场]邀请到阿里巴巴高级技术专家刘方, ...

  9. iOS上架App Store使用小结

    1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...

  10. day08-数据类型拓展及面试题

    数据类型拓展及面试题 整数拓展----进制   //整数拓展----进制         int i=10;//十进制   不能以0开头,0~9         int i1=0b11;//二进制:0 ...