参考文章:JAVA 微信APPV3支付(保姆级)_java微信支付-CSDN博客
在上文的基础上新增通过微信支付订单号查询与通过商户订单号查询。其他接口也可以参考本文的请求方式,对接v3微信支付难点是鉴权相关。
首先需要api证书序列号,证书私钥,appId,商户id,v3秘钥。这些都是必备的,申请方式自行百度,不在本文讨论哈。(其实是公司之前有现成的,我直接拿来用的)
另外,建议对接微信支付过程遇到问题,直接问在线技术客服,我之前鉴权弄了一天,结果最后客服说我的商户号太久没资金流动,被限制了,后来去小程序把限制解开就没事了,怀疑了一切就是没有怀疑支付商户号配置相关。
1、maven添加依赖
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.9</version>
</dependency>
2、新建微信支付配置类
@Data
public class WxV3PayConfig {
//api证书序列号
public static String mchSerialNo = "xxx";
//appID
public static String APP_ID = "xxx";
//商户id
public static String Mch_ID = "xxx";
// API V3密钥
public static String apiV3Key = "xxx";
// api证书路径
// 本地使用如: D:\\微信平台证书工具\\7.9\\apiclient_key.pem
// 线上使用如: /usr/apiclient_key.pem
public static String path = "xxx";
}
3、新建微信支付url管理
public class WXPayConstants {
public static final String DOMAIN_API = "https://api.mch.weixin.qq.com";
//app下单
public static final String PAY_TRANSACTIONS_APP = "/v3/pay/transactions/app";
//微信支付回调
public static final String WECHAT_PAY_NOTIFY_URL = "https://xxx";
//关闭订单
public static final String PAY_TRANSACTIONS_OUT_TRADE_NO = "/v3/pay/transactions/out-trade-no/{mchPayNum}/close";
//微信支付订单号查询订单
public static final String FIND_ORDER_BY_WECHAT_PAY_NUM = "/v3/pay/transactions/id/{wechatPayNum}?mchid={mchid}";
//商户订单号查询订单
public static final String FIND_ORDER_BY_MCH_PAY_NUM = "/v3/pay/transactions/out-trade-no/{mchPayNum}?mchid={mchid}";
}
4、service(controller自己写)
BaseResponse为我的项目中的统一返回类,copy后改为自己的即可。
public interface WechatPayService {
/**
* 微信商品支付
* 下单
* @return
*/
BaseResponse weChatPlaceAnOrder(Integer amount);
/**
* 微信支付回调通知
* @param
* @return
*/
BaseResponse wechatPayNotify(HttpServletRequest request, HttpServletResponse response);
/**
*微信关闭订单
* @param mchPayNum
* @return
*/
BaseResponse closeWechatOrder(String mchPayNum);
/**
* 通过微信支付订单号查询订单
* @author 何帆
* @createTime 2024/7/17 上午9:47
* @lastEdit 何帆
* @lastEditTime
* @params [wechatPayNum] 微信支付系统生成的订单号
* @return com.infoex.api.base.BaseResponse
*/
BaseResponse findOrderByWechatPayNum(String wechatPayNum);
/**
* 通过商户订单号查询订单
* @author 何帆
* @createTime 2024/7/17 上午10:05
* @lastEdit 何帆
* @lastEditTime
* @params mchPayNum 商户订单号 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
* @return com.infoex.api.base.BaseResponse
*/
BaseResponse findOrderByMchPayNum(String mchPayNum);
}
5、serviceImpl
@Service
@Slf4j
public class WeChatPayServiceImpl implements WechatPayService {
@Override
@Transactional
public BaseRespons