微信支付 JAVA实现

2024-05-16 01:38
文章标签 微信 java 支付 实现

本文主要是介绍微信支付 JAVA实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

微信支付JAVA 接口

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

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

 

1.请求前的拼包

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


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

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

 RequestHandler:

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

 

ResponseHandler:

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

 

2.Jsapi调用

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

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


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

 

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

 

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

 

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

这篇关于微信支付 JAVA实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993512

相关文章

SpringMVC+Hibernate +MySql+ EasyUI实现CRUD

SpringMVC+Hibernate +MySql+ EasyUI实现CRUD 原文地址 http://my.oschina.net/xshuai/blog/345117

企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作完善中...SpringMVC+JSP)

关于即时到账的开发。审核通过。简单测试如下。 希望看的可以收藏或者赞一下哦。 1.拥有自己的支付宝企业账号。去产品商店选择适合自己的方案。并签约合同。 2.选择合适的商家收款产品并去签约。填写相应的信息 3.在商家服务会有PID和KEY是关键的东西。 4.选择自己签约的产品类型,下载对应的接口api与测试代码 即时到账收款 --alipaydirect 网银支付 -

微信OAuth授权获取用户OpenId-JAVA(个人经验)

个人微信小程序 可扫码体验 本文更新有可能先在开源中国。地址为:https://my.oschina.net/xshuai/blog/293458 https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的。 带评论昵称  才同意加QQ ‍鉴于老是有人问我。就更新一下了。 更新时间 2016年10月18日 修改了测试号权限不足导致授权获取信息抛

Discuz! Ucenter API for JAVA

my.oschina.net/xshuai/blog/280242原文地址  Discuz! Ucenter API for JAVA   使用自己的项目于discuz联合登陆注册。 源码和jar文件都在http://code.google.com/p/discuz-ucenter-api-for-java/  有。 我只测试了非中文的注册。中文注册可以去http://code.goog

有懂discuz的吗?我需要在我自己的系统注册一个账号的时候,也把当前注册的账号放在discuz的用户里面。应该怎么做呀。需要discuz和java的接口吗?需要更改哪些东西。

discuz-ucenter_api_for_java 有懂discuz的吗?我需要在我自己的系统注册一个账号的时候,也把当前注册的账号放在discuz的用户里面。应该怎么做呀。需要discuz和java的接口吗?需要更改哪些东西。 所有的代码 1.UC.java package com.fivestars.interfaces.bbs.api;import java.io.IO

2014年5月3日整理java笔试题+答案和自己的代码

一.选择题(每题1分) 1. jsp 有几个内置对象?( )(单选) A 5个 B 6个 C 9个 D 8个 2. 在JAVA中,如何跳出当前的多重嵌套循环?( ) (多选) A break B return C forward Dfinally 3. 四种会话跟踪技术,哪个范围最大?( ) (单选) A page B request C session Dapplication 4. java中

2014年5月整理java笔试题及几个小面试题

实现2/1 3/2 5/3 8/5 13/8...前20项的和public class Test {public double sum(){double m = 1; //分母double n = 2;//分子double sum = 0;for (int i = 0; i < 20; i++) {sum = sum+n/m;double temp = m;m = n;n = m + temp;

2014年5月整理java面试题

1.Overload(方法重载)和override(方法覆盖)的区别: overload是指函数的名称相同,但是属性不同(返回类型除外)  override是对父类的虚函数进行“个性化”,要求属性必须与父类中声明的一致,不然会变成overload!   overload是完全隐藏了父类中函数的实现,相当于定义了一个同名函数  override是继承父类中函数实现,同时增加自己的功能

【语音处理】wav转pcm mp3转pcm Java示例代码

【语音处理】wav转pcmJava示例代码 都是作者亲测的代码哦。因各个音频之间存在差异导致转换会存在问题。建议大家自己有习惯看源码去了解音频相关知识的能力。 代码地址:https://gitee.com/xshuai/ai/blob/master/AIDemo/src/main/java/com/xs/audio/tns/WAVConvertPCM.java Wav转PCM   p

【百度语音合成】JavaAPI方式语音合成示例

Java-SDK合成语音示例:http://ai.baidu.com/forum/topic/show/492725REST-API文档地址:http://ai.baidu.com/docs#/TTS-API/top 本帖子主要示例通过REST API进行语音合成。使用Java语言进行示例Demo测试 创建语音应用并获取apikey secretkey  通过GET方式获取access_to