100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java实现微信小程序支付(支付 提现 退款)

Java实现微信小程序支付(支付 提现 退款)

时间:2022-09-08 09:54:27

相关推荐

Java实现微信小程序支付(支付 提现 退款)

1.添加WXpayCommon类用以具体实现功能,代码如下:

1 package .wxCommon; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import .util.WXPay; 8 import .util.WXPayConfigImpl; 9 import .util.WXPayConstants; 10 import .util.WXPayUtil; 11 import .vo.VoUnifiedOrderWx; 12 13 /** 14 * 支付,提现,退款 15 * @author 开发 16 * 17 */ 18 public class WXpayCommon { 1920private static WXPay wxpay; 21private static WXPayConfigImpl config; 222324public static void WXpayCommonIns() throws Exception { 25 config = WXPayConfigImpl.getInstance(); 26 wxpay = new WXPay(config); 27} 2829/** 30* 支付 31* @param orderInfo 自己数据库生成的订单 32* @param openid 用户的标识openId 33* @param ip 34* @param flag 35* @return 36* @throws IOException 37*/ 38public 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} 99100101/**102* 企业付款(提现)103* @param wxWithdrawOrder104* @param openid 105* @param ip106* @throws Exception107*/108public 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 // 用户openid113 data.put("openid", openid);114 // 校验用户姓名选项115 data.put("check_name", "NO_CHECK");116 // 金额117 data.put("amount", wxWithdrawOrder.getMoney() + "");118 // 企业付款描述信息119 // TODO120 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}139140141/**142* @description:微信退款业务封装(支付押金退还);143* @param PayLog order:支付订单信息144* Double refundAmount:退款金额145* @return 微信退款接口返回数据 true 退款成功 false 退款失败146* @author:FanHaoJian147* @throws Exception 148*/149public 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}169170 }

View Code

2.接口大概内容如下:

1 package .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 .util.WXPayConfigImpl; 17 import .util.WXPayConstants; 18 import .util.WXPayUtil; 19 import .wxCommon.IpAddressUtil; 20 import .wxCommon.WXpayCommon; 21 import .wxCommon.WxWithdrawOrder; 22 /** 23 * 接口模板 24 * @author 开发 25 * 26 */ 27 @Controller 28 @RequestMapping("wx") 29 public class WxPayAction { 3031private HttpServletRequest request; 32private HttpServletResponse response; 33private WXPayConfigImpl config; 34/** 35* 支付 36* @return 37*/ 38@RequestMapping("/pay") 39public 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") 56public 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}100101/**102* 退款103* @return104*/105@RequestMapping("/returnPay")106public 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 block114 e.printStackTrace();115 }116 return "";117}118/**119* 提现120* @return121*/122@RequestMapping("/withdrawDeposit")123public 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 block131 e.printStackTrace();132 }133 return "";134}135public HttpServletRequest getRequest() {136 return request;137}138public void setRequest(HttpServletRequest request) {139 this.request = request;140}141public HttpServletResponse getResponse() {142 return response;143}144public void setResponse(HttpServletResponse response) {145 this.response = response;146}147148149150 }

View Code

3.接口中主要根据业务逻辑调用WXpayCommon类中的功能实现方法即可。项目中的相关代码,线上可用,copy整理出的未实测(主要需要相关参数测试,不方便),目测没毛病

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。