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,用 ...
随机推荐
- SqlServer——判断对象是否存在
对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...
- JS中,关于数组的练习题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js-tree坑
今天遇到一个js坑,一个页面,有两棵树,用同一个套参数初始化的,,,,当选择完另一个棵树之后,再操作另一颗树,不选择树节点,就会有错误出现,,,
- Markdown简要规则
We believe that writing is about content, about what you want to say – not about fancy formatting. 我 ...
- 初阶html学习总结(一)(转)
一:颜色代码 如果你想使用某种颜色,取得它的颜色值即可.比如,您想改变某些文字的颜色,您可以使用下面的代码:<font color=#ffc060 size=2>改变#符号后的代码即可改变 ...
- Angular22 HttpClient的使用
1 HttpClient介绍 HttpClient时Http的演进,注意:Http在@angular/http中,而HttpClient在@angular/common/http中: 使用前需要在模块 ...
- Windows Live Writer 使用指南
一.简介 Windows Live Writer 是一个强大的离线博客编辑工具,通过它可以离线编辑内容丰富的博文,除了自身强大的编辑功能之外,还提供了接口,让其它开发人员通过插件提供工具自身没有提供的 ...
- ARC061E Snuke's Subway Trip
传送门 题目大意 已知某城市的地铁网由一些地铁线路构成,每一条地铁线路由某一个公司运营,该城市规定:若乘坐同一公司的地铁,从开始到换乘只需要一块钱,换乘其他公司的价格也是一块钱,问从1号地铁站到n号地 ...
- 使用database control配置数据库时 要求在当前oracle主目录中配置监听程序
1:配置本地的环境变量 打开cmd命令界面 C:\Users\gechong>lsnrctl start 这时候报适配器错误 2.在cmd中输入 tnslsnr命令
- Inheritance with EF Code First: Part 1 – Table per Hierarchy (TPH)
以下三篇文章是Entity Framework Code-First系列中第七回:Entity Framework Code-First(7):Inheritance Strategy 提到的三篇.这 ...