栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring boot 微信小程序用户支付、退款及企业付款到用户零钱、银行卡

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring boot 微信小程序用户支付、退款及企业付款到用户零钱、银行卡

配置文件

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);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号