java微信公眾號企業(yè)付款開發(fā)
本文為大家分享了java微信公眾號企業(yè)付款的開發(fā)代碼,供大家參考,具體內(nèi)容如下
詳情參照微信開發(fā)者文檔 企業(yè)付款文檔
java代碼 定義所傳遞的參數(shù)
@RequestMapping(value = "zhifu", method = RequestMethod.GET) public @ResponseBody String getWeixinOpenid(String code, HttpServletRequest request) { // 訂單號 自定義 生成32位uuid String partner_trade_no = UUIDGenerator.getUUID(); // 隨機(jī)數(shù) String nonce_str = UUIDGenerator.getUUID(); // 轉(zhuǎn)賬金額(分為單位)1-200 int jine = 100; // 企業(yè)付款信息 String desc = "轉(zhuǎn)賬"; // ip地址 String spbill_create_ip = "xx.xx.xx"; // re_user_name String re_user_name = "xx"; String check_name = CheckName.NO_CHECK.toString(); String zfpath = "D:/apiclient_cert.p12"; try { // 獲取openid String openid = WeChatUtil.getByOpenid(appid, secret, code); // 付款 boolean flag = WeChatUtil.enterprisePayment(openid, appid, mchid, nonce_str, partner_trade_no, re_user_name, jine, desc, spbill_create_ip, check_name, key, zfpath); // 成功 if (flag) { return "SUCCESS"; } } catch (Exception e) { System.err.println(e.getStackTrace()); } return "FAIL"; }
獲取關(guān)注本公眾號用戶唯一標(biāo)示 獲取openid
java代碼 獲取openid 靜態(tài)方法
/** * 獲取openid * * @description * @param appid * @param secret * @param code * @return * @author shaomiao */ public static String getByOpenid(String appid, String secret, String code) { String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code"; String jsonstring = WeChatUtil.getJsonString(url); JSONObject json1 = JSONObject.parseObject(jsonstring); String openid = json1.get("openid").toString(); return openid; }
企業(yè)付款的調(diào)用公共方法
java代碼
post提交 xml參數(shù)
解析回調(diào)的xml
/** * 企業(yè)付款 * * @description * @param openid * @param appid * @param mchid 商戶id * @param nonce_str * @param partner_trade_no * @param re_user_name * @param jine * @param desc * @param spbill_create_ip * @param check_name * @return * @author Jobs * @throws IOException * @throws ClientProtocolException */ public static boolean enterprisePayment(String openid, String appid, String mchid, String nonce_str, String partner_trade_no, String re_user_name, int jine, String desc, String spbill_create_ip, String check_name, String key, String zfpath) throws Exception { boolean getSuccess = true; if (null != openid) { // zf Map<String, String> params_map = new LinkedHashMap<String, String>(); StringBuffer param = new StringBuffer(); // appid param.append("mch_appid=" + appid); // 商戶id param.append("&mchid=" + mchid); // 隨機(jī)字符串 // param.append("&nonce_str=" // + ZifwUtil.string2MD5(new Date().getTime() + "")); param.append("&nonce_str=" + nonce_str); // 訂單號自定義 param.append("&partner_trade_no=" + partner_trade_no); param.append("&openid=" + openid); // 校驗(yàn)用戶姓名選項(xiàng) /** * NO_CHECK:不校驗(yàn)真實(shí)姓名 * FORCE_CHECK:強(qiáng)校驗(yàn)真實(shí)姓名(未實(shí)名認(rèn)證的用戶會校驗(yàn)失敗,無法轉(zhuǎn)賬) * OPTION_CHECK:針對已實(shí)名認(rèn)證的用戶才校驗(yàn)真實(shí)姓名(未實(shí)名認(rèn)證用戶不校驗(yàn),可以轉(zhuǎn)賬成功) */ param.append("&check_name=" + check_name); // 收款用戶姓名 param.append("&re_user_name=" + re_user_name); // 金額 param.append("&amount=" + jine); // 企業(yè)付款描述信息 param.append("&desc=" + desc); // Ip地址 param.append("&spbill_create_ip=" + spbill_create_ip); String[] params = param.toString().split("&"); Arrays.sort(params); param = new StringBuffer(); for (String p : params) { String[] value = p.split("="); params_map.put(value[0], value[1]); param.append(value[0] + "=" + value[1] + "&"); } // 簽名最后 String sign = ZifwUtil.string2MD5(param.toString() + "key=" + key) .toUpperCase(); params_map.put("sign", sign); String reqStr = ZifwUtil.toXml(params_map); // ZHENGSHU CloseableHttpClient httpclient = certificateValidation(zfpath, mchid); HttpPost httppost = new HttpPost( "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"); StringEntity myEntity = new StringEntity(reqStr, "UTF-8"); httppost.setEntity(myEntity); System.out.println("executing request" + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); InputStreamReader reader = new InputStreamReader( resEntity.getContent(), "UTF-8"); char[] buff = new char[1024]; int length = 0; StringBuffer strhuxml = new StringBuffer(); while ((length = reader.read(buff)) != -1) { strhuxml.append(new String(buff, 0, length)); System.out.println(new String(buff, 0, length)); } // httpclient.close(); httpclient.getConnectionManager().shutdown(); // String ret = ZifwUtil.post( // "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers", // reqStr); // 解析傳過來的xml Document document = DocumentHelper.parseText(strhuxml.toString()); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子節(jié)點(diǎn) List<Element> elementList = root.elements(); String errors = ""; for (Element e : elementList) { // result_code業(yè)務(wù) if ("return_code".equals(e.getName()) && !"SUCCESS".equals(e.getText())) { getSuccess = false; } if ("result_code".equals(e.getName()) && !"SUCCESS".equals(e.getText())) { getSuccess = false; } } } return getSuccess; }
微信簽名驗(yàn)證證書
驗(yàn)證證書公共方法
/** * 驗(yàn)證證書公共方法 * * @description * @param zfpath 證書的路徑 * @param mchid 商戶id * @return * @throws Exception * @author Jobs */ // shanghuid // 驗(yàn)證證書 @SuppressWarnings("deprecation") public static CloseableHttpClient certificateValidation(String zfpath, String mchid) throws Exception { // 指定讀取證書格式為PKCS12 KeyStore keyStore = KeyStore.getInstance("PKCS12"); // 證書地址 FileInputStream instream = new FileInputStream(new File(zfpath)); try { keyStore.load(instream, mchid.toCharArray()); } finally { instream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, mchid.toCharArray()).build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf).build(); return httpclient; }
微信公共方法 字符串轉(zhuǎn)xml
/** * 微信支付拼接xml * * @param params * @return */ public static String toXml(Map<String, String> params) { String xml = "<xml>"; for (String key : params.keySet()) { if ("body".equals(key) || "attach".equals(key) || "sign".equals(key)) { xml += "<" + key + "><![CDATA[" + params.get(key) + "]]></" + key + ">"; } else { xml += "<" + key + ">" + params.get(key) + "</" + key + ">"; } } xml += "</xml>"; return xml; }
微信公共方法 字符串MD5
加密
用來加密簽名
/*** * MD5加碼 生成32位md5碼 */ public static String string2MD5(String inStr) { StringBuffer buf = new StringBuffer(); try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(inStr.getBytes("utf-8")); byte b[] = md.digest(); int i; for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } } catch (Exception e) { e.printStackTrace(); } return buf.toString(); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java版微信公眾號支付開發(fā)全過程
- 微信公眾號開發(fā)之設(shè)置自定義菜單實(shí)例代碼【java版】
- java微信公眾號支付開發(fā)之現(xiàn)金紅包
- 微信公眾號開發(fā)之回復(fù)圖文消息java代碼
- Java微信公眾號開發(fā)之通過微信公眾號獲取用戶信息
- java微信公眾號開發(fā)案例
- 用Java設(shè)計(jì)模式中的觀察者模式開發(fā)微信公眾號的例子
- java微信公眾號開發(fā)第一步 公眾號接入和access_token管理
- Java開發(fā)微信公眾號接收和被動(dòng)回復(fù)普通消息
- java微信公眾號開發(fā)(搭建本地測試環(huán)境)
- java開發(fā)微信公眾號支付
- Java 微信公眾號開發(fā)相關(guān)總結(jié)
相關(guān)文章
Java?超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的堆的應(yīng)用
堆首先是一個(gè)完全二叉樹,堆分為小根堆和大根堆。小根堆,所有結(jié)點(diǎn)的左右子節(jié)點(diǎn)都不小于根節(jié)點(diǎn);大根堆,所有結(jié)點(diǎn)的左右子節(jié)點(diǎn)都不大于根節(jié)點(diǎn)。優(yōu)先級隊(duì)列(priorityQueue)底層就是一個(gè)小根堆2022-04-04Maven的配置文件pom.xml詳解(含常用plugin)
pom.xml是Maven項(xiàng)目的核心配置文件,它是 項(xiàng)目對象模型 - Project Object Model(POM)的縮寫,本文我們將全面解析pom.xml,了解其結(jié)構(gòu)和屬性,以及如何使用它來管理項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2024-08-08詳解IDEA社區(qū)版(Community)和付費(fèi)版(UItimate)的區(qū)別
這篇文章主要介紹了詳解IDEA社區(qū)版(Community)和付費(fèi)版(UItimate)的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java中的時(shí)間日期API知識點(diǎn)總結(jié)
本文給大家總結(jié)了Java中的時(shí)間日期API知識點(diǎn)以及相關(guān)的實(shí)例代碼分享,有興趣的朋友參考學(xué)習(xí)下。2018-04-04關(guān)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制
今天小編就為大家分享一篇關(guān)于關(guān)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01SpringBoot整合新版SpringSecurity完整過程
Spring Security是保障Spring應(yīng)用程序安全的強(qiáng)大框架,而新版的Spring Security引入了lambda表達(dá)式來配置,使得安全配置更加簡潔、優(yōu)雅,本文將介紹如何在Spring Boot項(xiàng)目中整合新版Spring Security,需要的朋友可以參考下2024-02-02使用Swagger時(shí)Controller中api接口顯示不全的問題分析及解決
swagger是一個(gè)十分好用的api接口管理、測試框架,現(xiàn)在越來越多的人使用這個(gè)做接口的測試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問題,所以本文給大家詳細(xì)分析了問題以及解決方法,需要的朋友可以參考下2024-02-02java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法
相信大家在操作Java的時(shí)候,經(jīng)常會要檢查一個(gè)數(shù)組(無序)是否包含一個(gè)特定的值,這篇文章主要給大家介紹了關(guān)于java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法,需要的朋友可以參考下2024-08-08jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨stl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03