build.gradle
// 注意 com.github.binarywang微信支付包版本应与微信其他包版本一致 compile 'com.github.binarywang:weixin-java-pay:4.1.0'
application.yml
wx:
# 微信支付
pay:
# 小程序的appID
appid: appid
# 商户号
mchId: mchId
# 商户密钥
mchKey: mchKey
# 证书路径
keyPath: apiclient_cert.p12
# 交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
tradeType: JSAPI
微信支付商户基本信息配置信息
WeChatPayProperties.java
@Data
@Component
@ConfigurationProperties(prefix = "wx.pay")
public class WeChatPayProperties {
private String appId;
private String mchId;
private String mchKey;
private String keyPath;
private String tradeType;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
}
微信支付信息注入bean中
WechatPayConfig.java
@Component
public class WechatPayConfig {
@Autowired
private WeChatPayProperties properties;
@Bean
@ConditionalOnMissingBean
public WxPayConfig payConfig() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(this.properties.getAppId());
payConfig.setMchId(this.properties.getMchId());
payConfig.setMchKey(this.properties.getMchKey());
payConfig.setKeyPath(this.properties.getKeyPath());
payConfig.setTradeType(this.properties.getTradeType());
return payConfig;
}
@Bean
public WxPayService wxPayService(WxPayConfig payConfig) {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
返回交给前端调起支付的信息
WxPayReturnInfoVO.java
@Data
public class WxPayReturnInfoVO {
private String appId;
private String timeStamp;
private String nonceStr;
private String prepayId;
private String paySign;
private String signType;
}
控制器
WeChatPayController.java
@Slf4j
@RestController
public class WeChatPayController {
@Autowired
WxPayService wxPayService;
@Autowired
WeChatPayProperties weChatPayProperties;
private static final String REFUND_SUCCESS = "SUCCESS";
public WxPayReturnInfoVO weChatPay() {
// 构建支付参数
final WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = WxPayUnifiedOrderRequest.newBuilder()
//调起支付的人的 openId
.openid("")
//用户生成的唯一订单编号
.outTradeNo("")
//订单金额 单位分
.totalFee(0)
//商品描述
.body("")
//获取本地IP
.spbillCreateIp(InetAddress.getLoopbackAddress().getHostAddress())
//回调的 URL 地址
.notifyUrl("")
.build();
WxPayUnifiedOrderResult wxPayUnifiedOrderResult;
try {
wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest);
} catch (WxPayException e) {
e.printStackTrace();
throw new Exception("微信支付调起失败!");
}
//组合参数构建支付
Map paySignInfo = new HashMap<>(5);
String timeStamp = createTimestamp();
String nonceStr = String.valueOf(System.currentTimeMillis());
paySignInfo.put("appId", weChatPayProperties.getAppId());
paySignInfo.put("nonceStr", nonceStr);
paySignInfo.put("timeStamp", timeStamp);
paySignInfo.put("signType", "MD5");
paySignInfo.put("package", "prepay_id=" + wxPayUnifiedOrderResult.getPrepayId());
String[] signInfo = new String[0];
String paySign = SignUtils.createSign(paySignInfo, "MD5", weChatPayProperties.getMchKey(), signInfo);
//组合支付参数
WxPayReturnInfoVO returnPayInfoVO = new WxPayReturnInfoVO();
returnPayInfoVO.setAppId(weChatPayProperties.getAppId());
returnPayInfoVO.setNonceStr(nonceStr);
returnPayInfoVO.setPaySign(paySign);
returnPayInfoVO.setSignType("MD5");
returnPayInfoVO.setPrepayId(wxPayUnifiedOrderResult.getPrepayId());
returnPayInfoVO.setTimeStamp(timeStamp);
return returnPayInfoVO;
}
public String parseOrderNotifyResult(@RequestBody String xmlData) {
try {
final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);
// 自身支付订单号
notifyResult.getOutTradeNo();
return WxPayNotifyResponse.success("回调成功!");
} catch (WxPayException e) {
e.printStackTrace();
return WxPayNotifyResponse.fail("回调有误!");
}
}
public R refund() {
//申请退款
WxPayRefundRequest refundInfo = WxPayRefundRequest.newBuilder()
// 支付订单号
.outTradeNo("")
// 退款订单号
.outRefundNo("")
// 支付金额 单位分
.totalFee(0)
// 退款金额 单位分
.refundFee(0)
//todo 微信退款回调地址
.notifyUrl("")
.build();
WxPayRefundResult wxPayRefundResult;
try {
wxPayRefundResult = wxPayService.refund(refundInfo);
//判断退款信息是否正确
if (REFUND_SUCCESS.equals(wxPayRefundResult.getReturnCode())
&& REFUND_SUCCESS.equals(wxPayRefundResult.getResultCode())) {
return R.success("退款中");
}
} catch (WxPayException e) {
log.error("微信退款接口错误信息= {}", e);
System.out.println(e.getMessage());
}
return R.fail(400, "退款失败");
}
public String refundNotify(@RequestBody String xmlData) {
WxPayRefundNotifyResult wxPayRefundNotifyResult;
try {
wxPayRefundNotifyResult = wxPayService.parseRefundNotifyResult(xmlData);
} catch (WxPayException e) {
log.error("退款失败,失败信息:{}", e);
System.out.println(e.getMessage());
return WxPayNotifyResponse.fail("退款失败");
}
//判断你返回状态信息是否正确
if (REFUND_SUCCESS.equals(wxPayRefundNotifyResult.getReturnCode())) {
WxPayRefundNotifyResult.ReqInfo reqInfo = wxPayRefundNotifyResult.getReqInfo();
//判断退款状态
if (REFUND_SUCCESS.equals(reqInfo.getRefundStatus())) {
try {
return WxPayNotifyResponse.success("退款成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
return WxPayNotifyResponse.fail("退款失败!");
}
public void entPay() {
EntPayRequest wxEntPayRequest = new EntPayRequest();
wxEntPayRequest.setAppid(weChatPayProperties.getAppId());
wxEntPayRequest.setMchId(weChatPayProperties.getMchId());
// 系统订单id
wxEntPayRequest.setPartnerTradeNo("");
// 退款用户的wxopenid
wxEntPayRequest.setOpenid("");
// 实名校验
// NO_CHECK:不校验真实姓名
// FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
// OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
wxEntPayRequest.setCheckName("NO_CHECK");
// 退款金额 单位分
wxEntPayRequest.setAmount(0);
// 描述
wxEntPayRequest.setDescription("提现");
// 调用接口的机器IP地址
wxEntPayRequest.setSpbillCreateIp("");
try {
EntPayResult wxEntPayResult = wxPayService.getEntPayService().entPay(wxEntPayRequest);
if (REFUND_SUCCESS.equals(wxEntPayResult.getResultCode())
&& REFUND_SUCCESS.equals(wxEntPayResult.getReturnCode())) {
log.info("企业对个人付款成功!n付款信息:n" + wxEntPayResult);
System.out.println("企业对个人付款成功!n付款信息:n" + wxEntPayResult);
} else {
log.error("err_code: " + wxEntPayResult.getErrCode()
+ " err_code_des: " + wxEntPayResult.getErrCodeDes());
System.out.println("提现失败! " + "err_code: " + wxEntPayResult.getErrCode() + " err_code_des: " + wxEntPayResult.getErrCodeDes());
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("提现失败! " + e.getMessage());
}
}
public void payBank() {
EntPayBankRequest wxEntPayBankRequest = new EntPayBankRequest();
wxEntPayBankRequest.setAppid(weChatPayProperties.getAppId());
wxEntPayBankRequest.setMchId(weChatPayProperties.getMchId());
// 系统订单编号(唯一)
wxEntPayBankRequest.setPartnerTradeNo("");
// 收款方银行卡号
wxEntPayBankRequest.setEncBankNo("");
// 收款方银行卡所属银行
wxEntPayBankRequest.setBankCode("");
// 退款金额 单位分
wxEntPayBankRequest.setAmount(0);
// 订单备注 100字以内
wxEntPayBankRequest.setDescription("");
try {
EntPayBankResult wxEntPayBankResult = wxPayService.getEntPayService().payBank(wxEntPayBankRequest);
if (REFUND_SUCCESS.equals(wxEntPayBankResult.getResultCode())
&& REFUND_SUCCESS.equals(wxEntPayBankResult.getReturnCode())) {
log.info("企业对银行卡付款成功!n付款信息:n" + wxEntPayBankResult);
System.out.println("企业对银行卡付款成功!n付款信息:n" + wxEntPayBankResult);
} else {
log.error("err_code: " + wxEntPayBankResult.getErrCode()
+ " err_code_des: " + wxEntPayBankResult.getErrCodeDes());
System.out.println("企业对银行卡付款失败! " + "err_code: " + wxEntPayBankResult.getErrCode() + " err_code_des: " + wxEntPayBankResult.getErrCodeDes());
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("企业对银行卡付款失败! " + e.getMessage());
}
}
private int yuanToFee(BigDecimal bigDecimal) {
return bigDecimal.multiply(new BigDecimal(100)).intValue();
}
private String createTimestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}



