一.开发前的准备工作
首先我们登录微信支付
这里有一个[产品中心],需要开通这个商家转账功能,我这里已经开通好了
在开发这个功能之前,还需要添加调用这个接口的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;
}
代码直接拿去用就行,可以根据自己的业务改改
可以看到,微信服务器返回的参数,都有文档上所有的必填参数的;
剩下的差不多就是前端的事情了
能踩的坑我都踩完了,希望看到这篇文章的你,能用半天时间就能开发出来这个功能,剩下的时间尽情地去摸鱼吧~~~ 哈哈
有问题可以问我哟~
到此结束!!!!!!!!!!!