java后台对接app微信支付
2018-12-03 13:22
585 查看
java后台对接app微信支付
一开始对接微信支付也是云里雾里,找了很多资料,参考大佬们的案例 好在最后还是完成了 记录一下我是怎么完成的,希望能帮到后来者,也有助于自己以后回顾
1:申请微信支付
首先要申请微信支付,申请通过之后会收到一个邮件 里面会有 商户号和appid等信息
2:获取必要参数
到微信的商户平台通过安装证书等一系列操作获取密钥key,然后到微信开发平台获取app的APP_SECRET
3:后台代码(工具类)
package com.tenpay.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; public class HttpClientUtil { /** * http客户端工具类 * */ public static final String SunX509 = "SunX509"; public static final String JKS = "JKS"; public static final String PKCS12 = "PKCS12"; public static final String TLS = "TLS"; /** * get HttpURLConnection * @param strUrl url地址 * @return HttpURLConnection * @throws IOException */ public static HttpURLConnection getHttpURLConnection(String strUrl) throws IOException { URL url = new URL(strUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); return httpURLConnection; } /** * get HttpsURLConnection * @param strUrl url地址ַ * @return HttpsURLConnection * @throws IOException */ public static HttpsURLConnection getHttpsURLConnection(String strUrl) throws IOException { URL url = new URL(strUrl); HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url .openConnection(); return httpsURLConnection; } /** * 获取不带查询串的url * @param strUrl * @return String */ public static String getURL(String strUrl) { if(null != strUrl) { int indexOf = strUrl.indexOf("?"); if(-1 != indexOf) { return strUrl.substring(0, indexOf); } return strUrl; } return strUrl; } /** * 获取查询串 * @param strUrl * @return String */ public static String getQueryString(String strUrl) { if(null != strUrl) { int indexOf = strUrl.indexOf("?"); if(-1 != indexOf) { return strUrl.substring(indexOf+1, strUrl.length()); } return ""; } return strUrl; } /** * 查询字符串转化为map * name1=key1&name2=key2&... * @param queryString * @return */ public static Map queryString2Map(String queryString) { if(null == queryString || "".equals(queryString)) { return null; } Map m = new HashMap(); String[] strArray = queryString.split("&"); for(int index = 0; index < strArray.length; index++) { String pair = strArray[index]; HttpClientUtil.putMapByPair(pair, m); } return m; } /** * 把键值添加到map * pair:name=value * @param pair name=value * @param m */ public static void putMapByPair(String pair, Map m) { if(null == pair || "".equals(pair)) { return; } int indexOf = pair.indexOf("="); if(-1 != indexOf) { String k = pair.substring(0, indexOf); String v = pair.substring(indexOf+1, pair.length()); if(null != k && !"".equals(k)) { m.put(k, v); } } else { m.put(pair, ""); } } /** * BufferedReader转换成String<br/> * 注意:流关闭需要自行处理 * @param reader * @return * @throws IOException */ public static String bufferedReader2String(BufferedReader reader) throws IOException { StringBuffer buf = new StringBuffer(); String line = null; while( (line = reader.readLine()) != null) { buf.append(line); buf.append("\r\n"); } return buf.toString(); } /** * 处理输出<br/> * 注意:流关闭需要自行处理 * @param out * @param data * @param len * @throws IOException */ public static void doOutput(OutputStream out, byte[] data, int len) throws IOException { int dataLen = data.length; int off = 0; while (off < data.length) { if (len >= dataLen) { out.write(data, off, dataLen); off += dataLen; } else { out.write(data, off, len); off += len; dataLen -= len; } // ˢ�»����� out.flush(); } } /** * 获取SSLContext * @param trustFile * @param trustPasswd * @param keyFile * @param keyPasswd * @return * @throws NoSuchAlgorithmException * @throws KeyStoreException * @throws IOException * @throws CertificateException * @throws UnrecoverableKeyException * @throws KeyManagementException */ public static SSLContext getSSLContext( FileInputStream trustFileInputStream, String trustPasswd, FileInputStream keyFileInputStream, String keyPasswd) throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException { // ca TrustManagerFactory tmf = TrustManagerFactory.getInstance(HttpClientUtil.SunX509); KeyStore trustKeyStore = KeyStore.getInstance(HttpClientUtil.JKS); trustKeyStore.load(trustFileInputStream, HttpClientUtil .str2CharArray(trustPasswd)); tmf.init(trustKeyStore); final char[] kp = HttpClientUtil.str2CharArray(keyPasswd); KeyManagerFactory kmf = KeyManagerFactory.getInstance(HttpClientUtil.SunX509); KeyStore ks = KeyStore.getInstance(HttpClientUtil.PKCS12); ks.load(keyFileInputStream, kp); kmf.init(ks, kp); SecureRandom rand = new SecureRandom(); SSLContext ctx = SSLContext.getInstance(HttpClientUtil.TLS); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), rand); return ctx; } /** * 字符串转换成char数组 * @param str * @return char[] */ public static char[] str2CharArray(String str) { if(null == str) return null; return str.toCharArray(); } public static InputStream String2Inputstream(String str) { return new ByteArrayInputStream(str.getBytes()); } /** * InputStream转换成Byte * 注意:流关闭需要自行处理 * @param in * @return byte * @throws Exception */ public static byte[] InputStreamTOByte(InputStream in) throws IOException{ int BUFFER_SIZE = 4096; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[BUFFER_SIZE]; int count = -1; while((count = in.read(data,0,BUFFER_SIZE)) != -1) outStream.write(data, 0, count); data = null; byte[] outByte = outStream.toByteArray(); outStream.close(); return outByte; } /** * InputStream转换成String * 注意:流关闭需要自行处理 * @param in * @param encoding 编码 * @return String * @throws Exception */ public static String InputStreamTOString(InputStream in,String encoding) throws IOException{ return new String(InputStreamTOByte(in),encoding); } }
package com.tenpay.client; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import com.tenpay.util.HttpClientUtil; public class TenpayHttpClient { /** 请求内容,无论post和get,都用get方式提供 */ private String reqContent; /** 应答内容 */ private String resContent; /** 请求方法 */ private String method; /** 错误信息 */ private String errInfo; /** 超时时间,以秒为单位 */ private int timeOut; /** http应答编码 */ private int responseCode; /** 字符编码 */ private String charset; private InputStream inputStream; public TenpayHttpClient() { this.reqContent = ""; this.resContent = ""; this.method = "POST"; this.errInfo = ""; this.timeOut = 30;//30秒 this.responseCode = 0; this.charset = "utf8"; this.inputStream = null; } /** * 设置请求内容 * @param reqContent 表求内容 */ public void setReqContent(String reqContent) { this.reqContent = reqContent; } /** * 获取结果内容 * @return String * @throws IOException */ public String getResContent() { try { this.doResponse(); } catch (IOException e) { this.errInfo = e.getMessage(); //return ""; } return this.resContent; } /** * 设置请求方法post或者get * @param method 请求方法post/get */ public void setMethod(String method) { this.method = method; } /** * 获取错误信息 * @return String */ public String getErrInfo() { return this.errInfo; } /** * 设置超时时间,以秒为单位 * @param timeOut 超时时间,以秒为单位 */ public void setTimeOut(int timeOut) { this.timeOut = timeOut; } /** * 获取http状态码 * @return int */ public int getResponseCode() { return this.responseCode; } protected void callHttp() throws IOException { if("POST".equals(this.method.toUpperCase())) { String url = HttpClientUtil.getURL(this.reqContent); String queryString = HttpClientUtil.getQueryString(this.reqContent); byte[] postData = queryString.getBytes(this.charset); this.httpPostMethod(url, postData); return ; } this.httpGetMethod(this.reqContent); } public boolean callHttpPost(String url, String postdata) { boolean flag = false; byte[] postData; try { postData = postdata.getBytes(this.charset); this.httpPostMethod(url, postData); flag = true; } catch (IOException e1) { e1.printStackTrace(); } return flag; } /** * 以http post方式通信 * @param url * @param postData * @throws IOException */ protected void httpPostMethod(String url, byte[] postData) throws IOException { HttpURLConnection conn = HttpClientUtil.getHttpURLConnection(url); this.doPost(conn, postData); } /** * 以http get方式通信 * * @param url * @throws IOException */ protected void httpGetMethod(String url) throws IOException { HttpURLConnection httpConnection = HttpClientUtil.getHttpURLConnection(url); this.setHttpRequest(httpConnection); httpConnection.setRequestMethod("GET"); this.responseCode = httpConnection.getResponseCode(); this.inputStream = httpConnection.getInputStream(); } /** * 以https get方式通信 * @param url * @param sslContext * @throws IOException */ protected void httpsGetMethod(String url, SSLContext sslContext) throws IOException { SSLSocketFactory sf = sslContext.getSocketFactory(); HttpsURLConnection conn = HttpClientUtil.getHttpsURLConnection(url); conn.setSSLSocketFactory(sf); this.doGet(conn); } protected void httpsPostMethod(String url, byte[] postData, SSLContext sslContext) throws IOException { SSLSocketFactory sf = sslContext.getSocketFactory(); HttpsURLConnection conn = HttpClientUtil.getHttpsURLConnection(url); conn.setSSLSocketFactory(sf); this.doPost(conn, postData); } /** * 设置http请求默认属性 * @param httpConnection */ protected void setHttpRequest(HttpURLConnection httpConnection) { //设置连接超时时间 httpConnection.setConnectTimeout(this.timeOut * 1000); //不使用缓存 httpConnection.setUseCaches(false); //允许输入输出 httpConnection.setDoInput(true); httpConnection.setDoOutput(true); } /** * 处理应答 * @throws IOException */ protected void doResponse() throws IOException { if(null == this.inputStream) { return; } //获取应答内容 this.resContent=HttpClientUtil.InputStreamTOString(this.inputStream,this.charset); //关闭输入流 this.inputStream.close(); } /** * post方式处理 * @param conn * @param postData * @throws IOException */ protected void doPost(HttpURLConnection conn, byte[] postData) throws IOException { // 以post方式通信 conn.setRequestMethod("POST"); // 设置请求默认属性 this.setHttpRequest(conn); // Content-Type conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); BufferedOutputStream out = new BufferedOutputStream(conn .getOutputStream()); final int len = 1024; // 1KB HttpClientUtil.doOutput(out, postData, len); // 关闭流 out.close(); // 获取响应返回状态码 this.responseCode = conn.getResponseCode(); // 获取应答输入流 this.inputStream = conn.getInputStream(); } /** * get方式处理 * @param conn * @throws IOException */ protected void doGet(HttpURLConnection conn) throws IOException { //以GET方式通信 conn.setRequestMethod("GET"); //设置请求默认属性 this.setHttpRequest(conn); //获取响应返回状态码 this.responseCode = conn.getResponseCode(); //获取应答输入流 this.inputStream = conn.getInputStream(); } }
package com.tenpay; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.tenpay.client.TenpayHttpClient; import com.tenpay.util.ConstantUtil; import com.tenpay.util.MD5Util; import com.tenpay.util.XMLUtil; public class PrepayIdRequestHandler extends RequestHandler { public PrepayIdRequestHandler(HttpServletRequest request, HttpServletResponse response) { super(request, response); } public String createMD5Sign() { StringBuffer sb = new StringBuffer(); Set es = super.getAllParameters().entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); sb.append(k + "=" + v + "&"); } String params=sb.append("key="+ConstantUtil.APP_KEY).substring(0); String sign = MD5Util.MD5Encode(params, "utf8"); return sign.toUpperCase(); } // 提交预支付 public String sendPrepay() throws Exception { String prepayid = ""; Set es=super.getAllParameters().entrySet(); Iterator it=es.iterator(); StringBuffer sb = new StringBuffer("<xml>"); while(it.hasNext()){ Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); sb.append("<"+k+">"+v+"</"+k+">"); } sb.append("</xml>"); String params=sb.substring(0); System.out.println("请求参数:"+params); String requestUrl = super.getGateUrl(); System.out.println("请求url:"+requestUrl); TenpayHttpClient httpClient = new TenpayHttpClient(); httpClient.setReqContent(requestUrl); String resContent = ""; if (httpClient.callHttpPost(requestUrl, params)) { resContent = httpClient.getResContent(); System.out.println("获取prepayid的返回值:"+resContent); Map<String,String> map=XMLUtil.doXMLParse(resContent); if(map.containsKey("prepay_id")) prepayid=map.get("prepay_id"); } return prepayid; } }
package com.tenpay.util; import java.util.Random; public class WXUtil { /** * 生成随机字符串 * @return */ public static String getNonceStr() { Random random = new Random(); return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "utf8"); } /** * 获取时间戳 * @return */ public static String getTimeStamp() { return String.valueOf(System.currentTimeMillis() / 1000); } }
package com.tenpay.util; import java.util.Date; public class UUID { private static Date date = new Date(); private static StringBuilder buf = new StringBuilder(); private static int seq = 0; private static final int ROTATION = 99999; public static synchronized long next() { if (seq > ROTATION) seq = 0; buf.delete(0, buf.length()); date.setTime(System.currentTimeMillis()); String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++); return Long.parseLong(str); } private UUID(){ } }
package com.tenpay.util; import java.security.MessageDigest; public class MD5Util { /** * MD5加密 * @param b * @return */ private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; }
package com.tenpay.util; public class ConstantUtil { /** * 微信开发平台应用ID */ public static final String APP_ID="wx1ebc0edb8656a12d"; //wx1ebc0edb8656a12e /** * 应用对应的凭证 */ public static final String APP_SECRET="0e99e39f85e566a35f31b7bbd7cfd161"; //0e99e39f85e566a35f31b7bbd7cfd169 /** * 应用对应的密钥 */ public static final String APP_KEY="dfsfdvdfvgk32423423oGdfsfdsvBO68"; //dfsfdvdfvgk56423423oGdfsfdsvBO66 /** * 微信支付商户号 */ public static final String MCH_ID="1517726062"; //1517726061 /** * 商品描述 */ public static final String BODY="pay"; /** * 商户id */ public static final String PARTNER_ID="1517726062";//这个不一定相同 /** * 获取预支付id的接口url */ public static String GATEURL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; /** * 微信服务器回调通知url */ public static String NOTIFY_URL="http://localhost/control/app_weixpayCallBack"; }
3:前面基本都是工具类,在这里做业务实现返回给前端吊起支付
// An highlighted block package com.huabang.ofo.utils.weixin.Utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.RandomStringUtils; import com.alibaba.fastjson.JSONObject; import com.huabang.ofo.domain.HbOrder; import com.huabang.ofo.domain.HbUser; import com.huabang.ofo.domain.HbUserCash; import com.huabang.ofo.service.UsersService; import com.tenpay.PrepayIdRequestHandler; import com.tenpay.util.ConstantUtil; import com.tenpay.util.MD5Util; import com.tenpay.util.UUID; import com.tenpay.util.WXUtil; /** * 微信支付测试 */ public class WeixinPayUtil { private UsersService userServiceImpl; private String out_trade_no = ""; public WeixinPayUtil(UsersService userServiceImpl) { this.userServiceImpl = userServiceImpl; } public JSONObject pay(HttpServletRequest request, HttpServletResponse response) { JSONObject object = new JSONObject(); HashMap<String,Object> mymap=new HashMap<>(); Map<String, Object> map = new HashMap<String, Object>(); // 获取生成预支付订单的请求类 PrepayIdRequestHandler prepayReqHandler = new PrepayIdRequestHandler(request, response); String totalFee =request.getAttribute("totalMoney").toString(); int total_fee=(int) (Float.valueOf(totalFee)*100);//金额单位默认是分 prepayReqHandler.setParameter("appid", ConstantUtil.APP_ID); prepayReqHandler.setParameter("body", ConstantUtil.BODY); prepayReqHandler.setParameter("mch_id", ConstantUtil.MCH_ID); String nonce_str = WXUtil.getNonceStr(); prepayReqHandler.setParameter("nonce_str", nonce_str); prepayReqHandler.setParameter("notify_url", ConstantUtil.NOTIFY_URL); out_trade_no = String.valueOf(UUID.next()); prepayReqHandler.setParameter("out_trade_no", out_trade_no); prepayReqHandler.setParameter("spbill_create_ip", request.getRemoteAddr()); String timestamp = WXUtil.getTimeStamp(); prepayReqHandler.setParameter("time_start", timestamp); System.out.println(String.valueOf(total_fee)); prepayReqHandler.setParameter("total_fee", String.valueOf(total_fee)); prepayReqHandler.setParameter("trade_type", "APP"); prepayReqHandler.setParameter("sign", prepayReqHandler.createMD5Sign()); prepayReqHandler.setGateUrl(ConstantUtil.GATEURL); /** * 注意签名(sign)的生成方式,具体见官方文档(传参都要参与生成签名,且参数名按照字典序排序,最后接上APP_KEY,转化成大写) */ try { HbUser user = this.userServiceImpl.selectUserObject(String.valueOf(request.getAttribute("telephone"))); if(user==null){ object.put("msg", "该手机用户不存在"); object.put("code", "400"); return object; } String numeric = System.currentTimeMillis() + RandomStringUtils.randomNumeric(6); String type = String.valueOf(request.getAttribute("type")); HbOrder order = new HbOrder(); if (type.equals("0")) { // 押金 HbUserCash cash = new HbUserCash(); cash.setUserId(user.getUserId()); cash.setUserAccountMoney(String.valueOf(request.getAttribute("money"))); cash.setUserCash(Double.parseDouble(String.valueOf(request.getAttribute("cashMoney")))); cash.setUserCashType(Integer.parseInt(String.valueOf(request.getAttribute("cashType")))); cash.setUserCashStatus(2); //保存押金信息 this.userServiceImpl.saveUserCash(cash); order.setOrderType(0); order.setOrderCashId(user.getUserId()); }else{//充值 order.setOrderType(1); order.setOrderCashId(null); } order.setOrderId(numeric); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); order.setOrderCreatetime(format.parse(format.format(new Date()))); order.setOrderPrice(Double.parseDouble(String.valueOf(request.getAttribute("totalMoney")))); order.setOrderUserid(user.getUserId()); this.userServiceImpl.saveOrder(order); String prepayid = prepayReqHandler.sendPrepay(); // 若获取prepayid成功,将相关信息返回客户端 if (prepayid != null && !prepayid.equals("")) { String signs = "appid=" + ConstantUtil.APP_ID + "&noncestr=" + nonce_str + "&package=Sign=WXPay&partnerid=" + ConstantUtil.PARTNER_ID + "&prepayid=" + prepayid + "×tamp=" + timestamp + "&key=" + ConstantUtil.APP_KEY; map.put("code", 0); map.put("info", "success"); map.put("prepayid", prepayid); /** * 签名方式与上面类似 */ map.put("sign", MD5Util.MD5Encode(signs, "utf8").toUpperCase()); map.put("appid", ConstantUtil.APP_ID); map.put("timestamp", timestamp); //等于请求prepayId时的time_start map.put("noncestr", nonce_str); //与请求prepayId时值一致 map.put("package", "Sign=WXPay"); //固定常量 map.put("partnerid", ConstantUtil.PARTNER_ID); mymap.put("sdk",map); object.put("data", mymap); object.put("code", "200"); object.put("msg", "获取签名成功"); } else { object.put("code", "400"); object.put("msg", "获取签名失败"); } } catch (Exception e) { e.printStackTrace(); object.put("code", "400"); object.put("msg", "获取签名失败"); } return object; } }
微信支付回调方法 (这里可以写自己的业务处理,重点是要回一个支付成功的信息)
@Override @Transactional(propagation=Propagation.REQUIRED) public void weixhuiDiao(HttpServletRequest request,HttpServletResponse response) throws Exception{ System.out.println("微信支付回调"); PrintWriter writer = response.getWriter(); 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 result = new String(outSteam.toByteArray(), "utf-8"); System.out.println("微信支付通知结果:" + result); Map<String, String> map = null; try { /** * 解析微信通知返回的信息 */ map = XMLUtil.doXMLParse(result); } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("=========:"+result); // 若支付成功,则告知微信服务器收到通知 if (map.get("return_code").equals("SUCCESS")) { if (map.get("result_code").equals("SUCCESS")) { System.out.println("充值成功!"); //通过自定义的订单号将该订单查询出来 String string = Long.valueOf(map.get("out_trade_no")).toString(); HbOrder order = this.hbOrdersMapper.selectByPrimaryKey(string); if(order.getOrderCashId() == null){//充值 HbUser user = this.hbuserMapper.selectByPrimaryKey(order.getOrderUserid()); HbAccount account = this.hbAccountMapper.selectByUserId(user.getUserId()); account.setAccountTotel(String.valueOf(Double.parseDouble(account.getAccountTotel())+order.getOrderPrice())); account.setAccountPay(Double.parseDouble(account.getAccountTotel())); this.hbAccountMapper.updateByPrimaryKey(account); //修改订单状态 hbOrdersMapper.updateStatus(request.getParameter("out_trade_no"),"1"); }else{ // 押金 //押金的修改 String orderCashId = order.getOrderCashId(); HbUserCash cash = this.hbUserCashMapper.selectByPrimaryKey(orderCashId); cash.setUserCashStatus(0); this.hbUserCashMapper.updateByPrimaryKeySelective(cash); //用户账户余额的修改 if(cash.getUserAccountMoney()!=null ||cash.getUserAccountMoney().equals("") ){ HbAccount account = this.hbAccountMapper.selectByUserId(order.getOrderUserid()); account.setAccountTotel(String.valueOf(Double.parseDouble(account.getAccountTotel())+Double.parseDouble(cash.getUserAccountMoney()))); account.setAccountPay(Double.parseDouble(account.getAccountTotel())); // this.hbAccountMapper.updateByPrimaryKeySelective(account); } //修改订单状态 hbOrdersMapper.updateStatus(request.getParameter("out_trade_no"),"1"); //修改用户的认证状态 HbUser user = this.hbuserMapper.selectByPrimaryKey(orderCashId); user.setUserApprove(1); this.hbuserMapper.updateByPrimaryKeySelective(user); } System.out.println("订单号:"+Long.valueOf(map.get("out_trade_no"))); System.out.println("通知微信后台"); String notifyStr = XMLUtil.setXML("SUCCESS", ""); writer.write(notifyStr); writer.flush(); } } }
到这里就基本完成了
相关文章推荐
- 手把手教你完成App支付JAVA后台-微信支付JAVA
- APP微信支付(java后台_统一下单和回调)
- java--spring boot微信支付服务端实现含代码(app支付、扫码支付等)
- app微信退款接口Java 后台
- app集成微信支付服务器端开发(java)
- 微信支付 APP支付 Java 服务器端
- 微信APP支付-Java后台实现
- APP后台API文档管理对接(APP后台框架五)
- 微信小程序-统一下单、微信支付(Java后台)
- 三方 app微信支付 java后端实现
- 微信APP支付-Java后台实现
- 微信支付---APP调起微信支付c#后台接口
- java微信支付对接之统一下单对接
- 支付宝APP支付(Java后台生成签名具体步骤)
- Java 从零开始实现微信支付(后台)
- App支付java后台使用EBS5_外联平台对账
- 关于APP请求跨域问题,JAVA后台配置
- 微信支付 Java后台接口
- 微信支付Java后台和Android的接入
- 第三方APP微信支付Java服务端构建步骤