java微信公众号企业付款开发

作者:shaomiaojava 时间:2023-04-07 00:21:08 

本文为大家分享了java微信公众号企业付款的开发代码,供大家参考,具体内容如下

详情参照微信开发者文档 企业付款文档

java微信公众号企业付款开发 

java代码 定义所传递的参数


@RequestMapping(value = "zhifu", method = RequestMethod.GET)
public @ResponseBody String getWeixinOpenid(String code,
  HttpServletRequest request)
{
 // 订单号 自定义 生成32位uuid
 String partner_trade_no = UUIDGenerator.getUUID();
 // 随机数
 String nonce_str = UUIDGenerator.getUUID();
 // 转账金额(分为单位)1-200
 int jine = 100;
 // 企业付款信息
 String desc = "转账";
 // 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";
}

获取关注本公众号用户唯一标示  获取openid

java代码 获取openid 静态方法


/**
 * 获取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;

}

企业付款的调用公共方法

java代码
post提交 xml参数
解析回调的xml


/**
 * 企业付款
 *
 * @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);
  // 随机字符串
  // 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);
  // 校验用户姓名选项
  /**
   * NO_CHECK:不校验真实姓名
   * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
   * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
   */
  param.append("&check_name=" + check_name);
  // 收款用户姓名
  param.append("&re_user_name=" + re_user_name);
  // 金额
  param.append("&amount=" + jine);
  // 企业付款描述信息
  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();
  // 得到根元素的所有子节点
  List<Element> elementList = root.elements();
  String errors = "";
  for (Element e : elementList)
  {

// result_code业务
   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;
}

微信签名验证证书

验证证书公共方法


/**
 * 验证证书公共方法
 *
 * @description
 * @param zfpath 证书的路径
 * @param mchid 商户id
 * @return
 * @throws Exception
 * @author Jobs
 */
// shanghuid
// 验证证书
@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;
}

微信公共方法  字符串转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();
}

来源:https://blog.csdn.net/shaomiaojava/article/details/50562550

标签:java,微信公众号,企业付款
0
投稿

猜你喜欢

  • springboot2中session超时,退到登录页面方式

    2022-12-23 03:30:14
  • Java设计模式之原型模式详解

    2021-09-06 19:04:49
  • java map中相同的key保存多个value值方式

    2022-12-12 20:05:45
  • unity 如何修改材质属性和更换shader

    2023-02-22 12:42:44
  • 在Java的Struts中判断是否调用AJAX及用拦截 器对其优化

    2023-11-25 00:40:40
  • 不看后悔!揭秘游戏服务器开发

    2023-08-22 16:20:30
  • SpringBoot使用AOP与注解实现请求参数自动填充流程详解

    2022-08-18 17:30:36
  • 基于springboot i18n国际化后台多种语言设置的方式

    2022-03-28 16:02:56
  • 浅谈Android中使用异步线程更新UI视图的几种方法

    2022-10-17 02:57:38
  • Java设计模式之享元模式示例详解

    2022-12-08 22:19:46
  • C#创建自签名认证文件的方法

    2021-12-02 03:17:03
  • flutter 路由跳转的实现示例

    2023-08-23 14:55:26
  • C#使用Socket实现发送和接收图片的方法

    2023-11-19 01:43:22
  • Java NIO实现聊天系统

    2023-08-08 08:35:36
  • JavaWeb开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)

    2021-08-22 10:25:00
  • 关于C++一些特性的探究

    2022-04-10 07:17:54
  • Spring Boot整合Web项目常用功能详解

    2023-06-04 17:14:21
  • IDEA 端口占用的解决方法(推荐)

    2023-09-05 06:05:15
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解

    2022-07-24 13:56:18
  • Android如何使用GestureDetector进行手势检测详解

    2022-03-21 22:08:46
  • asp之家 软件编程 m.aspxhome.com