实现微信支付提现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

相关推荐

  • C语言内存函数动态分配内存、释放内存和对内存内容进行操作。

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

    2024年11月22日
    00
  • Solving the Makefile Missing Separator Stop Error in VSCode ……

    在 VSCode 中处理 Makefile 的 missing separator. Stop 错误,通常是因为 Makefile 中的命令行前没有用Tab 键缩进,而使用了空格。Makefile 规定,配方(recipe)中的每个命令行必须以Tab 键开头,而不是空格。 解决方法1. 检查 Makefile 的缩进打开报错的 Makefile 文件。找到出…

    2024年12月2日
    00
  • Jeewx-Api 1.3.1 发布:更简易的微信小程序开发 API 降低了开发成本

    Jeewx-Api 1.3.1 发布:更简易的微信小程序开发 API Jeewx-Api 是一款开源的微信开发 SDK,支持微信公众号、小程序、企业微信等全场景开发。1.3.1 版本针对小程序功能做了全面优化,为开发者提供了更简洁易用的 API,降低了开发成本。 1. 新版本亮点 支持微信小程序功能 更简洁的 API 支持企业微信与公众号 2. Jeewx-…

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

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

    2024年11月23日
    00
  • 在 WPF 中使用 Vlc.DotNet 和 LibVLCSharp.WPF 两种库来进行 VLC 的二次开发

    在 WPF 中使用 Vlc.DotNet 和 LibVLCSharp.WPF 两种库来进行 VLC 的二次开发,可以实现丰富的视频播放功能,比如播放本地视频、流媒体、控制播放、获取视频信息等功能。以下是对两者的介绍及开发步骤。 一、Vlc.DotNet 和 LibVLCSharp 的对比 特性 Vlc.DotNet LibVLCSharp.WPF 开发活跃度…

    2024年12月3日
    00
  • 安卓用微信作为第三方登录,登录授权界面调用

    在 Android 应用中实现微信第三方登录,可以通过调用微信提供的开放平台 SDK 来完成。以下是实现微信登录授权界面的完整步骤: 1. 准备工作 注册微信开放平台应用 下载微信 SDK 2. 项目配置 引入微信 SDK 将 SDK 文件添加到项目的 libs 和 jniLibs 目录下: 在 build.gradle 中添加依赖: 配置权限 在 Andr…

    2024年12月3日
    00
  • 将 Unity 项目打包发布到微信小程序平台的方法

    将 Unity 项目打包发布到微信小程序平台需要用到 Unity 的 WeChat Mini Game SDK 和微信开发者工具。以下是详细的操作步骤: 1. 准备工作 1.1 安装工具 1.2 注册微信小程序账号 2. 项目设置 2.1 导入 SDK 2.2 配置 WebGL 设置 在 Unity 中完成 WebGL 平台配置: 2.3 添加 WeChat…

    2024年11月24日
    00
  • 使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错

    在使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错,通常是因为 CLion 默认并不支持8051的特殊语法和寄存器定义方式。sbit 是 C51 编译器中的一个关键字,用来将一个单独的位(bit)映射到特定的硬件寄存器或端口引脚。常见的报错及解决方法sbit 语法问题: CLion 本身不支持 C51 特有的语法,sb…

    2024年11月27日
    00
  • java中使用 Arrays.asList()新增报错问题解决方法

    Arrays.asList() 返回的是一个固定大小的列表。如果你尝试使用该列表进行添加、删除等修改操作,会抛出 UnsupportedOperationException 异常。这是因为 Arrays.asList() 返回的列表背后是一个数组,它的大小是固定的,不能进行动态修改。解决方法使用 ArrayList 包装 Arrays.asList() 的结…

    2024年12月2日
    00
  • 使用 Webpack 5 优化构建减少生成文件的体积提升前端性能

    在使用 Webpack 5 时,优化构建以减少生成文件的体积是提升前端性能的重要一步。以下是一些常见的优化方法和策略: 1. 开启生产模式 确保构建时使用生产模式,Webpack 会自动应用多种优化(如代码压缩、Tree Shaking 等): 或在配置文件中明确设置: 2. 启用 Tree Shaking Tree Shaking 是 Webpack 内置…

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

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

    2024年11月25日
    00
  • uni-app 一个使用 Vue.js 开发所有前端应用的框架跨端开发的优势

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信 / 支付宝 / 百度 / 头条 / QQ / 钉钉)等多个平台,其跨端开发具有以下优势: 开发效率高 跨平台兼容性好 性能优化 生态丰富 学习成本低

    2024年12月22日
    00
  • Android Studio 国内镜像,加速下载和构建过程

    在国内使用 Android Studio 时,由于访问 Google 的官方资源(如 Gradle 和 SDK)速度较慢甚至无法访问,可以通过配置国内镜像源来加速下载和构建过程。以下是详细配置步骤: 1. 配置 Gradle 国内镜像 Gradle 是 Android Studio 构建项目的重要工具,其依赖库通常托管在 Google Maven 和 JCe…

    2024年11月25日
    00
  • 使用 Python Selenium 控制 Chrome 浏览器 进行自动化操作

    使用 Python Selenium 控制 Chrome 浏览器 进行自动化操作是 Web 自动化测试和爬虫的常用方法之一。以下是一个完整的入门教程,包括如何安装、配置以及一些示例代码。 1. 安装所需环境 1.1 安装 Selenium 使用 pip 安装 Selenium: 1.2 下载 ChromeDriver 1.3 配置 ChromeDriver …

    2024年11月25日
    00
  • 在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式

    在 .NET 环境下,使用 OpenTK 为 SkiaSharp 提供 OpenGL 支持是一个常见的方式,可以高效地进行 2D 图形渲染。下面是具体如何实现和一些关键概念的介绍: 背景知识 实现步骤 1. 添加必要的 NuGet 包 确保你的项目安装了以下 NuGet 包: 2. 创建 OpenGL 上下文 使用 OpenTK 创建一个 OpenGL 上下…

    2024年12月8日
    00

发表回复

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

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信