java 微信提现(复制即用)

微信的支付是麻烦,但支付很简单

直接上代码
有详细注释
一共四个文件

在这里插入图片描述

重点 调用微信提现

import back.minsu.configure.Token;
import back.minsu.param.TiXianParam;
import back.minsu.param.WxParam;
import back.minsu.result.TokenRes;
import back.minsu.utils.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author: 云
 * @date: 2020/9/21 14:10
 * @version: 1.0
 */
@RestController
@RequestMapping("wxtixian")
public class WxController {
	
	//调用提现接口
    @PostMapping(value = "cash")
    public Result cash() throws Exception {
         // 返回结果  调用提现 这里你后期自己填值,我先写死了   
         String money = "写金额,已元为单位不能小于1块,不然提不出";
         String str = WxAppPay.cash(money );
         return Result.ok("data", str);
     
    }
	
	//回调  但好像没用到,就这样放着吧 我拿了支付的回调,哈哈
    @PostMapping(value = "notify")
    public String wxPayNotify(HttpServletRequest request) {
        String resXml = "";
        System.out.println("---------------");
        System.out.println("---------------");
        System.out.println("---------------");
        try {
            InputStream inputStream = request.getInputStream();
            //将InputStream转换成xmlString
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder sb = new StringBuilder();
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
            } catch (IOException e) {

            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {

                }
            }
            resXml = sb.toString();
            //String result = wxPayService.payBack(resXml);
            return "result";
        } catch (Exception e) {
//            System.out.println("微信手机支付失败:" + e.getMessage());
            String result = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
            return result;
        }
    }

}

这里插一句,因为是静态调用,所以需要静态的调用serive层,才能执行提现成功后的逻辑实现
解决办法→https://blog.csdn.net/qq_45777315/article/details/107369039

重点 提现代码

import back.minsu.param.WxParam;
import back.minsu.service.UserService;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 * @author: 云
 * @date: 2020/9/21 11:58
 * @version: 1.0
 */

public class WxAppPay {
   
    public static String cash(String money) throws Exception {
    	
    	//都是拿WxPayConfigImpl 里面的东西
        WXPayConfig config = new WxPayConfigImpl();
        SortedMap<String, String> paramMap = new TreeMap<String, String>();
        paramMap.put("mch_appid", config.getAppID());
        paramMap.put("mchid", config.getMchID());
        paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
        
        //提现的订单,恶意刷的可以找回
        String order = "C" + System.currentTimeMillis();
        paramMap.put("partner_trade_no", order);
        
        paramMap.put("openid", "微信的openid");
        paramMap.put("check_name", "NO_CHECK");
        
        /**
        * 这里我 就遇到了很多坑,经常报错 金额的可是不对,
        * 有时候你的程序提现需要手续费,这时候你的金额是需要用double来计算的
        * 下面的代码是你计算完取证方法
        * BigDecimal total = new BigDecimal(money).multiply(new BigDecimal(100))
        *        .setScale(0);
        * 比如 你提100,程序手续费3%  100-100*3%=97.00  注意因为double就算是整数后面还是有小数
        * 这样你这里给微信提现的时候就会多后面的 .00 用上去整就可以就解决掉
        */
        //转换 类型   这里可以去百度下,如果这样写会报错 金额的格式错误
        BigDecimal total = new BigDecimal(money).multiply(new BigDecimal(100));
        paramMap.put("amount", total.toString());
        
        paramMap.put("desc", "提现");
        								//这里就是在上个代码里面的回调地址  没啥用
        paramMap.put("spbill_create_ip", "http://112.126.88.00:8083/wxtixian/notify");
        String sign = WXPayUtil.generateSignature(paramMap, config.getKey(), WXPayConstants.SignType.MD5);
        paramMap.put("sign", sign);
        WXPay pay = new WXPay(config);

        String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
        Map<String, String> resMap;
        String xmlStr = pay.requestWithCert(url, paramMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());

        System.out.println();
        System.out.println("---------");
        System.out.println(xmlStr);
        System.out.println("---------");
        System.out.println();
        
		//调用解析xml工具
        resMap = XmlUtil.readStringXmlOut(xmlStr);

        System.out.println();
        System.out.println("---------");
        System.out.println(resMap);
        System.out.println("---------");
        System.out.println();

		//判断 返回的里面有没有SUCCESS 代表成功
        String resultCode = resMap.get("result_code");
        if ("SUCCESS".equalsIgnoreCase(resultCode)) {
            //走到这里就是提现操作成功了,可以做你自己的业务逻辑了、
            System.out.println();
            System.out.println("---------");
            System.out.println("成功了");
            System.out.println("---------");
            System.out.println();

            //自己的提现操作记录什么的
            //自己的提现操作记录什么的
            //自己的提现操作记录什么的
            
            return "成功";
        } else {
            String err_code = resMap.get("err_code");
            if ("SYSTEMERROR".equalsIgnoreCase(err_code)) {
                return err_code + "";
            } else if ("NOTENOUGH".equalsIgnoreCase(err_code)) {
                return err_code + "";
            } else {
//在这把两个常见的错提了出来,剩下的统一为未知错误了,如果做个更好一些可以直接传错误信息。
                return "调用微信提现接口未知错误,请联系管理员!";
            }
        }

    }
}

配置WXPayConfigImpl

import com.github.wxpay.sdk.WXPayConfig;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author: 云
 * @date: 2020/9/21 11:43
 * @version: 1.0
 * 配置WXPayConfigImpl
 */
public class WxPayConfigImpl implements WXPayConfig {

    private byte[] certData = null;

    public WxPayConfigImpl() {
        try {
            //这个证书的位置不是瞎鸡儿填的,你要在这个路径真的有一个证书
            InputStream is = new FileInputStream("/www/wwwroot/minsu/cret/apiclient_cert.p12");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] bs = new byte[1024];
            int cnt = -1;
            while ((cnt = is.read(bs)) != -1) {
                baos.write(bs, 0, cnt);
            }
            is.close();
            certData = baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getAppID() {
        return "APPID";
    }

    @Override
    public String getMchID() {
        return "商户号";
    }

    @Override
    public String getKey() {
        return "KEY";
    }

    @Override
    public InputStream getCertStream() {
        ByteArrayInputStream certBis;
        certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        // TODO Auto-generated method stub
        return 8000;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        // TODO Auto-generated method stub
        return 10000;
    }
}

解析xml工具类

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * zyh
 * 解析微信返回的xml 看是否成功
 */
public class XmlUtil {
    public static Map<String, String> readStringXmlOut(String xml) {
        Map<String, String> map = new HashMap<String, String>();
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xml); // 将字符串转为XML
            Element rootElt = doc.getRootElement(); // 获取根节点
            List<Element> list = rootElt.elements();//获取根节点下所有节点
            for (Element element : list) {  //遍历节点
                map.put(element.getName(), element.getText()); //节点的name为map的key,text为map的value
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}

微信APP支付https://blog.csdn.net/qq_45777315/article/details/106414362

  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值