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,用 ...
随机推荐
- python ConfigParser 读取配置文件
- 使用SQL Server保存Session状态,实现单点登录
在做一些应用网站时,我们可能会碰到这样一种情况:整个项目是由多个网站组成的,而我们要实现用户从一个站点登录后,跳转到其他网站不需要重复登录,即实现单点登录.目前实现单点登录的技术也有好几种,这篇文章描 ...
- [hdu3949]XOR(线性基求xor第k小)
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- Node.js的__dirname,__filename,process.cwd(),./的含义
简单说一下这几个路径的意思,: __dirname: 获得当前执行文件所在目录的完整目录名 __filename: 获得当前执行文件的带有完整绝对路径的文件名 process.cwd():获得当前执行 ...
- 将字符串str1复制为字符串str2的三种方法
1.自己编写函数,将两个字符串进行复制 #include<iostream> using namespace std; int main(){ char str1[]="I lo ...
- mac上virtualBox的安装和使用
一.下载和安装 去oracle官网下载mac版的virtualBox. 官网下载地址:https://www.virtualbox.org/. 下载好后按照向导进行安装即可. 二.使用方法 1.新建虚 ...
- Java之IO流学习总结
流:可以理解为数据的流动,就是一个数据流,IO流最终要以对象来体现 流的分类: 按照流的方向:输入流和输出流 (输入流只能进行读操作,输出流只能进行写操作) 按照处理数据的不同:字节 ...
- vue 之 指令系统介绍
浏览目录 条件渲染 class 与style绑定 事件处理 指令系统介绍 所谓指令系统,大家可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了. 在vue中,指令系统,设置一些 ...
- Python程序设计8——网络编程
Python是一个很强大的网络编程工具,python内有很多针对场景网络协议的库,在库顶部可以获得抽象层,这样就可以集中精力在程序的逻辑处理上,而不是停留在网络实现的细节中. 1 少数几个网络设计模块 ...
- 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理
在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部 ...