一.开发前的准备工作

首先我们登录微信支付

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

在开发这个功能之前,还需要添加调用这个接口的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;
}

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

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


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

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


有问题可以问我哟~

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