微信小程序支付(基于Java实现微信JSAPI支付):支付,提现,退款
- 添加WXpayCommon类用以具体实现相关功能
1 package com.karat.cn.wxCommon; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import com.karat.cn.util.WXPay; 8 import com.karat.cn.util.WXPayConfigImpl; 9 import com.karat.cn.util.WXPayConstants; 10 import com.karat.cn.util.WXPayUtil; 11 import com.karat.cn.vo.VoUnifiedOrderWx; 12 13 /** 14 * 支付,提现,退款 15 * @author 开发 16 * 17 */ 18 public class WXpayCommon { 19 20 private static WXPay wxpay; 21 private static WXPayConfigImpl config; 22 23 24 public static void WXpayCommonIns() throws Exception { 25 config = WXPayConfigImpl.getInstance(); 26 wxpay = new WXPay(config); 27 } 28 29 /** 30 * 支付 31 * @param orderInfo 自己数据库生成的订单 32 * @param openid 用户的标识openId 33 * @param ip 34 * @param flag 35 * @return 36 * @throws IOException 37 */ 38 public static VoUnifiedOrderWx payOrderWx(WxWithdrawOrder orderInfo, String openid, String ip, boolean flag) throws IOException { 39 VoUnifiedOrderWx voUnifiedOrderWx = null; 40 try { 41 Map<String, String> respData = null; 42 if (flag) { 43 HashMap<String, String> data = new HashMap<String, String>(); 44 data.put("body", orderInfo.getOrderNo()); 45 data.put("out_trade_no", orderInfo.getOrderNo());//订单号 46 data.put("fee_type", "CNY"); 47 data.put("total_fee", "1");//支付金额(分) 48 data.put("spbill_create_ip", ip); 49 data.put("notify_url", "******************");//支付成功回调地址 50 // 交易类型--JSAPI:公众号支付、NATIVE:原生扫码支付、APP:APP支付 51 // 公众号支付 52 data.put("trade_type", "JSAPI");//支付方式 53 // 设备号--自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB" 54 data.put("device_info", "WEB"); 55 // 用户openid 56 data.put("openid", openid); 57 data.put("product_id", "1000" + ""); 58 59 if (null == wxpay) { 60 WXpayCommonIns(); 61 } 62 respData = wxpay.unifiedOrder(data);//统一下单 63 orderInfo.setRemark(respData); 64 } else { 65 respData = orderInfo.getRemark(); 66 } 67 System.out.println(respData); 68 // 返回状态码 69 String return_code = respData.get("return_code"); 70 if (return_code.equals(WXPayConstants.SUCCESS)) { 71 // 业务结果 72 String result_code = respData.get("result_code"); 73 if (result_code.equals(WXPayConstants.SUCCESS)) { 74 voUnifiedOrderWx = new VoUnifiedOrderWx(); 75 // 时间戳 76 voUnifiedOrderWx.setTimeStamp(BaseToolsUtil.systemtimeLong()/1000 + ""); 77 // 随机串 78 voUnifiedOrderWx.setNonceStr(respData.get("nonce_str")); 79 // 数据包 80 voUnifiedOrderWx.setPackageValue("prepay_id=" + respData.get("prepay_id")); 81 82 // 二次签名 83 HashMap<String, String> dataPay = new HashMap<String, String>(); 84 dataPay.put("appId", respData.get("appid")); 85 dataPay.put("nonceStr", voUnifiedOrderWx.getNonceStr()); 86 dataPay.put("package", voUnifiedOrderWx.getPackageValue()); 87 dataPay.put("timeStamp", voUnifiedOrderWx.getTimeStamp()); 88 dataPay.put("signType", "MD5"); 89 String sign = WXPayUtil.generateSignature(dataPay, config.getKey()); 90 // 签名 91 voUnifiedOrderWx.setSign(sign); 92 } 93 } 94 } catch (Exception e) { 95 e.printStackTrace(); 96 } 97 return voUnifiedOrderWx; 98 } 99 100 101 /** 102 * 企业付款(提现) 103 * @param wxWithdrawOrder 104 * @param openid 105 * @param ip 106 * @throws Exception 107 */ 108 public static void transfers(WxWithdrawOrder wxWithdrawOrder, String openid, String ip) throws Exception { 109 HashMap<String, String> data = new HashMap<String, String>(); 110 // 商户订单号 111 data.put("partner_trade_no", wxWithdrawOrder.getOrderNo()); 112 // 用户openid 113 data.put("openid", openid); 114 // 校验用户姓名选项 115 data.put("check_name", "NO_CHECK"); 116 // 金额 117 data.put("amount", wxWithdrawOrder.getMoney() + ""); 118 // 企业付款描述信息 119 // TODO 120 data.put("desc", "提现"); 121 // Ip地址 122 data.put("spbill_create_ip", ip); 123 124 if (null == wxpay) { 125 WXpayCommonIns(); 126 } 127 String respXml = wxpay.transfers(data);//企业付款 128 System.out.println(respXml); 129 Map<String, String> respData = WXPayUtil.xmlToMap(respXml); 130 wxWithdrawOrder.setRemark(respData); 131 wxWithdrawOrder.setRemark2(respXml); 132 // 返回状态码 133 String return_code = respData.get("return_code"); 134 System.out.println(return_code); 135 if (return_code.equals(WXPayConstants.SUCCESS)) { 136 // 业务结果处理 137 } 138 } 139 140 141 /** 142 * @description:微信退款业务封装(支付押金退还); 143 * @param PayLog order:支付订单信息 144 * Double refundAmount:退款金额 145 * @return 微信退款接口返回数据 true 退款成功 false 退款失败 146 * @author:FanHaoJian 147 * @throws Exception 148 */ 149 public static Boolean refundOrder(WxWithdrawOrder orderInfo,Double refundAmount) throws Exception{ 150 if (null == wxpay) { 151 WXpayCommonIns(); 152 } 153 HashMap<String, String> data = new HashMap<String, String>(); 154 data.put("out_trade_no", orderInfo.getOrderNo()); 155 data.put("out_refund_no", orderInfo.getOrderNo()); 156 data.put("total_fee", "1000");//价钱分 157 data.put("refund_fee", String.valueOf((int)(refundAmount*100))); 158 data.put("refund_fee_type", "CNY"); 159 data.put("op_user_id", config.getMchID()); 160 try { 161 Map<String, String> r = wxpay.refund(data);//订单退款 162 System.out.println(r); 163 return Boolean.TRUE; 164 } catch (Exception e) { 165 e.printStackTrace(); 166 } 167 return Boolean.FALSE; 168 } 169 170 }
View Code
- 控制层接口
1 package com.karat.cn.action; 2 3 import java.io.BufferedOutputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 import org.springframework.stereotype.Controller; 14 import org.springframework.web.bind.annotation.RequestMapping; 15 16 import com.karat.cn.util.WXPayConfigImpl; 17 import com.karat.cn.util.WXPayConstants; 18 import com.karat.cn.util.WXPayUtil; 19 import com.karat.cn.wxCommon.IpAddressUtil; 20 import com.karat.cn.wxCommon.WXpayCommon; 21 import com.karat.cn.wxCommon.WxWithdrawOrder; 22 /** 23 * 接口模板 24 * @author 开发 25 * 26 */ 27 @Controller 28 @RequestMapping("wx") 29 public class WxPayAction { 30 31 private HttpServletRequest request; 32 private HttpServletResponse response; 33 private WXPayConfigImpl config; 34 /** 35 * 支付 36 * @return 37 */ 38 @RequestMapping("/pay") 39 public String pay(){ 40 Map<String, String> remark=new HashMap<String, String>(); 41 //新建订单 42 WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,""); 43 try { 44 WXpayCommon.payOrderWx(order, "用户openId",IpAddressUtil.getIpAddr(request), true); 45 } catch (IOException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 return ""; 50 } 51 /** 52 * 微信回调接口notify(支付填写的支付成功回调地址) 53 * @throws Exception 54 */ 55 @RequestMapping("/notifyPayWx") 56 public void notifyPayWx() throws Exception { 57 boolean state = false; 58 System.out.println("微信回调"); 59 InputStream inStream = request.getInputStream(); 60 ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); 61 byte[] buffer = new byte[1024]; 62 int len = 0; 63 while ((len = inStream.read(buffer)) != -1) { 64 outSteam.write(buffer, 0, len); 65 } 66 outSteam.close(); 67 inStream.close(); 68 String resultXml = new String(outSteam.toByteArray(), "utf-8"); 69 System.out.println("resultXml:" + resultXml); 70 Map<String, String> resultMap = WXPayUtil.xmlToMap(resultXml); 71 // 签名验证 72 if (WXPayUtil.isSignatureValid(resultXml, config.getKey())) { 73 String resXml = ""; 74 // 业务结果 75 String result_code = resultMap.get("result_code"); 76 if (result_code.equals(WXPayConstants.SUCCESS)) { 77 // 订单号 78 //String out_trade_no = resultMap.get("out_trade_no"); 79 // 支付成功处理业务逻辑 80 state =true;//根据订单号查询自己数据库该条数据进行业务操作,操作成功返回true 81 } 82 if (state) { 83 //通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了. 84 resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" 85 + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; 86 } else { 87 resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" 88 + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; 89 } 90 System.out.println("resXml:" + resultXml); 91 BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); 92 out.write(resXml.getBytes()); 93 out.flush(); 94 out.close(); 95 } else { 96 // 签名验证失败 97 System.out.println("签名验证失败"); 98 } 99 } 100 101 /** 102 * 退款 103 * @return 104 */ 105 @RequestMapping("/returnPay") 106 public String returnPay(){ 107 Map<String, String> remark=new HashMap<String, String>(); 108 //新建订单 109 WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,""); 110 try { 111 WXpayCommon.refundOrder(order,0.01); 112 } catch (Exception e) { 113 // TODO Auto-generated catch block 114 e.printStackTrace(); 115 } 116 return ""; 117 } 118 /** 119 * 提现 120 * @return 121 */ 122 @RequestMapping("/withdrawDeposit") 123 public String withdrawDeposit(){ 124 Map<String, String> remark=new HashMap<String, String>(); 125 //新建订单 126 WxWithdrawOrder order=new WxWithdrawOrder("1","1",1,"1","1",remark,""); 127 try { 128 WXpayCommon.transfers(order,"用户openId", "服务器地址"); 129 } catch (Exception e) { 130 // TODO Auto-generated catch block 131 e.printStackTrace(); 132 } 133 return ""; 134 } 135 public HttpServletRequest getRequest() { 136 return request; 137 } 138 public void setRequest(HttpServletRequest request) { 139 this.request = request; 140 } 141 public HttpServletResponse getResponse() { 142 return response; 143 } 144 public void setResponse(HttpServletResponse response) { 145 this.response = response; 146 } 147 148 149 150 }
View Code
- 接口中主要根据业务逻辑调用WXpayCommon类中的功能实现方法即可。项目中的相关代码,线上可用,copy整理出的未实测(主要需要相关参数测试,不方便),目测没毛病
转载于:https://www.cnblogs.com/LJing21/p/10391196.html
微信小程序支付(基于Java实现微信JSAPI支付):支付,提现,退款相关推荐
- 【微信小程序】基于Java+uniapp框架开发的全开源微信小程序商城系统
应用介绍 基于Java+uniapp框架开发的全开源微信小程序商城系统,前端采用目前主流的uniapp框架开发,后端采用Java语言开发,前后端代码全部开源,减少重复造轮子,支持小程序商城秒杀.优惠券 ...
- mpvue 微信小程序api_基于mpvue构建微信和支付宝小程序(1)
基于mpvue构建微信和支付宝小程序(1) (1)----- 基础架构篇 why?为啥会有这个系列? 无论是百度和google,关于mpvue构建小程序的项目讲的都是管中窥豹,没有一个系统的讲解. 本 ...
- 小程序毕业设计 基于java后台微信在线视频点播小程序毕业设计参考
小程序 后台
- 小程序毕业设计 基于java后台微信餐厅座位预定小程序毕业设计参考
小程序 后台
- 小程序毕业设计 基于java后台微信电影院选座购票小程序毕业设计参考
效果图
- 【微信小程序】基于JavaScript的花店商城小程序微信云开发
[微信小程序]基于JavaScript的花店商城小程序微信云开发 用Java Script语言进行一次微信小程序开发 文章目录 前言 一.功能总览 二.功能显示 1.搜索框 2.轮播图 3.主题导航栏 ...
- iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享...
?? 微信小程序课程,面向所有具备前端基础知识的同学 ?? iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程 ...
- 微信小程序商城 (后台JAVA)
微信小程序商城(Java版) 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.4.1 1.3 shiro1.3.2 1.4 se ...
- (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好
转载地址:(微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 作者:Happy王子乐 个人网站(整理 ...
- 深入讲解微信小程序上传图片与JAVA后台的结合
背景 微信小程序上传文件是微信小程序提供的API之一,如果用JAVA后台如何来处理上传的文件呢? 官方文档 UploadTask wx.uploadFile(Object object) 将本地资源上 ...
最新文章
- SRE工程师到底是做什么的?
- python 配置文件对比_Python运维自动化之nginx配置文件对比操作示例
- Linux比较大文件内容,Linux系统最大文件打开数优化,解决Too many open files报错
- 计算机编程语言的分类与python语言快速度认识
- 单进程服务器-select版
- ECCV 2020 论文大盘点-人体形状与姿态估计篇
- 【训练题】分队 P1672
- Java 操作Word书签:用文本、图片、表格替换书签
- 通过概率规划归纳的人类水平概念学习
- 算法练习 - 五笔编码
- python泊松分布_泊松分布与Python图解
- HDU 4461 The Power of Xiangqi
- u盾如何在计算机上使用方法,u盾在电脑中具体使用操作过程
- 卸载安装Ubuntu18.04双系统、ROS+装机
- Python做游戏很难吗—来看看我做的多有趣
- 数据挖掘#金融风控总结
- 360怎样修改wifi服务器地址,360路由器怎么改wi-fi密码(无线密码)? | 192路由网
- spring cloud灰度发布快速上下线问题解决
- Android中骨架屏(Skeleton Screen)使用
- 学生公寓管理java_基于JAVA的学生公寓管理系统需要用到那些技术?
热门文章
- windet插入图片的大小_LaTeX的图片插入及排版
- Deepin Linux设置环境变量时出现【Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp】的解决方法
- python爬虫实战,爬虫之路,永无止境
- jsp 和 servlet 有什么区别?
- mysql ley_len计算
- 从0开始安装苹果cms及其资源采集和页面部分代码
- Virtex—5 GTP和Virtex—6 GTX间匹配通信研究及应用
- lambda no instance(s) of type variable(s) T exist so that void conforms to R
- 莽撞小子终到迟暮中年 弗朗西斯择队目标转换(转)
- 用实战项目经验告诉你什么是二方包!