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

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

重点 调用微信提现

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转换成xmlStringBufferedReader 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();}}@Overridepublic String getAppID() {return "APPID";}@Overridepublic String getMchID() {return "商户号";}@Overridepublic String getKey() {return "KEY";}@Overridepublic InputStream getCertStream() {ByteArrayInputStream certBis;certBis = new ByteArrayInputStream(this.certData);return certBis;}@Overridepublic int getHttpConnectTimeoutMs() {// TODO Auto-generated method stubreturn 8000;}@Overridepublic int getHttpReadTimeoutMs() {// TODO Auto-generated method stubreturn 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); // 将字符串转为XMLElement 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

java 微信提现(复制即用)相关推荐

  1. java开发微信提现_java 微信提现至零钱

    需要用户绑定微信,获取用户openid,通过openid调取微信接口企业付款到零钱接口: package com.framework.loippi.plugins.wxapppay.withdrawa ...

  2. 微信广告转化统计java,百度推广oCPC微信号复制转化次数统计系统数据接口

    对于百度搜索oCPC,很多竞价可能会感觉比较模糊,本来是一个能够有效控制成本提升转化的程序化产品,但由于大家理解不深,实际操作中就会遇到诸多问题,成本难以控制.账户优化困难. 结合加粉账户页面案例给大 ...

  3. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  4. 微信提现报证书已过期

    项目场景: java对接微信提现,已经做好的东西,但是在一年之后的某一天体现发现报体现失败,但是充值依旧可以使用. 问题描述: 原因分析: apiclient_cert.pem 这个证书过期的缘故,登 ...

  5. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  6. Java微信开发以及对各种云的评价

    目前一个人用Java开发一个微信的会员系统,开发已经结束,现在进入测试阶段. 有一些时间看看市面上的一些Java的微信开发视频,看了一下北风网的<微信公众平台开发Java版第一季>中的1, ...

  7. 微信提现(V2版本)

    注意事项: 1.v2版本提现需要用到证书(证书的密码就是你的mchid) 2.发送请求的时候需要setSSLSocketFactory 1.组装好提现需要的参数 Map<String,Objec ...

  8. Java微信抢红包实现

    如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做? * 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结 Java微信抢红包实现 * 功能点探索 * 新建红包:在DB ...

  9. Java微信开发入门

    前言: 1.先简单介绍一下微信公众号的开发者模式和编辑模式,玩过微信公众号的同志都知道,在微信公众号后台功能栏里面可以编辑消息自动回复,关键字回复,自定义菜单等功能,这些都是在视图页面下编辑的,叫编辑 ...

最新文章

  1. 树莓派设置音频输出音量
  2. 如何只使用标签来构建一个简单的电影推荐系统
  3. java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
  4. php后端mysql,【后端开发】PHP如何处理MySQL死连接
  5. Redis数据类型--散列类型
  6. python中括号的作用_Python3--中括号[]与冒号:在列表中的作用
  7. 【Jetson-Nano】2.Tensorflow和Pytorch的安装
  8. 安徽理工大学大学计算机科学与技术学院,2020年安徽理工大学计算机科学与技术考研经验分享...
  9. python读取csv第一列_如何使用标头完整的python导入csv文件,其中第一列为非数字...
  10. 智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
  11. Python 的版本与虚拟环境管理
  12. 游戏开发程序员可能会遇到的英文单词
  13. HDU 2022 海选女主角
  14. android手机病毒多杀毒,手机中毒不用慌!教你几招安卓手机怎么彻底的进行杀毒...
  15. 【评测】MP DSS肠炎模型专用
  16. 论文阅读:(2020版)A Survey on Deep Learning for Named Entity Recognition 命名实体识别中的深度学习方法
  17. 【CCF会议期刊推荐】CCF推荐国际学术期刊/会议(计算机科学理论)
  18. 游戏脚本引色粉,无脑圈钱攻略
  19. linux系统下freeradius AAA认证服务器创建
  20. 国产自主“软件定义”框架——openSCA核心框架永久开源

热门文章

  1. 企业里Win10 开启BitLocker锁定磁盘,如何备份系统,当系统出现问题又如何恢复,快速恢复又兼顾系统安全
  2. 查验身份证(c语言)
  3. 学软件测试最好的几本书,这8本书能帮你很多
  4. 小情侣冷战到半夜!不料程序员男友一波“神操作”巧妙化解,女友懵了.........
  5. 经典计算机基础学科教程推荐[转自:海枫的专栏]
  6. 漫步华尔街——股市历久弥新的成功投资策略读书笔记
  7. 燕教授助力公益,已种下60000棵树,修复荒漠78万平方米
  8. com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `x`
  9. 【转载】【整理】《三五个人十来条枪 如何走出软件作坊成为开发正规军》合集 [更新至41]...
  10. 计算机应用基础上机考试,《计算机应用基础》上机考试试题.文件.doc