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

相关推荐

  • 微信小程序开发中使用 Tailwind CSS 提高开发效率和代码的可维护性

    Tailwind CSS 是一个利用原子化 CSS 类来构建用户界面的框架,在微信小程序开发中使用 Tailwind CSS 可以提高开发效率和代码的可维护性。以下是在微信小程序中使用 Tailwind CSS 进行原子 CSS 开发的具体步骤: 安装 Tailwind CSS 配置 Tailwind CSS 引入样式:在微信小程序的全局样式文件app.wx…

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

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

    2024年12月2日
    00
  • python反爬-图像验证码与滑块验证码的跳过反selenium检测,动态ip等问题

    针对反爬措施,Python可以使用以下策略来跳过图像验证码与滑块验证码、反检测Selenium,以及通过动态IP规避限制。这是一个分步说明: 1. 图像验证码的跳过与破解1.1 图像验证码处理对于简单的图像验证码,可以使用 OCR 技术直接识别验证码内容。常用库包括:Tesseract-OCR: 一款开源 OCR 工具。Pytesseract: Tesser…

    2024年11月28日
    00
  • Docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像方法

    使用 Docker 快速部署 Nginx、Redis、MySQL、Tomcat 以及制作镜像 通过 Docker,开发者可以快速部署和管理各种服务。本文介绍如何快速使用 Docker 部署 Nginx、Redis、MySQL 和 Tomcat,以及如何制作自定义镜像。 1. Docker 基础准备 安装 Docker 如果还未安装 Docker,可按照以下步…

    2024年11月26日
    00
  • 微信小程序中,通过Node.js连接本地 MySQL 实现数据的增删改查

    在微信小程序中,通过Node.js连接本地 MySQL 实现数据的增删改查的过程,可以分为以下几个步骤: 1. 准备工作 必要工具: 2. 搭建 Node.js 后端服务 安装依赖 在 Node.js 项目中,使用 npm init 初始化项目,并安装以下依赖: express: 用于搭建 Web 服务。 mysql: 用于连接和操作 MySQL 数据库。 …

    2024年12月9日
    00
  • Redis中如何使用lua脚本redis与lua的相互调用方法

    在 Redis 中,Lua 脚本 提供了一种强大的方式来执行原子操作,可以在 Redis 服务器上直接执行 Lua 代码,从而避免了多次网络往返和保证操作的原子性。Redis 内置了对 Lua 脚本的支持,通过 EVAL 命令来执行脚本,EVALSHA 则用于执行已经加载到 Redis 服务器的脚本。1. Redis 与 Lua 脚本的基本交互1.1 基本的…

    2024年11月28日
    00
  • 小程序支持哪种类型的二维码 / 小程序识别GS1码

    二维码(Quick Response Code,快速响应码)是一种能够存储和传递信息的二维条形码,由黑白矩阵构成,能够在短时间内快速扫描并获取编码信息。二维码广泛应用于支付、商品追溯、信息传递等多个领域。下面是关于二维码的几个方面的详细解析,包括如何理解二维码、如何生成二维码、小程序支持的二维码类型、以及小程序如何识别 GS1 码。 1. 理解二维码 二维码…

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

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

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

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

    2024年11月23日
    00
  • Unity 项目升级URP/HDRP渲染管线时如何解决材质丢失问题

    在 Unity 项目中升级到 URP(通用渲染管线) 或 HDRP(高清渲染管线) 后,材质丢失是一个常见问题。这通常是因为原来的材质或着色器不兼容新渲染管线,需要手动调整或重新配置。以下是详细的解决方法: 1. 理解渲染管线的变化 2. 自动转换材质(官方工具) Unity 提供了从 Built-in 渲染管线迁移到 URP 或 HDRP 的官方工具,可以…

    2024年11月25日
    00
  • 在 Nuxt.js 应用中,webpack 的 compile 事件钩子构建过程

    在 Nuxt.js 应用中,webpack 的 compile 事件钩子通常用于在构建过程中处理或监听 Webpack 编译的状态。webpack 是 Nuxt.js 中的核心构建工具之一,而 Nuxt.js 本身是基于 Webpack 配置的,允许你通过扩展 Webpack 配置来进行自定义。要使用 webpack 的 compile 事件钩子,首先你需要…

    2024年11月29日
    00
  • 微信小程序设计和实现一个校园音乐应用的方法

    基于微信小程序设计和实现一个校园音乐平台,主要包括以下几个方面的设计与功能实现: 1. 需求分析 1.1 功能需求 1.2 非功能需求 2. 技术架构设计 2.1 前端:微信小程序 2.2 后端 2.3 技术栈 3. 数据库设计 表结构示例: 4. 功能实现 4.1 用户登录与注册 4.2 音乐播放 4.3 歌单与榜单 4.4 评论功能 5. 部署与优化 5…

    2024年11月26日
    00
  • 微信小程序配置onShareTimeline分享到朋友圈的问题

    在微信小程序中使用 onShareTimeline 来实现分享到朋友圈的功能时,可能会遇到开发者工具中的功能灰色不可用或真机调试时无法分享的问题。下面是一些可能的原因和解决方法: 1. 检查小程序的分享功能是否已经启用 确保你在小程序的 app.json 或者页面的 json 配置文件中正确配置了分享功能。 在 app.json 或页面的 json 文件中添…

    2024年11月24日
    00
  • C++ STL vector 类:动态数组的高效应用

    vector 是 C++ 标准库(STL)中最常用的容器之一,它提供了一个动态数组的实现,能够根据需要自动扩展或收缩。vector 是一个线性数据结构,具有高效的随机访问能力和动态扩展能力,广泛应用于需要频繁增删元素且对随机访问要求较高的场景。 1. vector 类简介 vector 是 C++ 标准模板库(STL)中提供的一种容器类,它类似于动态数组(d…

    2024年11月25日
    00
  • 在使用 PHP 抓取 HTTPS 资源时,会遇到一些常见问题

    在使用 PHP 抓取 HTTPS 资源时,可能会遇到一些常见问题。这些问题通常与 SSL 配置、证书验证或 PHP 设置相关。以下是常见问题及其解决方法的汇总: 1. SSL 证书验证失败问题描述当使用 file_get_contents、cURL 等方法访问 HTTPS 资源时,可能会遇到类似以下错误: 解决方法更新 cacert.pem 文件下载最新的根…

    2024年12月2日
    00

发表回复

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

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信