java 微信提现(复制即用)

2023-10-27

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

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

在这里插入图片描述

重点 调用微信提现

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 微信提现(复制即用) 的相关文章

随机推荐

  • Nginx_http_upstream_check_module应用

    ngx http upstream check module 该模块可以为Nginx提供主动式后端服务器健康检查的功能 该模块在Nginx 1 4 0版本以前没有默认开启 它可以在配置编译选项的时候开启 configure with htt
  • C++的特性(封装、继承、多态、抽象)的详解

    封装 封装目的 模块化 信息隐藏 封装 隐藏对象的属性和实现细节 仅对外公开接口和对象进行交互 将数据和操作数据的方法进行有机结合 是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离 C 中是通过类来实现的 为了尽量避免某个模块的
  • MIPI I3C简介

    前面的文章介绍过MIPI联盟发布的MIPI CSI DSI D PHY等接口 这一篇文章来简单聊一聊I3C 同样由MIPI联盟制定 主要用于替代传统的USRT I2C和SPI 并向下兼容I2C 由于已经有网友写过相关的文章 并且写的很不错
  • signature=462fd3702561f02c1dc8858a887d01f8,baly-20201118

    0001747079 20 000139 txt 20201119 0001747079 20 000139 hdr sgml 20201119 20201119073031 ACCESSION NUMBER 0001747079 20 0
  • EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

    其中 通用类名 DBhelper 实体类 UserInfo 1 新增 2 DBHelper
  • wedo巡线机器人编程教程_这是一个机器人和编程的时代

    图中在草地上自在奔跑的机器人是波士顿动力公司 BostonDynamics 开发的类人双足机器人Atlas 由麻省理工 MIT 电子工程与计算机科学系的教授马克 雷波特在1992年创立 一直致力于将机器人变成自然界的一个新物种 经过20多年
  • Springboot集成knife4j实现风格化API文档

    Springboot集成knife4j实现风格化API文档 POM引入插件
  • GoLang之使用uber-go/dig进行依赖注入

    文章目录 GoLang之使用uber go dig斤进行依赖注入 1 依赖输注入介绍 2 main函数反面例子 3 下载DI依赖 4 main函数使用DI优化 5 注意点 GoLang之使用uber go dig斤进行依赖注入 注 本文是基
  • AtomicInteger、Unsafe类、ABA问题

    AtomicInteger Java中的AtomicInteger大家应该很熟悉 它是为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类 AtomicInteger内部有一个变量UnS
  • Linux 中的 chroot 命令及示例

    Linux Unix系统中的chroot命令用于更改根目录 Linux Unix 类系统中的每个进程 命令都有一个称为root 目录的当前工作目录 它更改当前正在运行的进程及其子进程的根目录 在此类修改的环境中运行的进程 命令无法访问根目录
  • 巧用redis实现点赞功能,它不比mysql香吗?

    提到点赞 大家一想到的是不是就是朋友圈的点赞呀 其实点赞对我们来说并不陌生 我们经常会在手机软件或者网页中看到它 今天就让我们来了解一下它的实现吧 我们常见的设计思路大概分为两种 一种自然是用MySQL等数据库直接落地存储 另外一种就是将点
  • 常见linux服务器存储空间,怎么在linux上查看服务器的存储空间多大

    1 Linux下可以在 proc cpuinfo中看到每个cpu的详细信息 但是对于双核的cpu 在cpuinfo中会看到两个cpu 常常会让人误以为是两个单核的cpu 其实应该通过Physical Processor ID来区分单核和双核
  • 【linux系统编程】基础开发工具:vi/vim

    Linux文本编辑器 vim 正文开始 Assassin 目录 Linux文本编辑器 vim 1 vim基本介绍 2 vim下各模式的切换 3 vim命令模式 4 vim底行模式 5 vim可视化模式 6 额外补充 6 1 非法退出 6 2
  • 解密SVM系列(二):SVM的理论基础

    上节我们探讨了关于拉格朗日乘子和KKT条件 这为后面SVM求解奠定基础 本节希望通俗的细说一下原理部分 一个简单的二分类问题如下图 我们希望找到一个决策面使得两类分开 这个决策面一般表示就是 WTX b 0 W TX b 0 现在的问题是找
  • 如何进阶TypeScript功底?一文带你理解TS中各种高级语法

    引言 TypeScript 的重要性我不在强调了 我相信仍然会有大多数前端开发者碰到复杂类型一概使用 any 处理 我写这篇文章的目的就是为了让你告别 AnyScript 文章告别晦涩的概念结合实例来为你讲述一系列 TS 高级用法 分发 循
  • ipad横屏怎么设置方法,如何使ipad横屏

    ipad怎么设置横屏竖屏 具体如下 1 首先打开我们的平板 之后在屏幕上由下往上滑 如图 请点击输入图片描述请点击输入图片描述2 之后会出现一个菜单设置界面 点击选项右侧的 圆形 按钮 就可以锁定当前屏幕的方向 我们再点击一下就可以取消锁定
  • Golang协程,通道详解

    进程 线程以及并行 并发 关于进程和线程 进程 Process 就是程序在操作系统中的一次执行过程 是系统进行资源分配和调度的基本单位 进程是一个动态概念 是程序在执行过程中分配和管理资源的基本单位 每一个进程都有一个自己的地址空间 一个进
  • ChatGPT Sorry, you have been blocked(抱歉,您已被屏蔽)的解决方法

    最近在使用 ChatGPT 时大家遇到的最多的问题就是 Sorry you have been blocked 抱歉 您已被屏蔽 了 之前的 Access denied 似乎都不常见了 今天老王就分享下这个问题的原因和解决方法 一 Chat
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近5年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • java 微信提现(复制即用)

    微信的支付是麻烦 但支付很简单 直接上代码 有详细注释 一共四个文件 重点 调用微信提现 import back minsu configure Token import back minsu param TiXianParam impor