微信支付接口文档2.7里的demo实在是看不下去了,错误百出,到网上搜了半天,全部都是把官方文档下下来让你下载,还扣你积分,操蛋。。。

微信支付JAVA 接口

首先下载官方demo,虽然很多有问题,但是很多工具类是可以用的

附上地址:https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course2_tmpl(别上人家那下还费积分)

1.请求前的拼包

[java] view plaincopy
  1. // api支付拼包------------------------------------------------------------------------------
  2. RequestHandler reqHandler = new RequestHandler(request, response);
  3. // TenpayHttpClient httpClient = new TenpayHttpClient();
  4. // TreeMap<String, String> outParams = new TreeMap<String,String>();
  5. // 初始化
  6. reqHandler.init();
  7. reqHandler.init(APP_ID,APP_SECRET, APP_KEY,PARTNER_KEY);
  8. // 当前时间 yyyyMMddHHmmss
  9. String currTime = TenpayUtil.getCurrTime();
  10. // 8位日期
  11. String strTime = currTime.substring(8, currTime.length());
  12. // 四位随机数
  13. String strRandom = TenpayUtil.buildRandom(4) + "";
  14. // 10位序列号,可以自行调整。
  15. String strReq = strTime + strRandom;
  16. // 订单号,此处用时间加随机数生成,商户根据自己情况调整,只要保持全局唯一就行
  17. String out_trade_no = strReq;
  18. // 设置package订单参数
  19. SortedMap<String, String> packageParams = new TreeMap<String, String>();
  20. packageParams.put("bank_type", "WX"); // 支付类型
  21. packageParams.put("body", "商品名称"); // 商品描述
  22. packageParams.put("fee_type", "1"); // 银行币种
  23. packageParams.put("input_charset", "UTF-8"); // 字符集
  24. packageParams.put("notify_url", "通知地址,接收交易结果,并进行业务处理,例如:http://abc.com/buy/buy.do"); // 通知地址
  25. packageParams.put("out_trade_no", out_trade_no); // 商户订单号
  26. packageParams.put("partner", PARTNER_ID); // 设置商户号
  27. packageParams.put("total_fee", "交易金额"); // 商品总金额,以分为单位
  28. packageParams.put("spbill_create_ip", request.getRemoteAddr()); // 订单生成的机器IP,指用户浏览器端IP
  29. // 获取package包
  30. String packageValue = reqHandler.genPackage(packageParams);
  31. String noncestr = Sha1Util.getNonceStr();
  32. String timestamp = Sha1Util.getTimeStamp();
  33. // 设置支付参数
  34. SortedMap<String, String> signParams = new TreeMap<String, String>();
  35. signParams.put("appid", appid);
  36. signParams.put("noncestr", noncestr);
  37. signParams.put("package", packageValue);
  38. signParams.put("timestamp", timestamp);
  39. signParams.put("appkey", appkey);
  40. // 生成支付签名,要采用URLENCODER的原始值进行SHA1算法!
  41. String sign = Sha1Util.createSHA1Sign(signParams);
  42. // 增加非参与签名的额外参数
  43. signParams.put("paySign", sign);
  44. signParams.put("signType", "SHA1");
  45. // ------------------------------------微信js
  46. // api支付拼包结束------------------------------------
  47. // --------------------------------本地系统生成订单-------------------------------------
  48. //
  49. // --------------------------------生成完成---------------------------------------------
  50. request.setAttribute("appid", appid);
  51. request.setAttribute("timestamp", timestamp);
  52. request.setAttribute("noncestr", noncestr);
  53. request.setAttribute("package", packageValue);
  54. request.setAttribute("paysign", sign);
  55. request.setAttribute("czje", czje);

英文全大写带下划线的,各位申请微信支付的时候都会给你的。

注意:微信demo里面RequestHandler 在设置商户key和appkey有点问题,ResponseHandler连postData都没获取到,下面把我修正后的贴出来做参考(注:其它java类没什么问题)

RequestHandler:

[java] view plaincopy
  1. package com.zk.common.wxpay;
  2. import java.io.UnsupportedEncodingException;
  3. import java.net.URLEncoder;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.SortedMap;
  8. import java.util.TreeMap;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import com.zk.common.wxpay.util.MD5Util;
  12. import com.zk.common.wxpay.util.TenpayUtil;
  13. /*
  14. '微信支付服务器签名支付请求请求类
  15. '============================================================================
  16. 'api说明:
  17. 'init(app_id, app_secret, partner_key, app_key);
  18. '初始化函数,默认给一些参数赋值,如cmdno,date等。
  19. 'setKey(key_)'设置商户密钥
  20. 'getLasterrCode(),获取最后错误号
  21. 'GetToken();获取Token
  22. 'getTokenReal();Token过期后实时获取Token
  23. 'createMd5Sign(signParams);生成Md5签名
  24. 'genPackage(packageParams);获取package包
  25. 'createSHA1Sign(signParams);创建签名SHA1
  26. 'sendPrepay(packageParams);提交预支付
  27. 'getDebugInfo(),获取debug信息
  28. '============================================================================
  29. '*/
  30. public class RequestHandler {
  31. /** Token获取网关地址地址 */
  32. private String tokenUrl;
  33. /** 预支付网关url地址 */
  34. private String gateUrl;
  35. /** 查询支付通知网关URL */
  36. private String notifyUrl;
  37. /** 商户参数 */
  38. private String appid;
  39. private String appkey;
  40. private String partnerkey;
  41. private String appsecret;
  42. private String key;
  43. /** 请求的参数 */
  44. private SortedMap parameters;
  45. /** Token */
  46. private String Token;
  47. private String charset;
  48. /** debug信息 */
  49. private String debugInfo;
  50. private String last_errcode;
  51. private HttpServletRequest request;
  52. private HttpServletResponse response;
  53. /**
  54. * 初始构造函数。
  55. *
  56. * @return
  57. */
  58. public RequestHandler(HttpServletRequest request,
  59. HttpServletResponse response) {
  60. this.last_errcode = "0";
  61. this.request = request;
  62. this.response = response;
  63. this.charset = "GBK";
  64. this.parameters = new TreeMap();
  65. // 验证notify支付订单网关
  66. notifyUrl = "https://gw.tenpay.com/gateway/simpleverifynotifyid.xml";
  67. }
  68. /**
  69. * 初始化函数。
  70. */
  71. public void init(String app_id, String app_secret, String app_key,
  72. String partner_key) {
  73. this.last_errcode = "0";
  74. this.Token = "token_";
  75. this.debugInfo = "";
  76. this.appkey = app_key;
  77. this.appid = app_id;
  78. this.partnerkey = partner_key;
  79. this.key = partner_key;//原demo没有,手动加上
  80. this.appsecret = app_secret;
  81. }
  82. public void init() {
  83. }
  84. /**
  85. * 获取最后错误号
  86. */
  87. public String getLasterrCode() {
  88. return last_errcode;
  89. }
  90. /**
  91. *获取入口地址,不包含参数值
  92. */
  93. public String getGateUrl() {
  94. return gateUrl;
  95. }
  96. /**
  97. * 获取参数值
  98. *
  99. * @param parameter
  100. *            参数名称
  101. * @return String
  102. */
  103. public String getParameter(String parameter) {
  104. String s = (String) this.parameters.get(parameter);
  105. return (null == s) ? "" : s;
  106. }
  107. //设置密钥
  108. public void setKey(String key) {
  109. this.partnerkey = key;
  110. }
  111. //设置微信密钥
  112. public void  setAppKey(String key){
  113. this.appkey = key;
  114. }
  115. // 特殊字符处理
  116. public String UrlEncode(String src) throws UnsupportedEncodingException {
  117. return URLEncoder.encode(src, this.charset).replace("+", "%20");
  118. }
  119. // 获取package的签名包
  120. public String genPackage(SortedMap<String, String> packageParams)
  121. throws UnsupportedEncodingException {
  122. String sign = createSign(packageParams);
  123. StringBuffer sb = new StringBuffer();
  124. Set es = packageParams.entrySet();
  125. Iterator it = es.iterator();
  126. while (it.hasNext()) {
  127. Map.Entry entry = (Map.Entry) it.next();
  128. String k = (String) entry.getKey();
  129. String v = (String) entry.getValue();
  130. sb.append(k + "=" + UrlEncode(v) + "&");
  131. }
  132. // 去掉最后一个&
  133. String packageValue = sb.append("sign=" + sign).toString();
  134. System.out.println("packageValue=" + packageValue);
  135. return packageValue;
  136. }
  137. /**
  138. * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  139. */
  140. public String createSign(SortedMap<String, String> packageParams) {
  141. StringBuffer sb = new StringBuffer();
  142. Set es = packageParams.entrySet();
  143. Iterator it = es.iterator();
  144. while (it.hasNext()) {
  145. Map.Entry entry = (Map.Entry) it.next();
  146. String k = (String) entry.getKey();
  147. String v = (String) entry.getValue();
  148. if (null != v && !"".equals(v) && !"sign".equals(k)
  149. && !"key".equals(k)) {
  150. sb.append(k + "=" + v + "&");
  151. }
  152. }
  153. sb.append("key=" + this.getKey());
  154. System.out.println("md5 sb:" + sb);
  155. String sign = MD5Util.MD5Encode(sb.toString(), this.charset)
  156. .toUpperCase();
  157. return sign;
  158. }
  159. /**
  160. * 创建package签名
  161. */
  162. public boolean createMd5Sign(String signParams) {
  163. StringBuffer sb = new StringBuffer();
  164. Set es = this.parameters.entrySet();
  165. Iterator it = es.iterator();
  166. while (it.hasNext()) {
  167. Map.Entry entry = (Map.Entry) it.next();
  168. String k = (String) entry.getKey();
  169. String v = (String) entry.getValue();
  170. if (!"sign".equals(k) && null != v && !"".equals(v)) {
  171. sb.append(k + "=" + v + "&");
  172. }
  173. }
  174. // 算出摘要
  175. String enc = TenpayUtil.getCharacterEncoding(this.request,
  176. this.response);
  177. String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
  178. String tenpaySign = this.getParameter("sign").toLowerCase();
  179. // debug信息
  180. this.setDebugInfo(sb.toString() + " => sign:" + sign + " tenpaySign:"
  181. + tenpaySign);
  182. return tenpaySign.equals(sign);
  183. }
  184. //输出XML
  185. public String parseXML() {
  186. StringBuffer sb = new StringBuffer();
  187. sb.append("<xml>");
  188. Set es = this.parameters.entrySet();
  189. Iterator it = es.iterator();
  190. while(it.hasNext()) {
  191. Map.Entry entry = (Map.Entry)it.next();
  192. String k = (String)entry.getKey();
  193. String v = (String)entry.getValue();
  194. if(null != v && !"".equals(v) && !"appkey".equals(k)) {
  195. sb.append("<" + k +">" + getParameter(k) + "</" + k + ">\n");
  196. }
  197. }
  198. sb.append("</xml>");
  199. return sb.toString();
  200. }
  201. /**
  202. * 设置debug信息
  203. */
  204. protected void setDebugInfo(String debugInfo) {
  205. this.debugInfo = debugInfo;
  206. }
  207. public void setPartnerkey(String partnerkey) {
  208. this.partnerkey = partnerkey;
  209. }
  210. public String getDebugInfo() {
  211. return debugInfo;
  212. }
  213. public String getKey() {
  214. return key;
  215. }
  216. }

