API v3版微信支付(一)----创建环境、发送请求
微信支付V3版本和之前使用的V2版本最大的区别就是传参由XML变成了JSON,官方文档代码比较简单,我就V3版本的的一些关键步骤做个介绍:
1.首先引入SDK
<!--微信APIV3版本--> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency>
2.在yml配置文件中配置相关微信支付参数
webserverconfig: #回调通知地址 notifyaddress: https://hlht.xazdyl.com/notify/api/notify/complaintsNotify #API证书私钥 privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfID3uxhzUBrGv u3j3s/MJWmep3N0lv9VWbkk9NI2B7C4usWCxaS58dbgQswdBF9e4X7PxFb7d2M0T rnr9roNJEJvDvWYv+zN7b8UqhHEEtwMghxrVycU4W6De2jjxSiptHtF3cZWLHML9 vPJixhaaFMdVBGZuQ26JswVZHkjDHfrhnbSQVMJn5rqp1TAeXzwvyJNyxJokNEnf h7kIUz/ddEUDFdEY1qPVevysWEN6hPT2UIGszQIvafTlQJ2Y9CXW/whLHC4w6G04 a7iJG2fRwT4hQkGfYSzeJWjL951n69Q9i6eDe9VuzjljfeCi60ERa3CewVccJWZD pCKsC7QFAgMBAAECggEAIgu5Z4WzQGcFFdt1SdabbwHsb27UD76Fvvp1EnHCZeCz 60wFhQyXm0YbH/ExWi1ZLTjtLAw1Y4SBRk+JVMwcHDn8ipGL1iZuZJdZbnNnC2Eh iQUUgyqWfVL96QNDTQ4UCzJ4o9EhEGkDF9SM56VyLXCeOcrCFnETnM9EMaT9VUgk v7Gpwq2ajnOWVscmcai+ikNUEUMovyglae1aICzT+yXdB+JSaB/CR03Tyyg8kV4G QsJtOCMttctukwbg0KotOvd5xjTvq4tQbMbBl3JaY6CSwWvpEQBA5hnE0fAzFQag NLNK2G48ZOnPLfY9431XvE9Y6/wtoPBOZI+TLsKwAQKBgQD9g2Rs0t5h6a8mwKbt 5vwaJwdsL3aSIdItDt9aaKi9oJm2Y2699CFmgL3hVzvN37Njxn7Ms50SOI4+JRxT 6qVs8mzTsEk+XNXmufjtXiFFpH4NHrq23R5cwe1QSs/2t9hN7EqbUKnwFS+ompwv jstQyux9mS1IJZeLUZrBXn8OwQKBgQDhUIr1TKJGYS7agZ29sKZNX/OTsHumdxit Wc2KGscTCCxEizBv2uytykqLVTZ53U/wMaUPoleE1DfDE/hcvS5q7+tgfcZ/lfEK lm5UbgztmEwKC/wCcOvt2S5lNaj0yaHuebcGKfxe67AS1qtSNj5fB6VRWWpxV0XI Y4xA/grgreejyjtyjrjeyjykekekeytkeqcc4WMe8SESY6aNqIIcqpZify1uOPWc MxH1nuYXVXvVB2cJBJzD5MmuRHFGtsdoMXKivkZCuwIyI6NddxcN+KKZSpbIN0jr fvzv5xUrfoEyDtW5yAe6ks5eiL0SElx7SLxyOV7vxmCb0cQowML9VxFTQQKBgGMC oL2gemLRC+TLNoUH3lx8AK5yzDNffIGYx+CbWcW8Pq+0NonAu2a3UUCfJnwwy5Ly TeVr4melVgese+RM4dvuKBHT02l3e1+6sSr63UV/OlLj508vTg3L9T5WcTN4c2c3 Jz1XL+aKTWpJ2SkcWxYpZvUzhLnfrvObAyP/qKe9AoGAGLEznjXMYUcIPj0dJr0r x5+kJX4OZjeyjeyjeyj5ejteyj5eahTEG6HuIJsOdmFx1IPW6fYAu6BvFgIaYcUJ bFKSfucT3WrdPOIuNZCYaN8NevZ7oMI4qfGirirCekhedtXld1G1pibH7a6b16CB sUoPGBBRTNRTNRNRNRQGnJoWCQmE= #商户号 mchId: 165626515841 #API证书序列号 mchSerialNo: 40148B8C4SDFSGRDFVRBRBERWDWRF0AA0031A46 #apiV3秘钥 apiV3Key: DVREEVEREBERykpbgqcfsdsfggsdg
3.初始化httpClient
private static CloseableHttpClient httpClient = null; /** * 初始化httpClient * * @return * @throws IOException */ public static CloseableHttpClient httpClient() throws IOException { // 加载商户私钥(privateKey:私钥字符串) PrivateKey merchantPrivateKey = PemUtil .loadPrivateKey(new ByteArrayInputStream(CommonParameters.privateKey.getBytes("utf-8"))); // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥) AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( new WechatPay2Credentials(CommonParameters.mchId, new PrivateKeySigner(CommonParameters.mchSerialNo, merchantPrivateKey)), CommonParameters.apiV3Key.getBytes("utf-8")); // 初始化httpClient return httpClient = WechatPayHttpClientBuilder.create() .withMerchant(CommonParameters.mchId, CommonParameters.mchSerialNo, merchantPrivateKey) .withValidator(new WechatPay2Validator(verifier)).build(); } public static void after(CloseableHttpClient httpClient) throws IOException { httpClient.close(); }
4.发送GET请求
/** * 获取投诉详情 * * @param complaint_id * @throws Exception */ public static ComplaintDetail GetComplaintsInfo(String complaint_id) throws Exception { CloseableHttpClient httpClient = CommonUtils.httpClient(); //请求URL HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2/" + complaint_id); httpGet.setHeader("Accept", "application/json"); //完成签名并执行请求 CloseableHttpResponse response = httpClient.execute(httpGet); try { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { //处理成功 System.out.println("success,return body = " + EntityUtils.toString(response.getEntity())); return JSONObject.parseObject(EntityUtils.toString(response.getEntity()), ComplaintDetail.class); } else if (statusCode == 204) { //处理成功,无返回Body System.out.println("success"); return new ComplaintDetail(); } else { System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity())); return new ComplaintDetail(); } } finally { response.close(); CommonUtils.after(httpClient); } }
5.发送POST请求
/** * 添加投诉回调地址 * * @return * @throws IOException */ @PostMapping("/api/notify/createComplaintsNotify") public R createComplaintsNotify() throws IOException { CloseableHttpClient httpClient = CommonUtils.httpClient(); //请求URL HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications"); // 请求body参数 Map map = new HashMap(); map.put("url", CommonParameters.notifyaddress); String reqdata = JSONObject.toJSONString(map); StringEntity entity = new StringEntity(reqdata); entity.setContentType("application/json"); httpPost.setEntity(entity); httpPost.setHeader("Accept", "application/json"); //完成签名并执行请求 CloseableHttpResponse response = httpClient.execute(httpPost); try { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { //处理成功 log.info("success,return body = " + EntityUtils.toString(response.getEntity())); return R.ok("获取成功", JSONObject.parse(EntityUtils.toString(response.getEntity()))); } else if (statusCode == 204) { //处理成功,无返回Body log.info("success"); } else { log.info("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity())); throw new IOException(EntityUtils.toString(response.getEntity())); } } finally { response.close(); CommonUtils.after(httpClient); } return R.ok(); }