1.maven引用
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.7.0</version>
</dependency>
2.配置文件
# 微信支付相关配置
wx:
pay:
appId: #微信公众号或者小程序等的appid
mchId: #微信支付商户号
mchKey: #微信支付商户密钥
subAppId: #服务商模式下的子商户公众账号ID
subMchId: #服务商模式下的子商户号
keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
notifyUrl: #外网可访问的回调地址
3.微信支付引用第三方jar配置文件
package com.weChat.properties;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author FangYN
* @Date 2020/7/1
* @Description 微信支付
**/
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties {
/**
* 设置微信公众号或者小程序等的appid
*/
private String appId;
/**
* 微信支付商户号
*/
private String mchId;
/**
* 微信支付商户密钥
*/
private String mchKey;
/**
* 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
*/
private String subAppId;
/**
* 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
*/
private String subMchId;
/**
* apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
*/
private String keyPath;
/**
* 支付回调地址
*/
private String notifyUrl;
}
package com.weChat.config;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.weChat.properties.WxPayProperties;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author FangYN
* @Date 2020/7/1
* @Description 微信支付配置
**/
@Configuration
public class WxPayConfiguration {
@Autowired
private WxPayProperties properties;
@Bean
@ConditionalOnMissingBean
public WxPayService wxService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));
// 可以指定是否使用沙箱环境
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
4.正式接口逻辑示例
4.1 创建预订单,生成收款二维码
public WeChatPayVo createOrder(HttpServletRequest request) throws Exception {
String productId = "1";
String tradeNo = UUIDUtils.getUUID();// 订单编号
String description = "**产品";// 订单描述
String totalAmount = "0.01";
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setSignType(WxPayConstants.SignType.MD5);
orderRequest.setDeviceInfo("WEB");
orderRequest.setTradeType("NATIVE");
orderRequest.setBody(description);// 商品名称
orderRequest.setOutTradeNo(tradeNo);// 当前系统生成的订单编号
orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(totalAmount));// 标价金额
orderRequest.setSpbillCreateIp(IPUtils.getIpAddr(request));// 终端IP
// orderRequest.setOpenid(null);// 用户标识 trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识
orderRequest.setProductId(productId); // trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID
WxPayUnifiedOrderResult orderResult = wxService.unifiedOrder(orderRequest);
if ("FAIL".equals(orderResult.getReturnCode()) || "FAIL".equals(orderResult.getResultCode()))
throw new Exception("订单创建失败,请重新请求");
// 保存订单信息**
// 返回信息对象
WeChatPayVo prePay = new WeChatPayVo();
prePay.setPrice(new BigDecimal(totalAmount));
prePay.setDescription(description);
prePay.setTradeNo(tradeNo);
prePay.setPrepayId(orderResult.getPrepayId());
prePay.setCodeUrl(orderResult.getCodeURL());
return prePay;
}
4.2 支付后的回调逻辑
public String callBack(HttpServletRequest request) throws IOException, WxPayException {
String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
WxPayOrderNotifyResult notifyResult = wxService.parseOrderNotifyResult(xmlResult);
if ("FAIL".equals(notifyResult.getReturnCode())) return WxPayNotifyResponse.fail("return_code不正确");
String tradeNo = notifyResult.getOutTradeNo();// 系统订单号
if ("FAIL".equals(notifyResult.getResultCode())) {// 支付失败
return WxPayNotifyResponse.fail("result_code不正确");
}
log.info("微信notify:微信支付回调:修改的订单===>" + tradeNo);
// 根据tradeNo查询系统的订单信息,根据业务处理相关逻辑
// 更新订单交易成功相关数据
return WxPayNotifyResponse.success("OK");
}