这边用到的jar包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.9</version>
</dependency>
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.14</version>
</dependency>
完整代码(这边我统一整理到了main方法里面):
package org.example;
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.nativepay.NativePayService;
import com.wechat.pay.java.service.payments.nativepay.model.Amount;
import com.wechat.pay.java.service.payments.nativepay.model.CloseOrderRequest;
import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest;
import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.FundsFromItem;
import com.wechat.pay.java.service.refund.model.Refund;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URISyntaxException;
import java.security.PrivateKey;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import static com.wechat.pay.java.service.refund.model.Account.AVAILABLE;
public class WxMain {
//微信对接native支付,微信证书验证 生成订单,查看订单,取消订单,订单退款
public static void main(String[] args) {
}
//--------------------------微信获取二维码url-----------------------
//获取支付url,获取到这个url之后,可通过前端转成二维码用来扫码支付
public String getCodeUrl(){
// 构建service
Config config = getConfig();
NativePayService service = new NativePayService.Builder().config(config).build();
PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
//这部分设置的微信获取的这个url的失效时间,我这边取的当前时间加2分钟,这个获取的getCodeUrl有两分钟的有效时间,超过两分钟,扫这个url会报该二维码已经失效
// 定义日期时间格式化为RFC3339(包含时区信息)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
// 如果您想使用其他时区,例如:东八区(中国标准时间)
OffsetDateTime nowCst = OffsetDateTime.now(ZoneId.of("Asia/Shanghai"));
OffsetDateTime updatedTime = nowCst.plus(2, ChronoUnit.MINUTES);
String formattedNowCst = updatedTime.format(formatter);
//微信这边金额是以分为单位的,这边传的是以元为单位的,要乘以100,变成分
BigDecimal sourceSl = new BigDecimal("金额").setScale(2, BigDecimal.ROUND_HALF_UP);
amount.setTotal(sourceSl.multiply(new BigDecimal("100")).intValue());
//金额
request.setAmount(amount);
//appid
request.setAppid("appid");
//商户id
request.setMchid("商户id");
//描述
request.setDescription("描述");
//回调接口,有传值的话,你放百度的地址都没问题,这边我随便放的地址
request.setNotifyUrl("https://notify_url");
//自己生成的订单号
request.setOutTradeNo("dadjkakwdkjahdjkad");
//生成的链接过期时间
request.setTimeExpire(formattedNowCst);
PrepayResponse response = service.prepay(request);
//返回生成的链接,该链接可以通过前端,转成二维码 浏览器百度一下:也有在线转二维码的
return response.getCodeUrl();
}
//--------------------------微信查看订单-----------------------
//--------------------------微信主动获取订单信息-----------------------
public static Boolean isPaySuccess() throws IOException, URISyntaxException {
//获取证书
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
new FileInputStream("证书位置"));
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials("商户id", new PrivateKeySigner("证书编号", merchantPrivateKey)),"私钥".getBytes("utf-8"));
// 初始化httpClient
CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create()
.withMerchant("商户id", "证书编号", merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"+"自己生成的订单id");
uriBuilder.setParameter("mchid", "商户id");
//完成签名并执行请求
HttpGet httpGet = new HttpGet(uriBuilder.build());
httpGet.addHeader("Accept", "application/json");
CloseableHttpResponse response = httpClient.execute(httpGet);
String body = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = new JSONObject(body);
String result = jsonObject.get("trade_state").toString();
//这边我只给订单支付成功的返回true,还有其他状态,可参考微信的开发文档
if ("SUCCESS".equals(result)) {
return true;
}else {
return false;
}
}
//--------------------------微信取消订单-----------------------
//--------------------------微信主动取消订单-----------------------
public String colsePay() throws AlipayApiException {
Config config = getConfig();
NativePayService service = new NativePayService.Builder().config(config).build();
CloseOrderRequest request = new CloseOrderRequest();
request.setOutTradeNo("自己生成的订单id");
request.setMchid("商户id");
service.closeOrder(request);
return "关闭订单成功";
}
//--------------------------微信退款-----------------------
//--------------------------微信退款-----------------------
public String returnPay() throws AlipayApiException {
Config config = getConfig();
RefundService service = new RefundService.Builder().config(config).build();
CreateRequest request = new CreateRequest();
AmountReq amountReq = new AmountReq();
request.setOutTradeNo("自己生成订单id");
request.setOutRefundNo("自己生成订单id");
//金额这边我是元,乘以100变成分,微信接口里面是传的分
BigDecimal sourceSl = new BigDecimal("金额").setScale(2, BigDecimal.ROUND_HALF_UP);
long je= sourceSl.multiply(new BigDecimal("100")).intValue();
amountReq.setRefund(je);
amountReq.setTotal(je);
amountReq.setCurrency("CNY");
FundsFromItem fundsFromItem =new FundsFromItem();
fundsFromItem.setAmount(je);
fundsFromItem.setAccount(AVAILABLE);
request.setAmount(amountReq);
Refund refund = service.create(request);
String refund_Status = refund.getStatus().toString();
//success状态是退款成功,PROCESSING是正在执行
if("SUCCESS".equals(refund_Status) || "PROCESSING".equals(refund_Status)){
return "退费成功";
}else {
return "退款失败"+refund_Status;
}
}
//配置
public Config getConfig(){
Config config =
new RSAAutoCertificateConfig.Builder()
//商户id
.merchantId("商户id")
//证书地址 D:\\PEM\\apiclient_key.pem
.privateKeyFromPath("")
//证书编号
.merchantSerialNumber("")
//32位私钥
.apiV3Key("")
.build();
return config;
}
}
对应参数获取参考:https://blog.youkuaiyun.com/weixin_54143030/article/details/143229976?spm=1001.2014.3001.5501