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转换成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 微信提现(复制即用)相关推荐
- java开发微信提现_java 微信提现至零钱
需要用户绑定微信,获取用户openid,通过openid调取微信接口企业付款到零钱接口: package com.framework.loippi.plugins.wxapppay.withdrawa ...
- 微信广告转化统计java,百度推广oCPC微信号复制转化次数统计系统数据接口
对于百度搜索oCPC,很多竞价可能会感觉比较模糊,本来是一个能够有效控制成本提升转化的程序化产品,但由于大家理解不深,实际操作中就会遇到诸多问题,成本难以控制.账户优化困难. 结合加粉账户页面案例给大 ...
- 慕课网_《Java微信公众号开发进阶》学习总结
时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...
- 微信提现报证书已过期
项目场景: java对接微信提现,已经做好的东西,但是在一年之后的某一天体现发现报体现失败,但是充值依旧可以使用. 问题描述: 原因分析: apiclient_cert.pem 这个证书过期的缘故,登 ...
- java微信支付v3系列——4.创建订单的封装及使用
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- Java微信开发以及对各种云的评价
目前一个人用Java开发一个微信的会员系统,开发已经结束,现在进入测试阶段. 有一些时间看看市面上的一些Java的微信开发视频,看了一下北风网的<微信公众平台开发Java版第一季>中的1, ...
- 微信提现(V2版本)
注意事项: 1.v2版本提现需要用到证书(证书的密码就是你的mchid) 2.发送请求的时候需要setSSLSocketFactory 1.组装好提现需要的参数 Map<String,Objec ...
- Java微信抢红包实现
如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做? * 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结 Java微信抢红包实现 * 功能点探索 * 新建红包:在DB ...
- Java微信开发入门
前言: 1.先简单介绍一下微信公众号的开发者模式和编辑模式,玩过微信公众号的同志都知道,在微信公众号后台功能栏里面可以编辑消息自动回复,关键字回复,自定义菜单等功能,这些都是在视图页面下编辑的,叫编辑 ...
最新文章
- 树莓派设置音频输出音量
- 如何只使用标签来构建一个简单的电影推荐系统
- java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
- php后端mysql,【后端开发】PHP如何处理MySQL死连接
- Redis数据类型--散列类型
- python中括号的作用_Python3--中括号[]与冒号:在列表中的作用
- 【Jetson-Nano】2.Tensorflow和Pytorch的安装
- 安徽理工大学大学计算机科学与技术学院,2020年安徽理工大学计算机科学与技术考研经验分享...
- python读取csv第一列_如何使用标头完整的python导入csv文件,其中第一列为非数字...
- 智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
- Python 的版本与虚拟环境管理
- 游戏开发程序员可能会遇到的英文单词
- HDU 2022 海选女主角
- android手机病毒多杀毒,手机中毒不用慌!教你几招安卓手机怎么彻底的进行杀毒...
- 【评测】MP DSS肠炎模型专用
- 论文阅读:(2020版)A Survey on Deep Learning for Named Entity Recognition 命名实体识别中的深度学习方法
- 【CCF会议期刊推荐】CCF推荐国际学术期刊/会议(计算机科学理论)
- 游戏脚本引色粉,无脑圈钱攻略
- linux系统下freeradius AAA认证服务器创建
- 国产自主“软件定义”框架——openSCA核心框架永久开源
热门文章
- 企业里Win10 开启BitLocker锁定磁盘,如何备份系统,当系统出现问题又如何恢复,快速恢复又兼顾系统安全
- 查验身份证(c语言)
- 学软件测试最好的几本书,这8本书能帮你很多
- 小情侣冷战到半夜!不料程序员男友一波“神操作”巧妙化解,女友懵了.........
- 经典计算机基础学科教程推荐[转自:海枫的专栏]
- 漫步华尔街——股市历久弥新的成功投资策略读书笔记
- 燕教授助力公益,已种下60000棵树,修复荒漠78万平方米
- com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `x`
- 【转载】【整理】《三五个人十来条枪 如何走出软件作坊成为开发正规军》合集 [更新至41]...
- 计算机应用基础上机考试,《计算机应用基础》上机考试试题.文件.doc