• 添加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实现微信小程序支付(支付,提现,退款)的更多相关文章

  1. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

  2. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  3. 【微信小程序】支付过程详解

    一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...

  4. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

  5. Java实现微信小程序支付(准备)

    Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...

  6. java微信小程序调用支付接口(转)

    简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...

  7. Java实现微信小程序支付(完整版)

    在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...

  8. java微信小程序调用支付接口

    简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...

  9. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...

  10. 微信小程序发起支付流程

    小程序调起支付API 需要参数 邮件中参数 API参数名 详细说明 APPID appid appid是微信小程序后台APP的唯一标识,在小程序后台申请小程序账号后,微信会自动分配对应的appid,用 ...

随机推荐

  1. LAMP 2.3 Apache配置防盗链

    如果你的站点是一个图片站,有很多非常漂亮的美女图片,那我相信,时间久了会有很多人来你网站借图片,有的人直接下载走了,还有的人直接取走图片的地址,比如你的网站域名是 www.123.com,图片地址为 ...

  2. C# WinForm 关闭登陆窗体后进程还再内存怎么办?

    问题:我们通常再制作WinForm应用程序的时候,运行程序的第一个窗口一般是登陆窗口.代码如下: 那么这种方式有一个弊端,这种启动方式,其实就是把登陆窗口设置为主窗体.因此,再登陆后,我们通常是调用H ...

  3. hadoop再次集群搭建(2)-配置免秘钥ssh登录

    SSH对于大多程序员都不陌生,目前主流的云服务提供上也是通过SSH来提供链接的安全保障,比如AWS通过使用下载的私钥(private key)实现与EC2实例安全连接.GitHub通过上传的公钥(pu ...

  4. [解决问题] pandas读取csv文件报错OSError解决方案

    python用padans.csv_read函数出现OSError: Initializing from file failed 问题:文件路径中存在中文 解决办法:修改文件路径名为全英文包括文件名

  5. hibernate学习笔记(6)组件属性以及单表操作

    组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...

  6. .Net时间运算 - DateTime类,TimeSpan类

    DateTime类是.Net中用于处理时间类型数据的. 一.字段 MaxValue 表示 DateTime 的最大可能值.此字段为只读. MinValue     表示 DateTime 的最小可能值 ...

  7. createPlaceholder 函数

    function createPlaceholder(id,text,top,left){ top = top || 0; left = left || 0; var obj = $('#' + id ...

  8. 4-5 父节点watcher事件

    三种方式设置watcher:ls.stat.get

  9. day17-jdbc 2.jdbc介绍

    SQL是一种非过程性语言,只能写一条嘛,你写多条不行嘛.每个数据库都有自己的存储过程.你可以做编程,你可以写多条SQL语句把它放到一起.这就是存储过程.然后用的时候一调它就执行这个逻辑结构了.因为多条 ...

  10. 修改Win10默认窗口背景色为护眼色的方法

    按Windows键+R,打开“运行”对话框,输入regedit: 修改[HKEY_CURRENT_USER\Control Panel\Colors]下Windows键值为 199 237 204, ...