微信支付-关于[2025年]新版本的商家转账功能的实现

一.开发前的准备工作

首先我们登录微信支付

这里有一个[产品中心],需要开通这个商家转账功能,我这里已经开通好了

在开发这个功能之前,还需要添加调用这个接口的ip,不然会报该IP地址没有权限的这个错,如下图:

①开通功能 --> ②开通场景 --> ③添加IP
完成之后就可以进行我们的开发工作了

二.自定义请求的介绍

SDK还没有开发这个新的功能,使用自定义请求

这一点我在微信开发平台上也进行了咨询 得到的答复如下:

1.需要引入以下依赖

        <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-apache-httpclient</artifactId>
            <version>0.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-java</artifactId>
            <version>0.2.15</version>
        </dependency>

2.在使用这个之前需要封装一下微信的这个config:不会的可以在网上搜一下这个类名(我写的有点乱):

@Bean
    public RSAAutoCertificateConfig getConfig(){
        return new RSAAutoCertificateConfig.Builder()
            .merchantId(PARTNER)
            .privateKeyFromPath(PEM)
            .merchantSerialNumber(MERCHANT)
            .apiV3Key(PARTNERKEY)
            .build();
    }

这些就是微信支付的商户号,证书,商户序列号,私钥啥的

三.代码实现


以下是我的实现代码:

重要的事情说三遍:一定要去看文档,不然你都不知道发放场景和用户感知是个什么鬼玩意

重要的事情说三遍:一定要去看文档,不然你都不知道发放场景和用户感知是个什么鬼玩意

重要的事情说三遍:一定要去看文档,不然你都不知道发放场景和用户感知是个什么鬼玩意

文档地址:产品介绍_商家转账|微信支付商户文档中心


需要注意的点,我已经用全类名了,所以不要引错包了

       @Resource
    private RSAAutoCertificateConfig rsaAutoCertificateConfig;



 @Override
    public R transferBill(String transactionId, String openId, Integer money) throws JsonProcessingException {
        Map map = new HashMap<>();
        String appid = APPID;
        map.put("appid", appid);
        String value = String.valueOf(transactionId);
        map.put("transfer_scene_id", "1000"); //发放场景
        map.put("out_bill_no", value);
        map.put("openid", openId);
        map.put("transfer_amount", money);
        map.put("transfer_remark", "openId");

        map.put("user_recv_perception", "现金奖励"); //用户感知
        List<Map> list = new ArrayList<>();
        Map<String, Object> subMap = new HashMap<>(2);
        subMap.put("info_type", "活动名称");
        subMap.put("info_content", "佣金提现");
        Map<String, Object> subjectMap = new HashMap<>(2);
        subjectMap.put("info_type", "奖励说明");
        subjectMap.put("info_content", "推广佣金");

        list.add(subMap);
        list.add(subjectMap);

        map.put("transfer_scene_report_infos", list);
        OkHttpClient okHttpClient = new OkHttpClient();
        
        com.wechat.pay.java.core.http.HttpClient httpClient = new DefaultHttpClientBuilder().config(rsaAutoCertificateConfig).okHttpClient(okHttpClient).build();

        HttpHeaders headers = new HttpHeaders();
        headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue());
        headers.addHeader("Content-Type", MediaType.APPLICATION_JSON.getValue());
        headers.addHeader("Wechatpay-Serial", ConstantPropertiesUtils.MERCHANT);

        String requestBody = JSONUtil.toJsonStr(map);

        JsonRequestBody build = new JsonRequestBody.Builder()
            .body(requestBody)
            .build();

        com.wechat.pay.java.core.http.HttpRequest executeSendGetHttpRequest =
            new HttpRequest.Builder()
                .httpMethod(HttpMethod.POST)
                .url("https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills")
                .headers(headers)
                .body(build)
                .build();
        HttpResponse<WeixinPayResponse> execute = null;
        execute = httpClient.execute(executeSendGetHttpRequest, WeixinPayResponse.class);

        ResponseBody body = execute.getBody();
        String string = body.toString();
        Map<String, String> parseObject = JSONObject.parseObject(string, Map.class);
        Map<String, String> responseMap = JSONObject.parseObject(parseObject.get("body"), Map.class);

        log.info("微信转账响应" + responseMap);

        return R.ok(responseMap);
    }

还有关于这个response,需要自己自定义一下,叫啥名都行,里面就是请求微信服务器返回来的参数;

@Data
public class WeixinPayResponse {
    private String createTime;
    private String outBillNo;
    private String packageInfo;
    private String state;
    private String transferBillNo;
}

代码直接拿去用就行,可以根据自己的业务改改

 可以看到,微信服务器返回的参数,都有文档上所有的必填参数的;


剩下的差不多就是前端的事情了

能踩的坑我都踩完了,希望看到这篇文章的你,能用半天时间就能开发出来这个功能,剩下的时间尽情地去摸鱼吧~~~ 哈哈


有问题可以问我哟~

到此结束!!!!!!!!!!!

### Java 实现微信商家转账 API #### 准备工作 为了能够成功调用微信支付的批量转账功能,开发者需要完成一系列准备工作。这包括但不限于注册成为微信支付的服务商并获得相应的商户号以及密钥等必要凭证[^2]。 #### 构建请求参数 当准备就绪之后,在执行转账操作之前还需要构建必要的请求参数。这些参数通常涉及接收方的信息、金额以及其他可能影响交易处理的数据字段。对于具体的参数列表及其含义应当参照官方的产品文档来确保准确性[^1]。 #### 示例代码展示 下面给出一段用于实现日期格式转换的方法`getDateByRFC3339()`作为辅助函数的一部分,该函数会将给定的时间字符串按照指定格式进行重写以便于后续使用: ```java public static String getDateByRFC3339(String time){ DateTime dateTime = new DateTime(time); long timeInMillis = dateTime.toCalendar(Locale.getDefault()).getTimeInMillis(); Date date = new Date(timeInMillis); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmsss"); String formattedTime = format.format(date); return formattedTime; } ``` 此段代码并非直接参与转账过程的核心逻辑,而是展示了如何利用Java处理时间戳的一种方式,这对于某些场景下的应用可能是有用的前置步骤之一[^3]。 #### 发起转账请求 实际发起转账时,则需依照API规定组装完整的HTTP POST请求,其中包含了上述提到的各种必需项,并通过HTTPS协议提交至微信服务器端口。注意此时应采用最新的安全标准如TLS 1.2以上版本以保障通信的安全性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值