package com.sandu.common.third.pay.wx; import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.sandu.common.execption.BusinessException; import com.sandu.common.util.IpUtil; import com.sandu.common.util.ResponseUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; /** * @author chenjiantian * @date 2021/8/12 11:26 */ @Service @Slf4j @AllArgsConstructor public class WxFastPayService { /** * app支付 * * @param openId * @param body 商品描述 * @param orderId 订单id * @param totalFee 支付金额(分) * @return */ public SortedMap miniAppPay(WxPayService wxPayService, String openId, String body, String orderId, int totalFee, String callbackUrl) { WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderId); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setOpenid(openId); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(callbackUrl); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); String time = String.valueOf(System.currentTimeMillis() / 1000); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { SortedMap hashMap = new TreeMap<>(); hashMap.put("appId", wxPayUnifiedOrderResult.getAppid()); hashMap.put("nonceStr", wxPayUnifiedOrderResult.getNonceStr()); hashMap.put("package", "prepay_id=" + wxPayUnifiedOrderResult.getPrepayId()); hashMap.put("signType", WxPayConstants.SignType.MD5); hashMap.put("timeStamp", time); String wechatSign = createSign(wxPayService.getConfig().getMchKey(), hashMap); hashMap.put("paySign", wechatSign); return hashMap; } else { log.error("微信支付失败,{}", wxPayUnifiedOrderResult.getErrCodeDes()); throw new BusinessException("微信支付失败," + wxPayUnifiedOrderResult); } } catch (WxPayException e) { log.error("微信支付失败,{}", e.getErrCodeDes()); throw new BusinessException("微信支付失败," + e.getErrCodeDes()); } } private String createSign(String mchKey, SortedMap parameters) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序) for (Object e : es) { Map.Entry entry = (Map.Entry) e; String k = (String) entry.getKey(); Object v = entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + mchKey); System.out.println("字符串拼接后是:" + sb.toString()); return SecureUtil.md5(sb.toString()).toUpperCase(); } public WxPayOrderNotifyResult parseOrderNotifyResult(WxPayService wxPayService, String xmlData) { try { return wxPayService.parseOrderNotifyResult(xmlData); } catch (WxPayException e) { e.printStackTrace(); throw new BusinessException("解析回调结果失败," + e.getErrCodeDes()); } } public WxPayRefundNotifyResult parseRefundNotifyResult(WxPayService wxPayService, String xmlData) { try { return wxPayService.parseRefundNotifyResult(xmlData); } catch (WxPayException e) { e.printStackTrace(); throw new BusinessException("解析回调结果失败," + e.getErrCodeDes()); } } /** * 订单退款 只能退款一次 * * @param wxPayService * @param orderId * @param refundFee * @param callbackUrl * @return */ public boolean refundOrder(WxPayService wxPayService, String orderId,String refundSn, Integer refundFee, String callbackUrl) { WxPayRefundRequest refundRequest = new WxPayRefundRequest(); refundRequest.setOutTradeNo(orderId); refundRequest.setOutRefundNo(refundSn); refundRequest.setRefundFee(refundFee); refundRequest.setTotalFee(refundFee); refundRequest.setNotifyUrl(callbackUrl); try { WxPayRefundResult wxPayRefundResult = wxPayService.refund(refundRequest); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayRefundResult.getResultCode())) { return true; } else { log.error("微信退款失败,{}", wxPayRefundResult.getErrCodeDes()); throw new BusinessException("微信退款失败," + wxPayRefundResult.getErrCodeDes()); } } catch (WxPayException e) { log.error("微信退款失败,{}", e.getErrCodeDes()); throw new BusinessException("微信退款失败," + e.getErrCodeDes()); } } /** * 生成二维码付款 */ public String generateQRCodePay(WxPayService wxPayService, String body, String orderId, int totalFee, String callbackUrl) { WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderId); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setProductId(orderId); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(callbackUrl); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.NATIVE); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { byte[] scanPayQrcodeMode2 = wxPayService.createScanPayQrcodeMode2(wxPayUnifiedOrderResult.getCodeURL(), null, null); String encode = Base64.encode(scanPayQrcodeMode2); return encode; } else { log.error("微信支付失败,{}", wxPayUnifiedOrderResult.getErrCodeDes()); throw new BusinessException("微信支付失败," + wxPayUnifiedOrderResult.getErrCodeDes()); } } catch (WxPayException e) { log.error("微信支付失败,{}", e.getErrCodeDes()); throw new BusinessException("微信支付失败," + e.getErrCodeDes()); } } }