ResponseHandler:

[java] view plaincopy
  1. package com.zk.common.wxpay;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.io.Reader;
  7. import java.io.UnsupportedEncodingException;
  8. import java.util.ArrayList;
  9. import java.util.Iterator;
  10. import java.util.Map;
  11. import java.util.Set;
  12. import java.util.SortedMap;
  13. import java.util.TreeMap;
  14. import com.zk.common.Parameters;
  15. import com.zk.common.wxpay.util.Sha1Util;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import org.dom4j.Document;
  19. import org.dom4j.DocumentHelper;
  20. import org.dom4j.Element;
  21. import org.jdom.JDOMException;
  22. import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
  23. import com.zk.common.wxpay.util.MD5Util;
  24. import com.zk.common.wxpay.util.TenpayUtil;
  25. import com.zk.common.wxpay.util.XMLUtil;
  26. /**
  27. * 微信支付服务器签名支付请求应答类 api说明: getKey()/setKey(),获取/设置密钥
  28. * getParameter()/setParameter(),获取/设置参数值 getAllParameters(),获取所有参数
  29. * isTenpaySign(),是否财付通签名,true:是 false:否 getDebugInfo(),获取debug信息
  30. */
  31. public class ResponseHandler {
  32. private static final String appkey = APP_KEY;
  33. /** 密钥 */
  34. private String key;
  35. /** 应答的参数 */
  36. private SortedMap parameters;
  37. /** debug信息 */
  38. private String debugInfo;
  39. private HttpServletRequest request;
  40. private HttpServletResponse response;
  41. private String uriEncoding;
  42. private Hashtable xmlMap;
  43. private SortedMap smap;
  44. public SortedMap getSmap() {
  45. return smap;
  46. }
  47. private String k;
  48. /**
  49. * 构造函数
  50. *
  51. * @param request
  52. * @param response
  53. */
  54. public ResponseHandler(HttpServletRequest request,
  55. HttpServletResponse response) {
  56. this.request = request;
  57. this.response = response;
  58. this.smap = new TreeMap<String, String>();
  59. this.key = "";
  60. this.parameters = new TreeMap();
  61. this.debugInfo = "";
  62. this.uriEncoding = "";
  63. Map m = this.request.getParameterMap();
  64. Iterator it = m.keySet().iterator();
  65. while (it.hasNext()) {
  66. String k = (String) it.next();
  67. String v = ((String[]) m.get(k))[0];
  68. this.setParameter(k, v);
  69. }
  70. BufferedReader reader  =null;
  71. try{
  72. reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
  73. StringBuilder sb = new StringBuilder();
  74. String line = null;
  75. while ((line = reader.readLine()) != null) {
  76. sb.append(line);
  77. }
  78. Document doc = DocumentHelper.parseText(sb.toString());
  79. Element root = doc.getRootElement();
  80. for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
  81. Element e = (Element) iterator.next();
  82. smap.put(e.getName(), e.getText());
  83. }
  84. }catch (Exception e) {
  85. // TODO: handle exception
  86. e.printStackTrace();
  87. }
  88. }
  89. /**
  90. * 获取密钥
  91. */
  92. public String getKey() {
  93. return key;
  94. }
  95. /**
  96. * 设置密钥
  97. */
  98. public void setKey(String key) {
  99. this.key = key;
  100. }
  101. /**
  102. * 获取参数值
  103. *
  104. * @param parameter
  105. *            参数名称
  106. * @return String
  107. */
  108. public String getParameter(String parameter) {
  109. String s = (String) this.parameters.get(parameter);
  110. return (null == s) ? "" : s;
  111. }
  112. /**
  113. * 设置参数值
  114. *
  115. * @param parameter
  116. *            参数名称
  117. * @param parameterValue
  118. *            参数值
  119. */
  120. public void setParameter(String parameter, String parameterValue) {
  121. String v = "";
  122. if (null != parameterValue) {
  123. v = parameterValue.trim();
  124. }
  125. this.parameters.put(parameter, v);
  126. }
  127. /**
  128. * 返回所有的参数
  129. *
  130. * @return SortedMap
  131. */
  132. public SortedMap getAllParameters() {
  133. return this.parameters;
  134. }
  135. public void doParse(String xmlContent) throws JDOMException, IOException {
  136. this.parameters.clear();
  137. // 解析xml,得到map
  138. Map m = XMLUtil.doXMLParse(xmlContent);
  139. // 设置参数
  140. Iterator it = m.keySet().iterator();
  141. while (it.hasNext()) {
  142. String k = (String) it.next();
  143. String v = (String) m.get(k);
  144. this.setParameter(k, v);
  145. }
  146. }
  147. /**
  148. * 是否财付通签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  149. *
  150. * @return boolean
  151. */
  152. public boolean isValidSign() {
  153. StringBuffer sb = new StringBuffer();
  154. Set es = this.parameters.entrySet();
  155. Iterator it = es.iterator();
  156. while (it.hasNext()) {
  157. Map.Entry entry = (Map.Entry) it.next();
  158. String k = (String) entry.getKey();
  159. String v = (String) entry.getValue();
  160. if (!"sign".equals(k) && null != v && !"".equals(v)) {
  161. sb.append(k + "=" + v + "&");
  162. }
  163. }
  164. sb.append("key=" + this.getKey());
  165. // 算出摘要
  166. String enc = TenpayUtil.getCharacterEncoding(this.request,
  167. this.response);
  168. String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
  169. String ValidSign = this.getParameter("sign").toLowerCase();
  170. // debug信息
  171. this.setDebugInfo(sb.toString() + " => sign:" + sign + " ValidSign:"
  172. + ValidSign);
  173. System.out.println("财付通签名:"+this.getDebugInfo());
  174. return ValidSign.equals(sign);
  175. }
  176. /**
  177. * 判断微信签名
  178. */
  179. public boolean isWXsign() {
  180. StringBuffer sb = new StringBuffer();
  181. String keys = "";
  182. SortedMap<String, String> signParams = new TreeMap<String, String>();
  183. Set es = this.smap.entrySet();
  184. Iterator it = es.iterator();
  185. while (it.hasNext()) {
  186. Map.Entry entry = (Map.Entry) it.next();
  187. String k = (String) entry.getKey();
  188. String v = (String) entry.getValue();
  189. if (k != "SignMethod" && k != "AppSignature") {
  190. signParams.put(k.toLowerCase(), v);
  191. }
  192. }
  193. signParams.put("appkey", this.appkey);
  194. Set set = signParams.entrySet();
  195. Iterator pit = set.iterator();
  196. while (pit.hasNext()) {
  197. Map.Entry entry = (Map.Entry) pit.next();
  198. String k = (String) entry.getKey();
  199. String v = (String) entry.getValue();
  200. if (sb.length() == 0) {
  201. sb.append(k + "=" + v);
  202. } else {
  203. sb.append("&" + k + "=" + v);
  204. }
  205. }
  206. String sign = Sha1Util.getSha1(sb.toString()).toString().toLowerCase();
  207. this.setDebugInfo(sb.toString() + " => SHA1 sign:" + sign);
  208. return sign.equals(this.smap.get("AppSignature"));
  209. }
  210. // 判断微信维权签名
  211. public boolean isWXsignfeedback() {
  212. StringBuffer sb = new StringBuffer();
  213. Hashtable signMap = new Hashtable();
  214. Set es = this.parameters.entrySet();
  215. Iterator it = es.iterator();
  216. while (it.hasNext()) {
  217. Map.Entry entry = (Map.Entry) it.next();
  218. String k = (String) entry.getKey();
  219. String v = (String) entry.getValue();
  220. if (k != "SignMethod" && k != "AppSignature") {
  221. sb.append(k + "=" + v + "&");
  222. }
  223. }
  224. signMap.put("appkey", this.appkey);
  225. // ArrayList akeys = new ArrayList();
  226. // akeys.Sort();
  227. while (it.hasNext()) {
  228. String v = k;
  229. if (sb.length() == 0) {
  230. sb.append(k + "=" + v);
  231. } else {
  232. sb.append("&" + k + "=" + v);
  233. }
  234. }
  235. String sign = Sha1Util.getSha1(sb.toString()).toString().toLowerCase();
  236. this.setDebugInfo(sb.toString() + " => SHA1 sign:" + sign);
  237. return sign.equals(this.smap.get("AppSignature"));
  238. }
  239. /**
  240. * 返回处理结果给财付通服务器。
  241. *
  242. * @param msg
  243. *            Success or fail
  244. * @throws IOException
  245. */
  246. public void sendToCFT(String msg) throws IOException {
  247. String strHtml = msg;
  248. PrintWriter out = this.getHttpServletResponse().getWriter();
  249. out.println(strHtml);
  250. out.flush();
  251. out.close();
  252. }
  253. /**
  254. * 获取uri编码
  255. *
  256. * @return String
  257. */
  258. public String getUriEncoding() {
  259. return uriEncoding;
  260. }
  261. /**
  262. * 设置uri编码
  263. *
  264. * @param uriEncoding
  265. * @throws UnsupportedEncodingException
  266. */
  267. public void setUriEncoding(String uriEncoding)
  268. throws UnsupportedEncodingException {
  269. if (!"".equals(uriEncoding.trim())) {
  270. this.uriEncoding = uriEncoding;
  271. // 编码转换
  272. String enc = TenpayUtil.getCharacterEncoding(request, response);
  273. Iterator it = this.parameters.keySet().iterator();
  274. while (it.hasNext()) {
  275. String k = (String) it.next();
  276. String v = this.getParameter(k);
  277. v = new String(v.getBytes(uriEncoding.trim()), enc);
  278. this.setParameter(k, v);
  279. }
  280. }
  281. }
  282. /**
  283. * 获取debug信息
  284. */
  285. public String getDebugInfo() {
  286. return debugInfo;
  287. }
  288. /**
  289. * 设置debug信息
  290. */
  291. protected void setDebugInfo(String debugInfo) {
  292. this.debugInfo = debugInfo;
  293. }
  294. protected HttpServletRequest getHttpServletRequest() {
  295. return this.request;
  296. }
  297. protected HttpServletResponse getHttpServletResponse() {
  298. return this.response;
  299. }
  300. }

