隨着微信支付的普及,愈來愈的APP要求支持微信支付。相信大多數開發者也碰到了這樣的需求。百度了一下,你們用到最多的是微信支付中我的對商戶的支付業務,而不多有人用到微信中商戶對我的付款的業務。我最近就碰到了這樣的需求,由於歷來沒有作過,因此只能查資料,但是百度到的資料不多,而且是過期的東西。又問了圈子裏的高手,但是你們都沒有作過。沒辦法只有硬着頭皮本身拱吧!還好還好,功夫不負有心人啊!終於被我整明白了,如今得空,拿出來跟你們一塊兒分享。php
首先給你們吃顆定心丸,全部的東西在你沒有用過以前,它都是神祕的,當你用過以後,就會發現,也就那麼回事。呵呵,開始正題吧!json
這是企業付款的文檔地址,你們須要先仔細看兩遍。https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1 (就算有個人指導,也建議你們先看文檔,看文檔能便於加深你們的理解)api
整體思路: 一、準備數據;二、把全部的參數鏈接成一個字符串,而後進行MD5,把MD5獲得的一個字符串作爲最後一個參;三、把微信提供的安全證,封裝到要提交的數據;(商戶證書獲取方法:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 四、經過JAVA程序向微信提供的接口POST數據。微信接口返回處理結果。安全
一、準備數據:所謂的數據就是請求參數,有9個參數是必須的,詳細說明見文檔(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。下面我給你們提供個人示例代碼。微信
//配置接口參數,如下是9個必須的參數。 signParams.put("mch_appid", appid); // 微信分配的公衆帳號ID(企業號corpid即爲此appId) signParams.put("mchid", mchid);// 微信支付分配的商戶號 signParams.put("nonce_str", uuid); // 隨機字符串,不長於32位 signParams.put("partner_trade_no", partner_trade_no); // 商戶訂單號,需保持惟一性 signParams.put("openid", openid); // 商戶appid下,某用戶的openid signParams.put("check_name", "NO_CHECK"); // NO_CHECK:不校驗真實姓名 // FORCE_CHECK:強校驗真實姓名(未實名認證的用戶會校驗失敗,沒法轉帳) // OPTION_CHECK:針對已實名認證的用戶才校驗真實姓名(未實名認證用戶不校驗,能夠轉帳成功) signParams.put("amount", amount); // 企業付款金額,單位爲分 signParams.put("desc", desc); // 企業付款操做說明信息。必填。 signParams.put("spbill_create_ip", ip); // 調用接口的機器Ip地址
注意map.put()中的key是死的寫法,不能改。併發
二、把全部的參數拼接成一個字符串,而後進行MD5運算,把獲得的運算結果,作爲簽名參數,一塊兒POST給接口。詳細作法參考文檔(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3)app
三、爲了提升程序的可用性,我把一些受微信影響,會變更的參數寫到了配置文件裏。配置文件和JAVA文件放在同一目錄裏就能夠了。dom
安全證書這一步是關鍵,微信爲了提升接口的安全性,因此增長了安全證書,以保證資金的安全。JAVA裏用到的證書是pkcs12格式,你們按照文檔裏的提示,去下載相關證書,而後放到本身指定的目錄裏就能夠了。下面是獲取證書,併發起POST請求的代碼示例。post
// 獲取證書,發送POST請求;學習
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(config.elementTextTrim("cert_path"))); // 從配置文件裏讀取證書的路徑信息
keyStore.load(instream, mchid.toCharArray());// 證書密碼是商戶ID
instream.close();
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpPost httpost = new HttpPost(url); //發起POST請求
四、向接口POST數據 ,得到返回結果。下面是個人示例代碼。
CloseableHttpResponse response = httpclient.execute(httpost); HttpEntity entity = response.getEntity(); String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); EntityUtils.consume(entity); // 把返回的字符串解釋成DOM節點 Document dom = DocumentHelper.parseText(jsonStr); Element root = dom.getRootElement(); String returnCode = root.element("result_code").getText(); // 獲取返回代碼 if (StringUtils.equals(returnCode, "SUCCESS")) { // 判斷返回碼爲成功仍是失敗 String payment_no = root.element("payment_no").getText(); // 獲取支付流水號 String payment_time = root.element("payment_time").getText(); // 獲取支付時間 map.put("state", returnCode); map.put("payment_no", payment_no); map.put("payment_time", payment_time); return map; } else { String err_code = root.element("err_code").getText(); // 獲取錯誤代碼 String err_code_des = root.element("err_code_des").getText();// 獲取錯誤描述 map.put("state", returnCode);// state map.put("err_code", err_code);// err_code map.put("err_code_des", err_code_des);// err_code_des return map; }
以上4步,就完成了微信企業付款的業務。
須要用到的jar包和個人程序示例代碼。喜歡拿來就用的夥伴只須要寫寫配置文件,下載了安全證書,個人程序就能夠直接拿來用了。源碼地址:http://pan.baidu.com/s/1gfqbVJt
有問題能夠跟帖諮詢。
歡迎你們共同窗習,共同進步。