微信支付v3——批量转账到零钱(提现)

进入正题之前先吐槽一下微信官方文档吧!一开始在官网上下载了微信支付版本V3的Demo,下载下来基本上难以投入使用,要学会使用的话,就要去看源码,看文档,稍微错过一点就会有一大堆的坑等着你跳,相比之下,阿里的文档就简单易懂,而且官方的文档下载下来之后,稍微改下参数就可以run!!

正文:

批量转账到零钱(服务商)的接入示例:
(微信文档地址:开发文档-微信支付批量转账到零钱)
微信支付V3版本,微信SDK,内部封装了部分方法(微信支付API v3的Apache HttpClient扩展,实现了请求签名的生成和应答签名的验证。)
第一步:在项目中引入Maven

<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.4.8</version>
</dependency>

第二步:构造微信接口通讯Client,构造隐私数据加密公钥,每次调用微信V3的接口都需要用Client来发起,敏感数据需通过平台公钥加密。

package cn.schoolgroup.config.until;import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.core.io.ClassPathResource;import java.io.IOException;
import java.io.InputStream;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Arrays;/*** @Author lulu* @Date 2022/09/07*/
public class WeChatClient {/*** 微信通讯client* @return CloseableHttpClient * 作者的文件都放在resour文件下的*/public static CloseableHttpClient getClient() throws IOException {/**商户私钥文件*/ClassPathResource classPathResource = new ClassPathResource("/cert/apiclient_key.pem");InputStream mchPrivateKeyInputStream = classPathResource.getInputStream();/**微信平台公钥文件*/ClassPathResource classPathResource1 = new ClassPathResource("/cert/wechatpay_64124ADAF002CDEEBA0A58215D8572D270F2A854.pem");InputStream platformKeyInputStream = classPathResource1.getInputStream();PrivateKey mchPrivateKey = PemUtil.loadPrivateKey(mchPrivateKeyInputStream);WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant("自己的商户号", "自己的商户证书序列号", mchPrivateKey).withWechatPay(Arrays.asList(PemUtil.loadCertificate(platformKeyInputStream)));CloseableHttpClient httpClient = builder.build();return httpClient;}}

第三步:调起商家转账API

需要在《转账到用户零钱》产品的开发设置中,添加安全ip,接口才能访问