2.Jsapi调用

在第一步中已拼好包放入request中了,第二部js调用微信api,看代码:

[javascript] view plaincopy
  1. <script type="text/javascript">
  2. function callpay(){
  3. WeixinJSBridge.invoke('getBrandWCPayRequest',{
  4. "appId" : "${appid}","timeStamp" : "${timestamp}", "nonceStr" : "${noncestr}", "package"                    : "${package}","signType" : "SHA1", "paySign" : "${paysign}"
  5. },function(res){
  6. WeixinJSBridge.log(res.err_msg);
  7. if(res.err_msg == "get_brand_wcpay_request:ok"){
  8. alert("微信支付成功");
  9. }else if(res.err_msg == "get_brand_wcpay_request:cancel"){
  10. alert("用户取消支付");
  11. }else{
  12. alert("支付失败");
  13. }
  14. });
  15. }
  16. </script>

点击支付按钮,调用callpay 即可。

3.微信支付后的通知接口

支付成功了,微信根据你提供的notify_url,来通知你支付成功与否,虽然js里知道了结果,但这里需要正式通知,并处理业务,下面是我的代码片段:

[java] view plaincopy
  1. System.out.println("-----------------微信支付来消息啦--------------------------");
  2. ResponseHandler resHandler = new ResponseHandler(request,response);
  3. resHandler.setKey(PARTNER_KEY);
  4. if (resHandler.isValidSign() == true) {
  5. if (resHandler.isWXsign() == true) {
  6. // 商户订单号
  7. String out_trade_no = resHandler
  8. .getParameter("out_trade_no");
  9. // 财付通订单号
  10. String transaction_id = resHandler
  11. .getParameter("transaction_id");
  12. // 金额,以分为单位
  13. String total_fee = resHandler.getParameter("total_fee");
  14. // 如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
  15. String discount = resHandler.getParameter("discount");
  16. // 支付结果
  17. String trade_state = resHandler
  18. .getParameter("trade_state");
  19. System.out.println("支付的订单号:" + out_trade_no);
  20. // 判断签名及结果
  21. if ("0".equals(trade_state)) {
  22. System.out.println("哈哈,微信支付成功了");
  23. // ------------------------------
  24. // 即时到账处理业务开始
  25. // ------------------------------
  26. // 处理数据库逻辑
  27. // 注意交易单不要重复处理
  28. // 注意判断返回金额
  29. // ------------------------------
  30. // 即时到账处理业务完毕
  31. // ------------------------------
  32. System.out.println("success 后台通知成功");
  33. // 给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知
  34. resHandler.sendToCFT("success");
  35. } else {// sha1签名失败
  36. System.out.println("fail -SHA1 failed");
  37. resHandler.sendToCFT("fail");
  38. }
  39. } else {// MD5签名失败
  40. System.out.println("fail -Md5 failed");
  41. }
  42. }

