[分享] 微信支付中商戶對我的用戶付款案例

  隨着微信支付的普及,愈來愈的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

  有問題能夠跟帖諮詢。

  歡迎你們共同窗習,共同進步。

相關文章
相關標籤/搜索