/*** 发起商家转账API** @Author lulu* @Date 2022/07/09*/public static void merchantTransfers() throws IllegalBlockSizeException, IOException {CloseableHttpClient httpClient = WeChatClient.getClient();Map<String, Object> map = new HashMap<>();map.put("appid", "小程序appid");map.put("out_batch_no", "zcx04");map.put("batch_name", "1元");map.put("batch_remark", "1元");map.put("total_amount", 100);map.put("total_num", 1);List<Map> list = new ArrayList<>();Map<String, Object> subMap = new HashMap<>(4);subMap.put("out_detail_no", "detail1");subMap.put("transfer_amount", 100);subMap.put("transfer_remark", "1元");subMap.put("openid", "用户openid");//明细转账金额 >= 2000,收款用户姓名必填//subMap.put("user_name", RsaCryptoUtil.encryptOAEP("收款用户姓名", zcx));list.add(subMap);map.put("transfer_detail_list", list);String body = JSONUtil.toJsonStr(map);System.out.println("请求参数:" + body);HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/transfer/batches");httpPost.addHeader(ACCEPT, APPLICATION_JSON.toString());httpPost.addHeader(CONTENT_TYPE, APPLICATION_JSON.toString());httpPost.addHeader("Wechatpay-Serial", "自己的平台证书序列号");httpPost.setEntity(new StringEntity(body, "UTF-8"));CloseableHttpResponse response = httpClient.execute(httpPost);try {String result= EntityUtils.toString(response.getEntity());System.out.println("返回参数:" + result);//业务逻辑自己处理} finally {response.close();}}

第四步:商家批次单号查询批次单API

/*** 商家批次单号查询批次单API* @throws URISyntaxException* @throws IOException*/public static void queryBatch() throws URISyntaxException, IOException {CloseableHttpClient httpClient = WeChatClient.getClient();//批次号String batchCode = "zcx03";StringBuilder url = new StringBuilder("https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/");url.append(batchCode).append("?need_query_detail=true").append("&detail_status=ALL");URIBuilder uriBuilder = new URIBuilder(url.toString());HttpGet httpGet = new HttpGet(uriBuilder.build());httpGet.addHeader(ACCEPT, APPLICATION_JSON.toString());CloseableHttpResponse response = httpClient.execute(httpGet);try {String bodyAsString = EntityUtils.toString(response.getEntity());System.out.println("微信支付查询返回:" + bodyAsString);JSONObject jsonObject = JSONUtil.parseObj(bodyAsString);if (AjaxResult.me().getCode().equals(response.getStatusLine().getStatusCode())) {//转账批次单基本信息JSONObject transferBatch = jsonObject.getJSONObject("transfer_batch");//批次状态String batchStatus = transferBatch.getStr("batch_status");System.out.println("交易状态:" + batchStatus);//已完成if ("FINISHED".equals(batchStatus)){JSONArray transferDetailList = jsonObject.getJSONArray("transfer_detail_list");for (int i = 0; i < transferDetailList.size(); i++){JSONObject detail = (JSONObject) transferDetailList.get(i);//明细单号String outDetailNo = detail.getStr("out_detail_no");//明细状态String detailStatus = detail.getStr("detail_status");System.out.println("交易明细单号:"+ outDetailNo +",明细状态:" + detailStatus);}}else if ("CLOSED".equals(batchStatus)){//批次关闭原因String closeReason = transferBatch.getStr("close_reason");System.out.println("交易关闭原因:" + closeReason);}} else {//失败自己处理}} finally {response.close();}}

获取平台证书的方法

微信支付v3——批量转账到零钱(提现)相关推荐

  1. c# 微信支付V3商家转账到零钱避坑宝典(二)

    上篇文章经过开通商家转账到零钱,以及设置安全证书,APIv3密钥,接下来访问接口,获取证书的key,以及密钥. 废话不多说,上酸菜,不对,上代码. 一.首先小程序appid,商户号,证书编号,后台配置 ...

  2. 微信支付V3-企业转账至零钱1/2

    准备工作-确保已经开通相应权限,并且有90天的资金流水才能开通.其次开通后还需要在官网进行配置,不能直接调用,并且限制了IP地址. 图片和部分逻辑引用地址:java微信支付v3系列--9.微信支付之商 ...

  3. 微信支付:商家转账到零钱的开发

    主要所需:1.微信商户平台的证书apiclient_cert.pem 2.微信商户平台证书的密钥apiclient_key.pem 3.微信商户平台的证书的序列号 一.转账所需字段 public cl ...

  4. Java微信企业(批量)转账到零钱(超详细)

    文章目录 一.引入jar包 二.yml里面配置支付 三.java 实现支付的步骤 (1)在controller里面写一个支付接口 (2) EntPayReq 的实体类对象 (3)业务层 WxEntPa ...

  5. 微信(jspai版本即公众号h5版)支付-微信下单支付及企业转账到零钱

    微信(jspai版本即公众号h5版)支付-微信下单支付及企业转账到零钱 一.后端前置条件 二.配置h5 devServer 三.后端开发代码 四.前端开发代码(uniapp) 一.后端前置条件 准备好 ...

  6. 微信支付v3版本npm包

    wechatpay-node-v3 # 微信支付v3 支持在ts和js中使用 欢迎大家加入一起完善这个api 前言 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变 ...

  7. Node——微信支付 V3接口

    1. 新建v3PayApi.js const fs = require("fs") const request = require('request') const rsa = r ...

  8. springboot集成微信支付V3 SDK

    微信支付开通支付方法在这里可以参考一下:申请开通微信支付教程_个人怎么申请微信支付_郑鹏川的博客-CSDN博客 因为微信支付回调需要一个外网可访问的地址,我本地调试是采用的内网穿透的方式进行调试的. ...

  9. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  10. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

最新文章

  1. 曾在字节实习的程序员小姐姐,教你一步提取动漫线稿!比用PS更清晰
  2. 迁移学习_Java 10迁移建议
  3. php gtk中文介绍,PHP-GTK介绍及其应用_PHP教程
  4. c#基础知识第十一节
  5. 收藏 | 2020年腾讯技术工程十大热门文章
  6. 基本TCP套接字编程
  7. 高斯课堂数电讲义笔记_学技树
  8. [Xcode 实际操作]五、使用表格-(11)调整UITableView的单元格顺序
  9. 提交json数据给Java_java 实现通过 post 方式提交json参数操作
  10. .Net中常用的几种ActionResult
  11. Vue电商网站项目开发总结
  12. 小程序图片上传,存储,获取,显示
  13. h5 api-获得地理经纬度和异常处理
  14. 计算机wps基础知识,计算机考试WPSOffice常见知识点
  15. Action语义学综述
  16. Duplicate Cleaner Pro(电脑重复文件清理软件)官方中文版V5.15.0 | 重复文件查找王下载
  17. virtualbox 靶机无法获取IP地址
  18. HIOKI日置RM3545电阻计/电阻表
  19. 一插usb接口计算机就重启,电脑故障分析:主机一插USB设备就死机,故障原因令人很无语...
  20. 数据可视化第3篇:安装linux操作系统5系列

热门文章

  1. 海洋地球科学开放数据库
  2. 2015年动漫电影观影指南值得收藏
  3. 用C语言做一个简单的原神抽卡小游戏
  4. Tensorflow-GPU使用时笔记本电脑声音过大的问题
  5. Retrofit2.9.0源码解析
  6. 图像标注工具CVAT
  7. 1.6 mocha配置文件的使用
  8. dedeCMS自定义dede标签
  9. 排列熵(permutation entropy)
  10. Kafka生产者和消费者