欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java微信公眾號企業(yè)付款開發(fā)

 更新時(shí)間:2018年09月30日 08:41:30   作者:shaomiaojava  
這篇文章主要為大家詳細(xì)介紹了java微信公眾號企業(yè)付款開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文為大家分享了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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的堆的應(yīng)用

    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-04
  • Maven的配置文件pom.xml詳解(含常用plugin)

    Maven的配置文件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ū)別

    這篇文章主要介紹了詳解IDEA社區(qū)版(Community)和付費(fèi)版(UItimate)的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java中的時(shí)間日期API知識點(diǎn)總結(jié)

    Java中的時(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)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制

    今天小編就為大家分享一篇關(guān)于關(guān)于Spring中Bean的創(chuàng)建進(jìn)行更多方面的控制,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java中TESTful架構(gòu)原理分析

    java中TESTful架構(gòu)原理分析

    這篇文章主要介紹了對java架構(gòu)中TESTful架構(gòu)原理進(jìn)行了詳細(xì)的原理分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • SpringBoot整合新版SpringSecurity完整過程

    SpringBoot整合新版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時(shí)Controller中api接口顯示不全的問題分析及解決

    swagger是一個(gè)十分好用的api接口管理、測試框架,現(xiàn)在越來越多的人使用這個(gè)做接口的測試和管理,但經(jīng)常遇到Controller中的api接口顯示不全的問題,所以本文給大家詳細(xì)分析了問題以及解決方法,需要的朋友可以參考下
    2024-02-02
  • java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法

    java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法

    相信大家在操作Java的時(shí)候,經(jīng)常會要檢查一個(gè)數(shù)組(無序)是否包含一個(gè)特定的值,這篇文章主要給大家介紹了關(guān)于java中如何判斷數(shù)組中是否包含某個(gè)元素的幾種方法,需要的朋友可以參考下
    2024-08-08
  • jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)

    jstl之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

最新評論