• 添加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. springboot整合mybatis+generator

    源码地址:springboot-integration 如果你觉得解决了你使用的需求,欢迎fork|star.

  2. 我们为什么要在C++中使用虚函数

    类中的成员函数分为静态成员函数和非静态成员函数,而非静态成员函数又分为普通函数和虚函数. 至于为什么虚函数必须是非静态成员函数,可以看一下:http://blog.csdn.net/leiming32 ...

  3. win10获取超级管理员权限脚本实现

    建立一个TXT文件,把下面的脚本贴到里面,然后把后缀改成reg格式,双击添加到注册表就可以了, win10_1703版本亲测可用.... Windows Registry Editor Version ...

  4. git在eclipse中的配置 完整版 转载

    http://www.cnblogs.com/zhxiaomiao/archive/2013/05/16/3081148.html

  5. UTF8转unicode说明

    1.最新版iconv中的char *encTo = "UNICODE//IGNORE"; 是没有这个字符串的,它里面有UNICODELITTLE 和 UNICODEBIG 而且是没 ...

  6. Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

    如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...

  7. PCL—点云分割(邻近信息) 低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5000147.html 分割给人最直观的影响大概就是邻居和我不一样.比如某条界线这边是中华文明,界线那边是西方文,最 ...

  8. ZROI2018普转提day2t4

    传送门 分析 考场上暴力水过好评... 然后我的st表查询似乎是log的,然后log三方跑的比log方快,qwq. 我们发现如果一个区间的最小值就是这个区间的gcd,则这个区间合法.所以我们二分区间长 ...

  9. 999F Cards and Joy

    传送门 题目大意 有n个人n*m张牌,每个人分m张牌.每个人有一个自己喜欢的数值,如果他的牌中有x张数值等于这个值则他的高兴度为L[x],求怎样分配牌可以使得所有人的总高兴度最大. 分析 我们发现每一 ...

  10. Ubuntu 切换到桌面 快捷键设置

    设置完以上步骤后,这接windows系统键+d,即可切换到桌面. ps:按Alt+Tab键,可以切换到自己想要的图标进程.