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();
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现微信公众号获取临时二维码功能示例

    本文实例讲述了Java实现微信公众号获取临时二维码功能.分享给大家供大家参考,具体如下: 我们做微信公众号开发时为了推广,可能需要服务端去生成公众号的临时二维码,然后再进行一定的图片合成操作,制作一张漂亮的推广海报.别人扫一下二维码进入关注公众号界面,点击关注我们可以拿到二维码里面的信息官网地址 记录一下获取临时二维码操作过程. 1.获取access_token 上一篇文章写了 就不赘述了: 2.根据access_token获取二维码ticket,获取到了二维码ticket就基本山是成功了: 3

  • 微信公众号开发之回复图文消息java代码

    微信公众号开发之回复图文消息,供大家参考,具体内容如下 图文消息的主要参数说明 通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示: 从上图可以了解到: 1.图文消息的个数限制为10,也就是图文中ArticleCount的值(图文消息的个数,限制在10条以内) 2.对于图文消息,第一条图文的图片显示为大图,其他图文的图片显示为小图. 3.第一条图文的图片大小建议为640*320,其他图文的图片建议为80*80 下面开始实现: 请求消息的基类: import com.though

  • Java将微信和支付宝支付的个二维码合二为一的方法

    因公司需要将支付宝和微信的二维码合成一个,不管用户用支付宝扫还是微信扫都能打开对应的支付页面,在网上找了一些文章,很感谢各位大神的经验,我也记录下我是如何将两个二维码合二为一的~. 原理:支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可. 1.首先生成二维码: folderName:存储二维码图片的文件夹名 imageName:二维码图片名

  • java微信公众号开发案例

    微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤: 1.首先你需要一个邮箱在微信公众号平台进行注册:      注册的方式有订阅号.公众号.小程序和企业号,个人我们这里只能选择订阅号 2.注册完后,我们登录到公众号平台--->开发--->基本配置,这里需要填写URL和token,URL就是我们使用服务器的接口: 3.Java Web服务器程序编译好且在服务器上部署可以运行的话,可在微信公众号进行在线接口调试: 1).选择

  • java微信扫描公众号二维码实现登陆功能

    本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下 前提条件: 1.微信公众平台为服务号, 2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系 具体实现原理: 1.用户访问业务系统登陆页时,调用二维码接口,获得二维码的ticketid,同时将sessionid,ticketid和二维码的seceneid保存 2.返回登陆页时,根据ticketid获得微信二维码 3.页面通过ajax发送请求,判断是否已经扫描成功. 4.公众平

  • Java开发微信公众号接收和被动回复普通消息

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本消息 2.图片消息 3.语音消息 4.视频消息 5.小视频消息 6.地理位置消息 7.链接消息(被动回复的消息) 被动回复的普通消息包括: 1.回复文本消息 2.回复图片消息 3.回复语音消息 4.回复视频消息 5.回复音乐消息 6.回复图文消息 其实接收消息和被动回复消息这两个动作是不分家的,这本

  • 微信小程序实现获取小程序码和二维码java接口开发

    前言:目前小程序推出了自己的识别码,小程序码,这个圆形的码看起来比二维码好看.本文总结微信小程序的获取小程序码和二维码并生成二维码图片的接口开发.主要内容摘抄自微信小程序的API文档,java接口开发是自己总结开发. 微信小程序API文档:获取二维码 一.简介 通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面.目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示: 二.获取小程序码 目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合

  • java开发微信公众号支付

    最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时间,也只是达到了实现功能的水平,并没有太多考虑到性能问题,所以这篇文章比较适合初学者. 微信公众号支付的总体其实很简单,大致就分为三步.第一步需要获取用户授权:第二步调用统一下单接口获取预支付id:第三步H5调起微信支付的内置的js.下面介绍具体每一步的开发流程. 一    首先要明确微信公众号支付属于网页版支付,所以相较于app的直接调取微信支付要多一步微信授权.也就是需要获取用户的openid.微信公众号使用的交易类型是JSAPI,

  • java微信公众号开发(搭建本地测试环境)

    俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一个用来测试的公众号,还有一个用来调式代码的开发环境. 测试公众号 微信公众号有订阅号.服务号.企业号,在注册的时候看到这样的信息,只有订阅号可以个人申请,服务号和企业号要有企业资质才可以.这里所说的微信公众号开发指的是订阅号和服务号. 另外,未认证的个人订阅号有一些接口是没有权限的,并且目前个人订阅号已不支持微信认证,也就是说个人订阅号无法调用一些高级的权限接口,下图就是一个未认证的个人订阅号所具备权限列表,像生成二

  • java实现微信公众号扫一扫

    本文实例为大家分享了微信公众号扫一扫的具体代码,供大家参考,具体内容如下 步骤 根据微信JS-JDK文档说明,实现扫一扫主要有以下几大步骤: 绑定域名 引入JS文件 通过config接口注入权限验证配置 通过ready接口处理成功验证 通过error接口处理失败验证 绑定域名 在JS接口安全域名填入域名,注意不带http,如图: 引入JS文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></s

  • java微信公众号开发第一步 公众号接入和access_token管理

    本文就来说一说微信开发第一步,公众号接入以及access_token的管理. 一.微信公众号接入 在微信公众号开发手册上,关于公众号接入这一节内容还是写的比较详细的,文档中说接入公众号需要3个步骤,分别是: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 其实,第3步已经不能算做公众号接入的步骤,而是接入之后,开发人员可以根据微信公众号提供的接口所能做的一些开发. 第1步中服务器配置包含服务器地址(URL).Token和EncodingAESKey. 服务器地址即公

  • Java版微信公众号支付开发全过程

    一.微信官方文档微信支付开发流程(公众号支付) 首先我们到微信支付的官方文档的开发步骤部分查看一下需要的设置. [图片上传失败...(image-5eb825-1531014079742)] 因为微信支付需要较高的权限,只有认证了得服务号才有使用微信支付接口的权限,我们个人很难申请到,所以需要向其他朋友借用账号. 来到文档的业务流程部分,查看微信支付的流程(我觉得这个还是需要十分仔细的了解和查看的,这有助于你理解微信开发的流程). 然后,访问微信支付接口是要传递的参数很多,见统一下单 [图片上传

随机推荐