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 {// caTrustManagerFactory 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-Typeconn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");BufferedOutputStream out = new BufferedOutputStream(conn.getOutputStream());final int len = 1024; // 1KBHttpClientUtil.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()));elseresultString = 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 + "&timestamp=" + 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_startmap.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 blocke.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();}}}

到这里就基本完成了

java后台对接app微信支付相关推荐

  1. java+uniapp对接app微信支付

    java+uniapp对接app微信支付 1.准备工作 注册app APP接入微信支付,需要先将商户APP在微信开放平台进行注册,登记APP开发参数以生成APPID.具体操作步骤如下: 一.登录微信开 ...

  2. java 后台 小程序微信支付

    java 后台 小程序微信支付 步骤说明: 微信公众平台支付接口调试工具 #1.生成字符串: appid=appId&body=测试商品名称&mch_id=商户号&nonce_ ...

  3. 【微信支付】(亲测可用)对接app微信支付V2版本 后端代码示例

    业务场景:基本上做业务的话,也是逃不开对接各种支付接口的,比如数字人民币支付.农行免密支付.支付宝支付.微信支付等等.在着手开发时候,也是遇到不少阻力,微信官方提供的接口文档很散乱,如果之前没接触过, ...

  4. java后台提供ios微信支付接口

    提供微信支付接口,需要先在微信开放平台(https://open.weixin.qq.com/)申请账号,进行开发者资格认证通过后创建应用. 创建成功后会有对应应用的AppID和AppSecret这个 ...

  5. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  6. app微信支付-java服务端接口 支付/查询/退款

    app微信支付-java服务端接口 支付-查询-退款 个人看微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然 ...

  7. 微信公众号JAVA后台对接最全面

    微信公众号JAVA后台对接最全面 微信公众号JAVA后台对接步骤 1.环境搭建 (1)接口测试号申请拿到appid和appsecret,配置在后台配置文件!https://mp.weixin.qq.c ...

  8. IOS --app微信支付

    2019独角兽企业重金招聘Python工程师标准>>> 微信支付分为好几种,这里记录的是app微信支付流程. 适用场景 用户使用xxAPP时,需要通过微信支付完成某项报名.此时xxA ...

  9. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  10. app微信支付后端接口编写

    刚做完app微信支付,我这块主要负责的是后端,现在我将我怎么开发的以及踩过的坑给大家写出来 微信支付主要有3步, 第一步:是生成一个预付订单 第二步:第二次签名的信息传到app端 第三步:最后接受到微 ...

最新文章

  1. 练习5-2 找两个数中最大者 (10 分)
  2. AI 渗透应用程序开发的七种趋势及方法
  3. 看你的样子对Vue研究挺深的,我司招Vue,五险一金有兴趣吗?
  4. C语言-用gcc指令体验C语言编译过程
  5. .NET网络编程学习(三)
  6. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件
  7. Python简单的拼写检查
  8. MyBatis3源码解析(2)数据库连接
  9. BigDecimal 加减乘除及对比
  10. 联想Y700键盘失灵问题
  11. PPAPI开发之路(一)环境配置
  12. Ubuntu 18.04 安装 NVIDIA 显卡驱动超详细步骤
  13. python报告生成器_利用Python实现报告自动生成
  14. 计算机windows安全如何打开,windows安全中心如何关闭
  15. ABP Framework 5.3.0 版本新增功能和变更说明
  16. php redis 防超卖,redis防止抢购商品超卖
  17. 【iOS】关于keyWindow的获取
  18. Java POI的Excel操作(行高列宽比例;生成说明,标题,字段;导出Excel代码,压缩)
  19. 20.Spring学习笔记_基于配置文件的方式来配置 AOP(by尚硅谷_佟刚)
  20. JSON实例简单教程

热门文章

  1. 单片机毕业设计196例
  2. linux的显示器设置
  3. multisim 10 小知识
  4. windows 编译xvidcore-1.1.3.tar
  5. video.h5.player.js视频播放器
  6. android 谷歌地图离线访问,谷歌升级Android版地图应用 支持离线使用
  7. 2014年计算机基础知识试题及答案,2014年计算机基础知识试题及答案大全—word版...
  8. session的销毁方式
  9. 华硕A55V,终于解决了无线网指示灯不亮的问题。
  10. 【趋势分析】EXPMA四色均线指标优化版主图 通达信 东财等通用