第一步,在配置文件添加微信配置
第二步创建配置类
@Configuration
public class WxConfig {
@Autowired
private WxPayConfigs properties;
@Bean
public WxMaConfig wxMaConfig() {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(properties.getAppId());
config.setSecret(properties.getAppSecret());
return config;
}
@Bean
public WxMaService wxMaService(WxMaConfig maConfig) {
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(maConfig);
return service;
}
@Bean
public WxMaService wxMaService() {
WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
wxMaConfig.setAppid(this.properties.getAppId());
wxMaConfig.setSecret(this.properties.getAppSecret());
WxMaService wxMaService = new WxMaServiceImpl();
wxMaService.setWxMaConfig(wxMaConfig);
return wxMaService;
}
@Bean
public WxPayService wxPayService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(properties.getAppId());
payConfig.setMchId(properties.getMchId());
payConfig.setMchKey(properties.getMchKey());
payConfig.setNotifyUrl(properties.getNotifyUrl());
payConfig.setKeyPath(properties.getKeyPath());
payConfig.setSignType("MD5");
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
第三步,创建实体类
@Data
@Configuration
@ConfigurationProperties("wx")
public class WxPayConfigs {
private String appId;
private String appSecret;
private String mchId;
private String mchKey;
private String notifyUrl;
private String keyPath;
private String refundUrl;
}
第四步,实现微信支付
分两步,支付接口和支付成功和失败的回调接口
支付接口是提供给前端调用的,回调接口是我们自己回调的
支付接口实现层
public AppCommonModel h5pay(Long orderId, HttpServletRequest request) {
AssistOrder assistOrder = assistOrderService.getById(orderId);
if (assistOrder == null) {
return AppResponseUtil.fail("订单不存在");
}
if (!assistOrder.getOrderStatus().equals(0)) {
return AppResponseUtil.fail("已支付");
}
Customer customer = customerService.getById(tokenService.getLoginUser().getUserId());
if (customer == null) {
return AppResponseUtil.fail("用户信息不存在");
}
//微信支付
String mId = customer.getWxOpenid();
if (mId == null && mId == "") {
return AppResponseUtil.fail("用戶信息获取失败");
}
WxPayMpOrderResult result = null;//JSAPI
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setOpenid(用户的openId);
orderRequest.setOutTradeNo(订单的sn);
orderRequest.setTradeType("JSAPI");
orderRequest.setBody(写个名字);
orderRequest.setNotifyUrl(你的回调接口路径);
orderRequest.setTotalFee(金额);
orderRequest.setSpbillCreateIp(获取ip);
orderRequest.setFeeType("CNY");
result = wxPayService.createOrder(orderRequest);
} catch (Exception e) {
e.printStackTrace();
return AppResponseUtil.fail("支付失败");
}
return AppResponseUtil.success(result);
}
只要代码块在try catch,其余根据自己的业务需求修改
ps:金额要把元转化成分
回调接口
@Transactional
public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
logger.info("request"+request);
String xmlResult = null;
try {
logger.info("request.getInputStream()"+request.getInputStream());
logger.info("request.getCharacterEncoding()"+request.getCharacterEncoding());
xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
logger.info("wx huiDiao "+xmlResult);
} catch (IOException e) {
e.printStackTrace();
logger.info("logger.info(\"wx huiDiao \"+xmlResult);"+e.getMessage());
return WxPayNotifyResponse.fail(e.getMessage());
}
WxPayOrderNotifyResult result = null;
try {
result = wxPayService.parseOrderNotifyResult(xmlResult);
if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getResultCode())) {
logger.error(xmlResult);
throw new WxPayException("微信通知支付失败!");
}
if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {
logger.error(xmlResult);
throw new WxPayException("微信通知支付失败!");
}
} catch (WxPayException e) {
e.printStackTrace();
logger.info("WxPayNotifyResponse.fail(e.getMessage());"+e.getMessage());
return WxPayNotifyResponse.fail(e.getMessage());
}
logger.info("处理腾讯支付平台的订单支付");
logger.info(String.valueOf(result));
String orderSn = result.getOutTradeNo();
String payId = result.getTransactionId();
AssistOrder chargingOrder = assistOrderService.getOne(new QueryWrapper<AssistOrder>().eq("order_sn",orderSn));
if (chargingOrder == null) {
return WxPayNotifyResponse.fail("订单不存在 sn=" + orderSn);
}
// 检查这个订单是否已经处理过
if (chargingOrder.getOrderStatus() != 0) {
return WxPayNotifyResponse.success("订单已经处理成功!");
}
// 检查支付订单金额
if (!result.getTotalFee().equals(priceTools.toFen(chargingOrder.getOrderPrice()))) {
return WxPayNotifyResponse.fail(chargingOrder.getOrderSn() + " : 支付金额不符合 totalFee=" + BaseWxPayResult.fenToYuan(result.getTotalFee()));
}
chargingOrder.setPayId(payId);
chargingOrder.setPayTime(LocalDateTime.now());
//修改支付狀態
chargingOrder.setPayStatue(1);
chargingOrder.setActualPrice(chargingOrder.getOrderPrice());
Activity activity = activityService.getById(chargingOrder.getActivityId());
activity.setStatus("0");
try {
activityService.updateById(activity);
assistOrderService.updateById(chargingOrder);
} catch (Exception e) {
return WxPayNotifyResponse.fail("更新数据已失效");
}
logger.info("支付成功");
AccountHistory accountHistory = new AccountHistory();
accountHistory.setCusId(chargingOrder.getCustomerId());
accountHistory.setType("0");
accountHistory.setPrice(chargingOrder.getOrderPrice());
accountHistory.setBalancePrice(customerAccountService.getOne(new QueryWrapper<CustomerAccount>().select("balance_amount").eq("customer_id", chargingOrder.getCustomerId())).getBalanceAmount());
accountHistory.setContent(activityService.getOne(new QueryWrapper<Activity>().select("title").eq("id", chargingOrder.getActivityId())).getTitle());
accountHistory.setCreateTime(LocalDateTime.now());
accountHistoryService.save(accountHistory);
return WxPayNotifyResponse.success("处理成功!");
}
同样的,后半部分根据自己的业务需求修改
第五步申请退款
public Object refund(Long orderId,BigDecimal money) {
AssistOrder chargingOrder = assistOrderService.getById(orderId);
if (chargingOrder == null) {
throw new ServiceException(UserExceptionEnum.ORFER_EXCEPTION);
}
// 设置订单申请退款状态,更新订单
chargingOrder.setRefundContent(UUID.randomUUID().toString());
WxPayRefundRequest refundInfo=new WxPayRefundRequest();
if (StringUtils.isBlank(chargingOrder.getOrderSn())) {
throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
}
String dateTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
refundInfo.setOutTradeNo(chargingOrder.getOrderSn());
refundInfo.setOutRefundNo(dateTime + "-" + RandomStringUtils.randomAlphanumeric(5));
refundInfo.setTotalFee(priceTools.toFen(chargingOrder.getOrderPrice()));
refundInfo.setRefundFee(priceTools.toFen(money));
refundInfo.setNotifyUrl(回调的路径)
refundInfo.setOpUserId(wxPayConfigs.getMchId());
refundInfo.setRefundDesc("需求退款: " + money + "元");
WxPayRefundResult wxPayRefundResult;
try {
wxPayRefundResult = wxPayService.refund(refundInfo);
//判断退款信息是否正确
if ("SUCCESS".equals(wxPayRefundResult.getReturnCode())
&& "SUCCESS".equals(wxPayRefundResult.getResultCode())) {
/**
* 系统内部业务逻辑
*/
}
} catch (WxPayException e) {
logger.error("微信退款接口错误信息= {}", e);
throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
}
CustomerAccount customerAccount = customerAccountService.getOne(new QueryWrapper<CustomerAccount>().eq("customer_id", chargingOrder.getCustomerId()));
customerAccount.setContent("微信退款");
accountHistoryService.add(customerAccount, "3", money);
return AppResponseUtil.success();
}
有错误,希望大佬们指出,不要喷我,谢谢!