到这里OK了,支付接口完成了。

别忘了,还有维权接口,维权接口很简单,接收维权的数据,然后通过api告知微信处理结果就ok了。

看完了记得顶一下哦。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

微信支付 JAVA实现相关推荐

  1. java微信web支付开发_微信支付java开发详细第三方支付功能开发之支付宝web端支...

    这段时间把支付基本搞完了,因为做的过程中遇到许多问题,特地记录下来,同时方便其他java coder,废话少说,下面开始. 整体思路:在后台,根据参数创建支付宝客户端AlipayClient,发送参数 ...

  2. 微信刷卡 sdk java_微信支付 Java SDK

    微信支付 Java SDK 对微信支付开发者文档中给出的API进行了封装. com.github.wxpay.sdk.WXPay类下提供了对应的方法: 方法名 说明microPay 刷卡支付 unif ...

  3. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  4. 微信支付查询订单java_微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; ...

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

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

  6. 微信支付-java实现微信支付-后端篇

    微信支付系列文章 微信支付-java后端实现 微信支付-vue 前端实现 java demo: 下载地址文章底部 技术栈 Spring boot java XML (微信在http协议中数据传输方案) ...

  7. 微信支付java版v2.0_刷卡支付-翟东平-专题视频课程

    微信支付java版v2.0_刷卡支付-1814人已学习 课程介绍         微信支付系列课程将讲解"刷卡支付"."扫码支付"."公众号支付&qu ...

  8. 视频教程-企业微信支付JAVA版_向员工收款-微信开发

    企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...

  9. 微信支付java helloworld_10行代码搞定微信支付(Java版)

    微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与对象的互转, 微信使用xml格式而不使用jso ...

