java-微信--企业向个人付款

原创 2017年08月08日 15:50:27

功能描述:在微信公众号H5 用户赚取的金额 提现到微信用户个人钱包里;

实现原理:调用微信企业向个人付款接口 接口地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

 通过openId 和appId绑定用户.

开通企业向个人付款功能 必须要满足:1,商户号已入驻90日, 2,商户号有30天连续正常交易

需要的参数

商户账号appid mch_appid

 微信公众号配置里可以看到

商户号 mchid
微信支付分配的商户号   微信商户平台里查看

随机字符串 nonce_str
随机字符串,不长于32位

String nonce_str = UUID.randomUUID().toString().toUpperCase().replaceAll("-", "");// 随机获取UUID

商户订单号 partner_trade_no
商户订单号,需保持唯一性
(只能是字母或者数字,不能包含有符号)

String fsNO = GenerateKeyNO.generate("FS");
String partner_trade_no = fsNO;

    /**
* 生成订单号,格式:XX(前缀) + yyyyMMddHHmmss + 10位数
* @param prefix
* @return
*/
public static String generate(String prefix) {

synchronized(locker) {
if (sn == 999999999) {
sn = 0;
} else {
sn ++;
}
String str = String.format("%010d", sn);
return prefix + sdf.format(new Date()) + str;
}
}

用户openid openid
商户appid下,某用户的openid

如何获取openid请参考我的另一篇文章

校验用户姓名选项 check_name
NO_CHECK:不校验真实姓名 
FORCE_CHECK:强校验真实姓名

金额 amount
企业付款金额,单位为分  

String.valueOf((int)(amount*100)

企业付款描述信息 desc
企业付款操作说明信息。必填。

Ip地址 spbill_create_ip
String spbill_create_ip = PayCommonUtil.getIpAddr(request).replace("_", "."); // 获取发起电脑ip

   /**
     * 
     * 功能描述:获取真实的IP地址
     * @param request
     * @return
     * @author guoyx
     */
    public static String getIpAddr(HttpServletRequest request)
    {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
        if (!isnull(ip) && ip.contains(","))
        {
            String[] ips = ip.split(",");
            ip = ips[ips.length - 1];
        }
        //转换IP 格式
        if(!isnull(ip)){
            ip=ip.replace(".", "_");
        }
        return ip;
    }

签名 sign

 SortedMap<Object, Object> signParams = new TreeMap<Object, Object>();
   signParams.put("mch_appid", mch_appid); // 微信分配的公众账号ID(企业号corpid即为此appId)
   signParams.put("mchid", mchid);// 微信支付分配的商户号
   signParams.put("nonce_str", nonce_str); // 随机字符串,不长于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:强校验真实姓名
   signParams.put("amount", String.valueOf((int)(amount*100))); // 企业付款金额,单位为分
   signParams.put("desc", desc);  // 企业付款操作说明信息。必填。
   signParams.put("spbill_create_ip", spbill_create_ip); // 调用接口的机器Ip地址

String sign = PayCommonUtil.createSign("UTF-8", signParams,key); //生成支付签名,要采用URLENCODER的原始值进行MD5算法!

signParams.put("sign", sign);

/**
* @author
* @date 2016-4-22
* @Description:sign签名
* @param characterEncoding
*            编码格式
* @param parameters
*            请求参数
* @return
*/
public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
@SuppressWarnings("rawtypes")
Set es = packageParams.entrySet();
@SuppressWarnings("rawtypes")
Iterator it = es.iterator();
while (it.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + API_KEY);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}

public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}

把参数封闭成XML格式

String requestXML = PayCommonUtil.getRequestXml(signParams);//封闭成XML格式

/**
* @author
* @date 2016-4-22
* @Description:将请求参数转换为xml格式的string
* @param parameters
*            请求参数
* @return
*/
@SuppressWarnings("rawtypes")
public static String getRequestXml(SortedMap<Object, Object> parameters) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
} else {
sb.append("<" + k + ">" + v + "</" + k + ">");
}
}
sb.append("</xml>");
return sb.toString();
}

