100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Spring Boot 微信小程序用户支付 退款及企业付款到用户零钱 银行卡 -- 自用

Spring Boot 微信小程序用户支付 退款及企业付款到用户零钱 银行卡 -- 自用

时间:2022-05-14 19:00:22

相关推荐

Spring Boot 微信小程序用户支付 退款及企业付款到用户零钱 银行卡 -- 自用

配置文件

build.gradle

// 注意 com.github.binarywang微信支付包版本应与微信其他包版本一致compile 'com.github.binarywang:weixin-java-pay:4.1.0'

application.yml

wx:# 微信支付pay:# 小程序的appIDappid: appid# 商户号mchId: mchId# 商户密钥mchKey: mchKey# 证书路径keyPath: apiclient_cert.p12# 交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付tradeType: JSAPI

微信支付商户基本信息配置信息

WeChatPayProperties.java

/*** 微信支付商户基本信息** @author developer_cw* @date -10-26*/@Data@Component@ConfigurationProperties(prefix = "wx.pay")public class WeChatPayProperties {/*** appId*/private String appId;/*** 商户号*/private String mchId;/*** 商户密钥*/private String mchKey;/*** 证书*/private String keyPath;/*** 交易类型* JSAPI--公众号支付* NATIVE--原生扫码支付* APP--app支付*/private String tradeType;@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);}}

微信支付信息注入bean中

WechatPayConfig.java

/*** @author developer_cw* @date -10-26* 微信支付信息注入bean 中*/@Componentpublic class WechatPayConfig {@Autowiredprivate WeChatPayProperties properties;@Bean@ConditionalOnMissingBeanpublic 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;}@Beanpublic WxPayService wxPayService(WxPayConfig payConfig) {WxPayService wxPayService = new WxPayServiceImpl();wxPayService.setConfig(payConfig);return wxPayService;}}

返回交给前端调起支付的信息

WxPayReturnInfoVO.java

/*** 返回交给前端调起支付的信息** @author developer_cw* @date -10-26*/@Datapublic class WxPayReturnInfoVO {private String appId;private String timeStamp;private String nonceStr;private String prepayId;private String paySign;private String signType;}

控制器

WeChatPayController.java

/*** 微信支付相关 控制器** @author developer_cw* @date -10-26*/@Slf4j@RestControllerpublic class WeChatPayController {@AutowiredWxPayService wxPayService;@AutowiredWeChatPayProperties 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<String, String> 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;}/*** 微信支付回调* * @param xmlData 微信返回的流* @return String*/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("回调有误!");}}/*** 微信退款* * @return String*/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, "退款失败");}/*** 仅支持一次性退款,多次退款需要修改逻辑** @param xmlData 微信返回的流数据* @return String*/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());// 系统订单idwxEntPayRequest.setPartnerTradeNo("");// 付款用户的wxopenidwxEntPayRequest.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());}}/*** 1 块钱转为 100 分* 元转分** @param bigDecimal 钱数目* @return 分*/private int yuanToFee(BigDecimal bigDecimal) {return bigDecimal.multiply(new BigDecimal(100)).intValue();}/*** 时间** @return 时间戳*/private String createTimestamp() {return Long.toString(System.currentTimeMillis() / 1000);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。