实现微信支付提现api接口教程

微信支付的提现功能,通常是通过调用 企业付款到零钱 API企业付款到银行卡 API 来实现的。以下是如何使用微信支付提现 API 的详细教程,包括其前置条件、接口调用以及注意事项。

1. 准备工作

1.1. 开通微信支付商户号

  1. 登录 微信支付商户平台
  2. 确保你的商户号已开通 企业付款到零钱企业付款到银行卡 功能。如果没有开通,可以联系微信支付客服申请开通。

1.2. 配置证书

  • 提现 API 调用需要使用商户的 API 证书 进行身份认证。
  • 登录微信支付商户后台,下载以下证书:
    • 商户证书(apiclient_cert.pem)
    • 私钥文件(apiclient_key.pem)
    • CA 证书(rootca.pem)

将这些文件保存在你的服务器上,用于发起 HTTPS 请求。

1.3. 获取 API 密钥

  • 在微信支付商户后台,设置并记住 API 密钥(一个 32 字符的字符串),用于生成签名。

2. 企业付款到零钱接口

2.1. 接口说明

  • URL:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
  • 功能:将商户号的资金提现到指定用户的微信零钱。

2.2. 参数说明

参数是否必填类型说明
mch_appidString商户账号对应的小程序或公众号的 AppID
mchidString商户号
nonce_strString随机字符串
signString签名
partner_trade_noString商户订单号(唯一)
openidString用户的 OpenID
check_nameString校验用户姓名选项(NO_CHECKFORCE_CHECK
amountInt转账金额(单位:分)
descString转账描述信息
spbill_create_ipString调用接口的服务器 IP

2.3. 调用示例

以下是基于 Node.js 的调用示例:

const fs = require('fs');
const https = require('https');
const crypto = require('crypto');
const { parseString } = require('xml2js');

function generateNonceStr() {
  return Math.random().toString(36).substr(2, 15);
}

function generateSign(params, key) {
  const stringA = Object.keys(params)
    .sort()
    .map((k) => `${k}=${params[k]}`)
    .join('&');
  const stringSignTemp = `${stringA}&key=${key}`;
  return crypto.createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase();
}

function postXml(url, xml, options) {
  return new Promise((resolve, reject) => {
    const req = https.request(url, options, (res) => {
      let data = '';
      res.on('data', (chunk) => (data += chunk));
      res.on('end', () => {
        parseString(data, { explicitArray: false }, (err, result) => {
          if (err) reject(err);
          resolve(result.xml);
        });
      });
    });
    req.on('error', (e) => reject(e));
    req.write(xml);
    req.end();
  });
}

// 配置参数
const url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
const mch_appid = 'YOUR_APPID';
const mchid = 'YOUR_MCHID';
const key = 'YOUR_API_KEY';
const certPath = '/path/to/apiclient_cert.pem';
const keyPath = '/path/to/apiclient_key.pem';

const params = {
  mch_appid,
  mchid,
  nonce_str: generateNonceStr(),
  partner_trade_no: `ORDER${Date.now()}`,
  openid: 'USER_OPENID',
  check_name: 'NO_CHECK',
  amount: 100, // 1元 = 100分
  desc: '提现测试',
  spbill_create_ip: 'SERVER_IP',
};

params.sign = generateSign(params, key);

// 构造 XML 数据
const xmlData = `
<xml>
  ${Object.keys(params)
    .map((key) => `<${key}>${params[key]}</${key}>`)
    .join('')}
</xml>`;

// HTTPS 请求配置
const options = {
  method: 'POST',
  key: fs.readFileSync(keyPath),
  cert: fs.readFileSync(certPath),
  ca: fs.readFileSync('/path/to/rootca.pem'),
  headers: {
    'Content-Type': 'text/xml',
  },
};

// 发起请求
postXml(url, xmlData, options)
  .then((response) => {
    console.log('微信返回数据:', response);
  })
  .catch((err) => {
    console.error('请求失败:', err);
  });

3. 企业付款到银行卡接口

3.1. 接口说明

  • URL:https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank
  • 功能:将商户号的资金提现到指定用户的银行卡。

3.2. 参数补充

相比零钱接口,提现到银行卡需要提供以下额外信息:

  • 银行账号:加密后的银行卡号。
  • 开户人姓名:加密后的姓名。
  • 开户行编号:具体银行的编号(微信支付文档提供编号列表)。

3.3. RSA 加密银行卡信息

银行卡号和开户人姓名需要通过微信支付提供的 RSA 公钥加密后发送。

加密示例:

const crypto = require('crypto');
const fs = require('fs');

function encryptWithPublicKey(data, publicKeyPath) {
  const publicKey = fs.readFileSync(publicKeyPath, 'utf8');
  return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64');
}

// 示例
const encryptedAccount = encryptWithPublicKey('银行卡号', '/path/to/wechat_public_key.pem');

4. 注意事项

  1. 资金流转限制
    • 确保商户号余额充足,且提现金额不超过商户号可用余额。
  2. 提现手续费
    • 微信支付可能会收取一定比例的手续费,具体费率可以在商户后台查询。
  3. 敏感信息加密
    • 银行卡号和姓名等敏感信息需要加密处理,使用微信提供的公钥进行 RSA 加密。
  4. 重复请求
    • 微信支付可能会因网络问题重复发送结果通知。确保商户订单号(partner_trade_no)是唯一的,避免重复处理。
  5. 安全性
    • 确保 API 密钥和证书文件的安全,避免泄露。

通过调用微信支付的提现 API,可以实现资金从商户号提现到用户的零钱或银行卡。根据需求选择合适的提现方式,并按照文档规范实现调用逻辑。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4504

Like (0)
Previous 2024年11月24日 下午7:06
Next 2024年11月24日 下午7:35

相关推荐

  • 使用 HBuilderX 开发 uni-app 项目通过以下步骤实现微信小程序中获取用户头像、昵称、授权登录以及用户手机号

    在使用 HBuilderX 开发 uni-app 项目时,可以通过以下步骤实现微信小程序中获取用户头像、昵称、授权登录以及用户手机号。 1. 配置微信小程序的权限 在微信小程序后台中,确保已经启用了相关的功能模块,如: 同时在 app.json 中配置授权弹窗的提示: 2. 授权获取用户头像、昵称 从微信小程序 2.10.4 版本开始,推荐使用 wx.get…

    2024年12月11日
    00
  • 理解 HTML、HTML5 和 “H5” 区别的重要性

    HTML & HTML5 & H5 的区别在构建现代网页时,理解 HTML、HTML5 和 “H5” 的区别是非常重要的。以下是它们的概念和主要区别: 1. HTML(超文本标记语言)定义HTML 是 HyperText Markup Language 的缩写,即超文本标记语言,用于定义网页内容的结构和含义。特性提供基…

    2024年12月2日
    00
  • JavaScript 前端开发:从入门到精通的方法

    JavaScript 是前端开发的核心语言,它与 HTML 和 CSS 一起构成了 Web 开发的基础。要从入门到精通 JavaScript 前端开发,需要系统化的学习方法和实践。以下是详细的方法和步骤。 1. 理解 JavaScript 的基础 1.1 学习基础语法 1.2 理解函数 箭头函数: 1.3 掌握 DOM 操作 修改内容: 监听事件: 1.4 …

    2024年11月22日
    00
  • 在微信公众号开发中获取 access_token 调用微信服务器端接口

    在微信公众号开发中,获取 access_token 是调用微信服务器端接口的第一步。access_token 是接口调用的凭据,可以通过微信公众号的接口调用。 以下是获取 access_token 的步骤和代码示例: 1. 获取 Access Token 的接口 调用微信服务器接口获取 access_token: 接口地址: 返回示例: access_tok…

    2024年12月3日
    00
  • C语言内存函数动态分配内存、释放内存和对内存内容进行操作。

    C语言中的内存函数主要用于动态分配内存、释放内存和对内存内容进行操作。这些函数都在标准库 <stdlib.h> 和 <string.h> 中定义。以下是 C 语言常用的内存函数及其详细说明: 1. 动态内存管理函数 这些函数位于 <stdlib.h> 中,用于在运行时分配和释放内存。 1.1 malloc 示例: 功能:分配一块指定大…

    2024年11月22日
    00
  • Android 解决 “Module was compiled with an incompatible version of Kotlin“

    “Module was compiled with an incompatible version of Kotlin” 错误通常出现在 Android 开发中,因为模块的 Kotlin 编译器版本与项目中的 Kotlin 编译器版本不匹配。以下是解决此问题的方法: 1. 检查 Kotlin 插件版本步骤:打开 Android Studio。点击顶部菜单的 …

    2024年11月26日
    00
  • Android Studio 2024 版本安装 SDK、Gradle环境配置

    在 Android Studio 2024 中,配置 SDK 和 Gradle 环境是非常重要的步骤,确保开发环境能正确运行、编译和构建你的 Android 项目。以下是详细的安装和配置步骤。 1. 安装 Android Studio 2024 首先,你需要安装 Android Studio 2024。你可以从 Android Studio 官网 下载最新版…

    2024年11月23日
    00
  • 使用uni-app微信小程序生成邀请码邀请好友注册

    在 uni-app 中实现微信小程序的邀请功能,可以通过生成邀请码来邀请好友注册。这个过程通常包括生成唯一的邀请码、分享链接生成二维码,以及接收邀请并使用邀请码完成注册等步骤。下面详细介绍如何在 uni-app 中实现这个功能。 1. 设计邀请码生成规则 首先,需要设计邀请码的生成规则。一般来说,邀请码是一个随机生成的字符串或者是与用户ID相关联的字符串。为…

    2024年11月23日
    00
  • 在 Android 中 Matrix 实现图像的缩放和裁剪将 Glide 图像从 fitCenter 转换为 centerCrop

    在 Android 中,Matrix 可以用来实现图像的缩放和裁剪逻辑。要将 Glide 图像从 fitCenter 转换为 centerCrop,需要通过 Matrix 计算变换逻辑。以下是使用 Kotlin 实现的方法:实现步骤计算目标变换矩阵:根据目标宽高比,判断是否需要横向或纵向裁剪。设置 Matrix:使用 Matrix 执行缩放和平移操作。应用到…

    2024年12月3日
    00
  • 在 Go 语言中,对文件的基础操作介绍

    在 Go 语言中,文件操作是基础技能之一,主要通过 os、io 和 io/ioutil 等标准库完成。以下是对文件操作的全面介绍,帮助你在 Go 语言的“成神之路”上迈出关键一步! 1. 创建文件使用 os.Create 创建文件,如果文件已存在会被清空。示例代码 2. 打开文件使用 os.Open 打开文件(只读模式),使用 os.OpenFile 可以指…

    2024年12月2日
    00
  • C语言中的操作符(Operators)对数据进行运算的符号

    C语言中的操作符(Operators)是对数据进行运算的符号,分为多种类型,支持从基本算术到复杂的逻辑操作。以下是C语言操作符的详解: 1. 算术操作符(Arithmetic Operators) 用于执行基本数学运算: 示例: 2. 关系操作符(Relational Operators) 用于比较两个值,结果为布尔值: 示例: 3. 逻辑操作符(Logic…

    2024年11月22日
    00
  • 在使用 HBase 时,遇到 Unable to find region for 错误问题

    在使用 HBase 时,遇到 Unable to find region for 错误通常是由于以下几个原因引起的:HBase RegionServer 未启动或无法连接表的 Region 分布信息不一致Zookeeper 配置问题客户端连接配置问题HBase 版本不兼容下面是一些常见的原因和解决办法:1. 确保 HBase 服务正常运行首先检查你的 HBa…

    2024年11月29日
    00
  • 微信小程序错误提示 does not have a method “onShareTimeline”

    当在微信小程序中尝试实现分享到朋友圈功能时,如果你在控制台遇到 does not have a method “onShareTimeline” 错误,这通常是由于以下原因之一: 1. 检查基础库版本 onShareTimeline 是在小程序基础库 2.11.3 及以上版本支持的。如果当前开发者工具的基础库版本较低,会导致方法无法找到。 解决方法: 2. …

    2024年11月26日
    00
  • 如何使用uni-app-qrcode插件生成二维码?

    以下是使用uni-app-qrcode插件生成二维码的详细步骤: 安装插件 或者使用yarn进行安装: 引入插件 使用插件生成二维码 上述代码中,首先定义了要编码到二维码中的内容content和生成二维码的配置选项options,然后通过this.$refs.qrcodeCanvas获取页面中的canvas元素,最后调用QRCode.make方法生成二维码。…

    2024年12月22日
    00
  • 微信小程序使用 map 组件实现拖动地图并获取当前地图中心的经纬度

    在微信小程序中,使用 map 组件可以轻松实现拖动地图并获取当前地图中心的经纬度。以下是实现步骤和代码示例: 实现思路 代码实现 1. 页面 WXML 添加 map 组件并设置属性。 2. 页面 WXSS 定义地图样式和中心点标记样式。 3. 页面 JS 初始化地图中心点的经纬度,并监听地图拖动。 4. 中心点图标 将一个中心标记图标放置在地图中间。可以在小…

    2024年11月25日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信