调用微信企业向个人付款接口

String jsonStr = HttpUtil.jsonStr(requestXML); //调用微信企业向个人付款接口


下面操作 调用微信需要的证书  证书在微信商户平台下载  java只用到apiclient_cert.p12这个证书  支付必须要有证书 

/**
* 调用微信企业向个人付款接口
*/
public static String jsonStr (String requestXML) throws Exception{
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(PropertiesHandler.getConfigValue("phoen.addr.url").toString())); // 从配置文件里读取证书的路径信息
String mchid = PropertiesHandler.getConfigValue("phoen.mch.id").toString(); // 商业号
keyStore.load(instream, mchid.toCharArray());// 证书密码是商户ID
instream.close();
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
@SuppressWarnings("deprecation")
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(PropertiesHandler.getConfigValue("ufdoder.url").toString()); //请求微信地址
httpost.addHeader("Connection", "keep-alive");
httpost.addHeader("Accept", "*/*");
httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpost.addHeader("Host", "api.mch.weixin.qq.com");
httpost.addHeader("X-Requested-With", "XMLHttpRequest");
httpost.addHeader("Cache-Control", "max-age=0");
httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
httpost.setEntity(new StringEntity(requestXML, "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
return jsonStr;
}

     如果参数都对的上的话  就可以见到如下见面


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zengsange/article/details/76913231

企业微信支付C#版_向员工付款

“企业微信支付”系列课程讲解企业微信支付的全部知识点“企业红包”;“向员工付款”;“向员工收款”。课程分JAVA版、C#版,提供源程序,有技术问题可以指导。 购课咨询,技术指导,qq2326321088
  • 2017年09月18日 10:43

[分享] 微信支付中商户对个人用户付款案例

随着微信支付的普及,越来越的APP要求支持微信支付。相信大多数开发者也碰到了这样的需求。百度了一下,大家用到最多的是微信支付中个人对商户的支付业务,而很少有人用到微信中商户对个人付款的业务。我最近就碰...
  • ppqiaoping
  • ppqiaoping
  • 2016-07-20 13:56:52
  • 19226

微信支付商户平台,企业向个人付款接口demo

  • 2017年03月30日 17:36
  • 7KB
  • 下载

微信公众号开发---微信企业付款给个人

以下有关微信支付中企业付款的介绍及编码参考自微信支付开发文档,网址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=1...
  • qq_21429153
  • qq_21429153
  • 2017-02-06 11:28:17
  • 4294

微信支付企业付款向个人转账demo例子

  • 2016年08月30日 16:51
  • 37KB
  • 下载

微信支付商户平台,企业向个人付款接口-php版

  • 2016年07月04日 17:45
  • 3KB
  • 下载

微信支付-企业付款到个人详解

微信支付-企业付款到个人企业付款实现企业向个人付款,实现付款到用户零钱。项目实现了企业付款到个人和企业付款个人账单查询。代码包括签名实现,双向证书验证,付款功能等支付流程付款功能 企业付款到授权用户...
  • fengshizty
  • fengshizty
  • 2016-11-17 19:05:26
  • 17269

Java微信支付-微信企业付款到个人

  • 2016年11月17日 19:22
  • 28KB
  • 下载

微信支付-微信企业付款到个人DEMO

  • 2017年11月14日 17:55
  • 77KB
  • 下载

微信支付中商户对个人用户付款demo.亲测,跳坑

首先给大家吃颗定心丸,所有的东西在你没有用过之前,它都是神秘的,当你用过之后,就会发现,也就那么回事。呵呵,开始正题吧!  这是企业付款的文档地址,大家需要先仔细看两遍。https://pay.wei...
  • zhangshuhao0101
  • zhangshuhao0101
  • 2018-02-25 11:43:16
  • 312
收藏助手
不良信息举报
您举报文章:java-微信--企业向个人付款
举报原因:
原因补充:

(最多只允许输入30个字)