【Java】对接微信转账到零钱接口 Java微信商家转账 apiV3(该踩的雷都踩了)

相关文件:

接入前准备 - 商家转账到零钱 | 微信支付商户文档中心

发起商家转账 - 商家转账到零钱 | 微信支付商户文档中心

SDK - SDK&开发工具 | 微信支付商户文档中心

配置apiv3依赖

<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-java</artifactId>
    <version>0.2.12</version>
</dependency>

java代码 

package com.metersbonwe.fxmbone.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.core.util.PemUtil;
import com.wechat.pay.java.service.transferbatch.TransferBatchService;
import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferResponse;
import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class WeChatPayMain  {

    //商户号
    @Value("${merchant_id}")
    private static String merchantId;
    //商户API证书的证书序列号。 微信商户平台证书的序列号
    @Value("${merchant_serial_number}")
    private static String merchantSerialNumber;
    //微信支付 APIv3 密钥
    @Value("${api_v3_key}")
    private static String apiV3Key;
    //微信支付 APIv3 密钥
    @Value("${apiclient_key}")
    private static String apiclientKey;//SpringCould打包后jar包中获取文件地址会查找不到,所以将秘钥内容配置在application文件中

    //微信支付平台证书列表。你也可以使用后面章节提到的“定时更新平台证书功能”,而不需要关心平台证书的来龙去脉。
//    public static String wechatPayCertificatePath = "classpath:certificate/apiclient_cert.pem";
    //商户API私钥,如何加载商户API私钥请看常见问题。
//    public static String privateKeyPath = "classpath:certificate/apiclient_key.pem";//"商户平台证书密钥的路径";

//    public static String wechatPayCertificatesFromPath = "classpath:certificate/wechatpay_xxxxxxxxxxxxxxxxxxxxx.pem";


    public static void main(String[] args) {
        //通过获取相对路径获取apiclient_key.pem 文件,但是打包后文件在jar包中,获取不到路径
//        ClassPathResource resourcePrivateKey = new ClassPathResource("apiclient_key.pem");
//        String resourcePrivateKeyPath = null;
//        try {
//            resourcePrivateKeyPath = resourcePrivateKey.getFile().getPath();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        //privateKey 或者 privateKeyFromPath 配置一个就可以了
                        .privateKey(getPrivateKey(apiclientKey))//   .privateKeyFromPath(resourcePrivateKeyPath)
                        .merchantSerialNumber(merchantSerialNumber)
//                        .wechatPayCertificatesFromPath(wechatPayCertificatesFromPath)//使用RSAAutoCertificateConfig后不再需要配置
                        .apiV3Key(apiV3Key)
                        .build();
        TransferBatchService  service = new TransferBatchService.Builder().config(config).build();
        //数据封装
        InitiateBatchTransferRequest initiateBatchTransferRequest = new InitiateBatchTransferRequest();
        initiateBatchTransferRequest.setAppid("商户appid");
        initiateBatchTransferRequest.setOutBatchNo(System.currentTimeMillis()+"");
        initiateBatchTransferRequest.setBatchName("XXX申请提现");
        initiateBatchTransferRequest.setBatchRemark("XXX申请提现");
        initiateBatchTransferRequest.setTotalAmount((long) (1*100));
        initiateBatchTransferRequest.setTotalNum(1);
        initiateBatchTransferRequest.setTransferSceneId("1001");
        {
            List<TransferDetailInput> transferDetailListList = new ArrayList<>();
            {
                TransferDetailInput transferDetailInput = new TransferDetailInput();
                transferDetailInput.setTransferAmount((long) (1*100));//金额为分 需要乘以100
                transferDetailInput.setOutDetailNo("D"+System.currentTimeMillis()+"");
                transferDetailInput.setOpenid("收款人Openid");
                transferDetailInput.setTransferRemark("XXX申请提现");
                transferDetailListList.add(transferDetailInput);
            }
            initiateBatchTransferRequest.setTransferDetailList(
                    transferDetailListList);
        }
        //发起商家转账
        InitiateBatchTransferResponse response = new InitiateBatchTransferResponse();
        try {
            response = service.initiateBatchTransfer(initiateBatchTransferRequest);
        }catch (ServiceException e){
            log.error("initiateBatchTransfer:",e.getErrorMessage());
        }
        log.info("initiateBatchTransfer:", JSONObject.toJSONString(response));
        if(response.getBatchStatus().equals("ACCEPTED")){
            log.info("initiateBatchTransfer:",response.getBatchStatus());
        }
        log.error("initiateBatchTransfer:",response.getBatchStatus());
    }

    /**
     * 传入apiclient_key内容返回PrivateKey
     * @param apiclient_key
     * @return
     */
    private static PrivateKey getPrivateKey(String apiclient_key){
        return PemUtil.loadPrivateKeyFromString(apiclient_key);
    }

}

接收微信加密消息时解密报错-java.security.InvalidKeyException: Illegal key size(本机解密正常,服务器解密报错)

二、解决

官方下载JCE无限制权限策略文件

JDK5: Java Archive Downloads - Java Platform Technologies

JDK6的下载地址:Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

JDK7的下载地址: Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

JDK8的下载地址: JCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download

这里以JDK1.8为例,进入下载页面,选择下载即可(没有Oracle账户的话需要进行注册

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt

如果安装了JRE,要将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件

如果安装了JDK,还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

 文件路径为:

C:\Users\admin\.jdks\corretto-1.8.0_372\jre\lib\security\policy\unlimited

或者

C:\Program Files\Java\jdk1.8.0_91\jre\lib\security

异常相关文件:

接收微信加密消息时解密报错-java.security.InvalidKeyException: Illegal key size(本机解密正常,服务器解密报错)_at com.wechat.pay.java.core.cipher.abstractaeadcip-CSDN博客

{"code":"INVALID_REQUEST","message":"API通道未开启"}-CRMEB社区

此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置 | 微信开放社区

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值