最新文章

  1. P1051 谁拿了最多奖学金
  2. jbpm 4.3 与 spring 集成
  3. JVM - 实现自定义的ClassLoader就是这么简单
  4. H3C 2126 限速后的问题
  5. html大学生活主题班会,“大学生活”主题班会记录范文
  6. Akka并发编程——第二节:Actor模型(一)
  7. 基础编程题目集 6-8 简单阶乘计算 (10 分)
  8. 专业设计师是哪里找到高质量素材的!
  9. Python基础(注释/算数运算符/变量类型/拼接字符串)
  10. android网格布局间距,android – 删除回收站视图网格布局中的默认间距
  11. 用c 语言创建web项目,使用Maven创建Web应用程序项目
  12. Selenium2用最简xpath查找元素
  13. Choerodon猪齿鱼实践之开发应用服务
  14. CDN基础知识-CNAME、加速域名、源站地址与回源host之间的关系
  15. 阿里云ACP大数据工程师认证,ACP,阿里云ACP认证,阿里云认证,大数据工程师认证
  16. Java循环控制语句
  17. 23种设计模式,你学废了嘛?【建议收藏起来】
  18. kubernetes搭建 二、Etcd集群
  19. php cgminer,CGMINER中各个参数代表的意义(挖矿黑框参数)
  20. PyAutoGUI应用

热门文章

  1. (含源码下载)利用Pytorch搭建GPU视觉处理接口
  2. 计算机自动配置的ip地址,电脑自动获取IP地址的设置方法(图文)
  3. python显示图片透明度怎么调,如何使jpg图像半透明?
  4. WINDOWS 所有系统文件的用途
  5. 正在颠覆技术栈,一文看懂网易数帆轻舟云原生交付实践
  6. POJ 1974 The Happy Worm C++ 排序 模拟
  7. KK-200铝合金散热器真空钎焊工艺研究
  8. 入侵Oracle数据库常用操作命令
  9. 评测三款最流行的mobi阅读器
  10. 推荐一款 批量文本编码转换的软件 —— 超级批量编码转换