Java实现微信小程序支付(支付,提现,退款)
- 添加WXpayCommon类用以具体实现相关功能
package com.karat.cn.wxCommon; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import com.karat.cn.util.WXPay;
import com.karat.cn.util.WXPayConfigImpl;
import com.karat.cn.util.WXPayConstants;
import com.karat.cn.util.WXPayUtil;
import com.karat.cn.vo.VoUnifiedOrderWx; /**
* 支付,提现,退款
* @author 开发
*
*/
public class WXpayCommon { private static WXPay wxpay;
private static WXPayConfigImpl config; public static void WXpayCommonIns() throws Exception {
config = WXPayConfigImpl.getInstance();
wxpay = new WXPay(config);
} /**
* 支付
* @param orderInfo 自己数据库生成的订单
* @param openid 用户的标识openId
* @param ip
* @param flag
* @return
* @throws IOException
*/
public static VoUnifiedOrderWx payOrderWx(WxWithdrawOrder orderInfo, String openid, String ip, boolean flag) throws IOException {
VoUnifiedOrderWx voUnifiedOrderWx = null;
try {
Map<String, String> respData = null;
if (flag) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("body", orderInfo.getOrderNo());
data.put("out_trade_no", orderInfo.getOrderNo());//订单号
data.put("fee_type", "CNY");
data.put("total_fee", "1");//支付金额(分)
data.put("spbill_create_ip", ip);
data.put("notify_url", "******************");//支付成功回调地址
// 交易类型--JSAPI:公众号支付、NATIVE:原生扫码支付、APP:APP支付
// 公众号支付
data.put("trade_type", "JSAPI");//支付方式
// 设备号--自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
data.put("device_info", "WEB");
// 用户openid
data.put("openid", openid);
data.put("product_id", "1000" + ""); if (null == wxpay) {
WXpayCommonIns();
}
respData = wxpay.unifiedOrder(data);//统一下单
orderInfo.setRemark(respData);
} else {
respData = orderInfo.getRemark();
}
System.out.println(respData);
// 返回状态码
String return_code = respData.get("return_code");
if (return_code.equals(WXPayConstants.SUCCESS)) {
// 业务结果
String result_code = respData.get("result_code");
if (result_code.equals(WXPayConstants.SUCCESS)) {
voUnifiedOrderWx = new VoUnifiedOrderWx();
// 时间戳
voUnifiedOrderWx.setTimeStamp(BaseToolsUtil.systemtimeLong()/1000 + "");
// 随机串
voUnifiedOrderWx.setNonceStr(respData.get("nonce_str"));
// 数据包
voUnifiedOrderWx.setPackageValue("prepay_id=" + respData.get("prepay_id")); // 二次签名
HashMap<String, String> dataPay = new HashMap<String, String>();
dataPay.put("appId", respData.get("appid"));
dataPay.put("nonceStr", voUnifiedOrderWx.getNonceStr());
dataPay.put("package", voUnifiedOrderWx.getPackageValue());
dataPay.put("timeStamp", voUnifiedOrderWx.getTimeStamp());
dataPay.put("signType", "MD5");
String sign = WXPayUtil.generateSignature(dataPay, config.getKey());
// 签名
voUnifiedOrderWx.setSign(sign);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return voUnifiedOrderWx;
} /**
* 企业付款(提现)
* @param wxWithdrawOrder
* @param openid
* @param ip
* @throws Exception
*/
public static void transfers(WxWithdrawOrder wxWithdrawOrder, String openid, String ip) throws Exception {
HashMap<String, String> data = new HashMap<String, String>();
// 商户订单号
data.put("partner_trade_no", wxWithdrawOrder.getOrderNo());
// 用户openid
data.put("openid", openid);
// 校验用户姓名选项
data.put("check_name", "NO_CHECK");
// 金额
data.put("amount", wxWithdrawOrder.getMoney() + "");
// 企业付款描述信息
// TODO
data.put("desc", "提现");
// Ip地址
data.put("spbill_create_ip", ip); if (null == wxpay) {
WXpayCommonIns();
}
String respXml = wxpay.transfers(data);//企业付款
System.out.println(respXml);
Map<String, String> respData = WXPayUtil.xmlToMap(respXml);
wxWithdrawOrder.setRemark(respData);
wxWithdrawOrder.setRemark2(respXml);
// 返回状态码
String return_code = respData.get("return_code");
System.out.println(return_code);
if (return_code.equals(WXPayConstants.SUCCESS)) {
// 业务结果处理
}
} /**
* @description:微信退款业务封装(支付押金退还);
* @param PayLog order:支付订单信息
* Double refundAmount:退款金额
* @return 微信退款接口返回数据 true 退款成功 false 退款失败
* @author:FanHaoJian
* @throws Exception
*/
public static Boolean refundOrder(WxWithdrawOrder orderInfo,Double refundAmount) throws Exception{
if (null == wxpay) {
WXpayCommonIns();
}
HashMap<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", orderInfo.getOrderNo());
data.put("out_refund_no", orderInfo.getOrderNo());
data.put("total_fee", "1000");//价钱分
data.put("refund_fee", String.valueOf((int)(refundAmount*100)));
data.put("refund_fee_type", "CNY");
data.put("op_user_id", config.getMchID());
try {
Map<String, String> r = wxpay.refund(data);//订单退款
System.out.println(r);
return Boolean.TRUE;
} catch (Exception e) {
e.printStackTrace();
}
return Boolean.FALSE;
} }
- 控制层接口
package com.karat.cn.action; import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.karat.cn.util.WXPayConfigImpl;
import com.karat.cn.util.WXPayConstants;
import com.karat.cn.util.WXPayUtil;
import com.karat.cn.wxCommon.IpAddressUtil;
import com.karat.cn.wxCommon.WXpayCommon;
import com.karat.cn.wxCommon.WxWithdrawOrder;
/**
* 接口模板
* @author 开发
*
*/
@Controller
@RequestMapping("wx")
public class WxPayAction { private HttpServletRequest request;
private HttpServletResponse response;
private WXPayConfigImpl config;
/**
* 支付
* @return
*/
@RequestMapping("/pay")
public String pay(){
Map<String, String> remark=new HashMap<String, String>();
//新建订单
WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
try {
WXpayCommon.payOrderWx(order, "用户openId",IpAddressUtil.getIpAddr(request), true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* 微信回调接口notify(支付填写的支付成功回调地址)
* @throws Exception
*/
@RequestMapping("/notifyPayWx")
public void notifyPayWx() throws Exception {
boolean state = false;
System.out.println("微信回调");
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
String resultXml = new String(outSteam.toByteArray(), "utf-8");
System.out.println("resultXml:" + resultXml);
Map<String, String> resultMap = WXPayUtil.xmlToMap(resultXml);
// 签名验证
if (WXPayUtil.isSignatureValid(resultXml, config.getKey())) {
String resXml = "";
// 业务结果
String result_code = resultMap.get("result_code");
if (result_code.equals(WXPayConstants.SUCCESS)) {
// 订单号
//String out_trade_no = resultMap.get("out_trade_no");
// 支付成功处理业务逻辑
state =true;//根据订单号查询自己数据库该条数据进行业务操作,操作成功返回true
}
if (state) {
//通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
} else {
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
}
System.out.println("resXml:" + resultXml);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
} else {
// 签名验证失败
System.out.println("签名验证失败");
}
} /**
* 退款
* @return
*/
@RequestMapping("/returnPay")
public String returnPay(){
Map<String, String> remark=new HashMap<String, String>();
//新建订单
WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
try {
WXpayCommon.refundOrder(order,0.01);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* 提现
* @return
*/
@RequestMapping("/withdrawDeposit")
public String withdrawDeposit(){
Map<String, String> remark=new HashMap<String, String>();
//新建订单
WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,"");
try {
WXpayCommon.transfers(order,"用户openId", "服务器地址");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletResponse getResponse() {
return response;
}
public void setResponse(HttpServletResponse response) {
this.response = response;
} }
- 接口中主要根据业务逻辑调用WXpayCommon类中的功能实现方法即可。项目中的相关代码,线上可用,copy整理出的未实测(主要需要相关参数测试,不方便),目测没毛病
Java实现微信小程序支付(支付,提现,退款)的更多相关文章
- Java 后端微信小程序支付demo (网上说的坑里面基本上都有)
Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...
- 微信小程序篇(微信小程序的支付)
微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...
- 【微信小程序】支付过程详解
一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...
- 微信小程序在线支付功能使用总结
最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...
- Java实现微信小程序支付(准备)
Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...
- java微信小程序调用支付接口(转)
简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...
- Java实现微信小程序支付(完整版)
在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...
- java微信小程序调用支付接口
简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...
- 微信小程序实现支付功能
小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...
- 微信小程序发起支付流程
小程序调起支付API 需要参数 邮件中参数 API参数名 详细说明 APPID appid appid是微信小程序后台APP的唯一标识,在小程序后台申请小程序账号后,微信会自动分配对应的appid,用 ...
随机推荐
- plupload的一些使用心得
最近要做一个文件上传的东西 经过同事的推荐所以就选择了plupload,挺强大的 由于项目框架为改动后的MVC 刚一开始破费周折 不过最后总算是完成了 废话不多说了 粘出来代码给大家参考吧!文件包大家 ...
- 每天一道算法题(14)——N个降序数组,找到最大的K个数
题目: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个. 思路 (1).建立大顶堆,维度为数组的个数,这里为20( ...
- sys添加调用模块的路径;遍历可以调用模块的路径
import sys sys.path.append("D:") for i in sys.path: print(i)
- 静态页面HTML中标签的优化(转)
静态页面HTML中标签的优化 (2010-04-03 20:54:06) 标签: 电脑 name 罗马数字 css 表单 杂谈 分类: 网页制作 从网上看了一篇关于静态页面中标签优化的问题,感觉还不错 ...
- java 矩阵转置算法
工作中用到了行列转置,把这两种情况的算法记下来,以便后用 1.行列数相等的转置 /** * @description 矩阵转置 * @author oldmonk * @time 2017年8月18日 ...
- Angular07 利用angular打造管理系统页面
1 创建一个新的angular应用 ng new adminSystem 2 利用WebStorm打开adminSystem应用 3 借助AdminLTE这个开源项目来辅助开发 AdminLTE项目: ...
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...
- Luogu 1081 [NOIP2012] 开车旅行
感谢$LOJ$的数据让我调掉此题. 这道题的难点真的是预处理啊…… 首先我们预处理出小$A$和小$B$在每一个城市的时候会走向哪一个城市$ga_i$和$gb_i$,我们有链表和平衡树可以解决这个问题( ...
- java获取本机名称、IP、MAC地址和网卡名称
java获取本机名称.IP.MAC地址和网卡名称 摘自:https://blog.csdn.net/Dai_Haijiao/article/details/80364370 2018年05月18日 1 ...
- 开启wifi后不能ping通本机 Cann't ping the local PC while start a wlan
问题如题:今天发现一个问题,测试本机ip时候有时候总是获取失败,后来才发现是wifi共享软件导致的缘故. 本来呢?我买的是小米wifi,但是小米wifi对应的客户端不是很好用,动不动就启动失败,不要问 ...