企业付款到银行卡其实就是企业付款到到零钱的进价版,只不过比到零钱多了一个RSA加密.只要加密好了,根据官方提供的参数,直接请求即可.

首先就是通过官方提供的接口https://fraud.mch.weixin.qq.com/risk/getpublickey获取RSA 公钥,也就是pub_key这个字段.

直接上代码


import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import java.io.DataInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;public class Rsa {//获取RSA加密秘钥接口路径private static final String RSA = "https://fraud.mch.weixin.qq.com/risk/getpublickey";private static final Logger log = LoggerFactory.getLogger("adminLogger");public static void main(String[] args) {Map<String, String> params = new HashMap<>();String nonce_str = getUUID();params.put("mch_id", "商户号");params.put("nonce_str", nonce_str);params.put("sign_type", "MD5");params.put("sign", createSign(params, "商户秘钥"));String result = null;try {result = httpRequestTransfer(RSA, toXml(params), "商户号", "证书路径(http地址类型)");} catch (Exception e) {e.printStackTrace();}log.error("微信请求企业付款接口返回:" + result);}private static String getUUID(){return UUID.randomUUID().toString().replace("-", "");}private static String createSign(Map<String, String> params, String paternerKey) {// 生成签名前先去除signparams.remove("sign");String stringA = packageSign(params, false);String stringSignTemp = stringA + "&key=" + paternerKey;return DigestUtils.md5Hex(stringSignTemp).toUpperCase();}private static String packageSign(Map<String, String> params, boolean urlEncoder) {// 先将参数以其参数名的字典序升序进行排序TreeMap<String, String> sortedParams = new TreeMap<String, String>(params);// 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起StringBuilder sb = new StringBuilder();boolean first = true;for (Map.Entry<String, String> param : sortedParams.entrySet()) {String value = param.getValue();if (StrKit.isBlank(value)) {continue;}if (first) {first = false;} else {sb.append("&");}sb.append(param.getKey()).append("=");if (urlEncoder) {try {value = urlEncode(value);} catch (UnsupportedEncodingException e) {}}sb.append(value);}return sb.toString();}private static String urlEncode(String src) throws UnsupportedEncodingException {return URLEncoder.encode(src, "UTF-8").replace("+", "%20");}private static String httpRequestTransfer(String url, String data, String mch_id, String path) throws Exception {//证书类型KeyStore keyStore = KeyStore.getInstance("PKCS12");URL urlPro = new URL(path);DataInputStream instream = new DataInputStream(urlPro.openStream());try {//指定PKCS12的密码(商户ID)keyStore.load(instream, mch_id.toCharArray());} finally {instream.close();}SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();//指定TLS版本SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);//设置httpclient的SSLSocketFactoryCloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {HttpPost httpost = new HttpPost(url); // 设置响应头信息httpost.addHeader("Accept", "*/*");httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");httpost.setEntity(new StringEntity(data, "UTF-8"));CloseableHttpResponse response = httpclient.execute(httpost);try {HttpEntity entity = response.getEntity();String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");EntityUtils.consume(entity);return jsonStr;} finally {response.close();}} finally {httpclient.close();}}private static String toXml(Map<String, String> params) {StringBuilder xml = new StringBuilder();xml.append("<xml>");for (Map.Entry<String, String> entry : params.entrySet()) {String key = entry.getKey();String value = entry.getValue();// 略过空值if (StrKit.isBlank(value)) continue;xml.append("<").append(key).append(">");xml.append(entry.getValue());xml.append("</").append(key).append(">");}xml.append("</xml>");return xml.toString();}private static Map<String, String> xmlToMap(String xmlStr) {XmlHelper xmlHelper = XmlHelper.of(xmlStr);return xmlHelper.toMap();}
}

然后把获取到的rsa秘钥保存到本地,修改文件名称以及类型

注意保存的时候不要去掉-----BEGIN RSA PUBLIC KEY----- 和 -----END PUBLIC KEY-----

这个秘钥是PKCS#1格式的,java的话要使用PKCS#8的,文档提供了互转的方法

openssl rsa -RSAPublicKey_in -in <filename> -pubout  用dos命令指令 filename为文件全路径,注意要去掉尖括号
然后把新秘钥也保存到本地

有了秘钥,下面可以进行加密操作,加密成功后基本上就大功告成了

以下是加密方法

 public static void main(String[] args)throws Exception {//待加密数据String card = "123456789";//获取PublicKey对象 第一个参数为rsa公钥地址,这里我把公钥放在了远程服务器上PublicKey  pub = RSAUtil.getPubKey("https://xxx.xxxx.com/pksc8_public.pem", "RSA");//获取加密后数据 后三个参数为固定值(别问为啥,别人那里看的,最后一个参数为填充方式)String encode = Base64.encode(RSAUtil.encrypt(card.getBytes(), pub, 2048, 11, "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING"));}

最后是RSAUtil

import javax.crypto.Cipher;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;public class RSAUtil {public static byte[] encrypt(byte[] plainBytes, PublicKey publicKey, int keyLength, int reserveSize, String cipherAlgorithm) throws Exception {int keyByteSize = keyLength / 8;int encryptBlockSize = keyByteSize - reserveSize;int nBlock = plainBytes.length / encryptBlockSize;if ((plainBytes.length % encryptBlockSize) != 0) {nBlock += 1;}ByteArrayOutputStream outbuf = null;try {Cipher cipher = Cipher.getInstance(cipherAlgorithm);cipher.init(Cipher.ENCRYPT_MODE, publicKey);outbuf = new ByteArrayOutputStream(nBlock * keyByteSize);for (int offset = 0; offset < plainBytes.length; offset += encryptBlockSize) {int inputLen = plainBytes.length - offset;if (inputLen > encryptBlockSize) {inputLen = encryptBlockSize;}byte[] encryptedBlock = cipher.doFinal(plainBytes, offset, inputLen);outbuf.write(encryptedBlock);}outbuf.flush();return outbuf.toByteArray();} catch (Exception e) {throw new Exception("ENCRYPT ERROR:", e);} finally {try {if (outbuf != null) {outbuf.close();}} catch (Exception e) {outbuf = null;throw new Exception("CLOSE ByteArrayOutputStream ERROR:", e);}}}public static PublicKey getPubKey(String publicKeyPath, String keyAlgorithm) {PublicKey publicKey = null;InputStream inputStream = null;try {URL urlPro = new URL(publicKeyPath);inputStream = new DataInputStream(urlPro.openStream());publicKey = getPublicKey(inputStream, keyAlgorithm);} catch (Exception e) {e.printStackTrace();//EAD PUBLIC KEY ERRORSystem.out.println("加载公钥出错!");} finally {if (inputStream != null) {try {inputStream.close();} catch (Exception e) {System.out.println("加载公钥,关闭流时出错!");}}}return publicKey;}public static PublicKey getPublicKey(InputStream inputStream, String keyAlgorithm) throws Exception {try {BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));StringBuilder sb = new StringBuilder();String readLine = null;while ((readLine = br.readLine()) != null) {if (readLine.charAt(0) == '-') {continue;} else {sb.append(readLine);sb.append('\r');}}X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(decodeBase64(sb.toString()));KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);//下行出错  java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=127, too big.PublicKey publicKey = keyFactory.generatePublic(pubX509);return publicKey;} catch (Exception e) {e.printStackTrace();throw new Exception("READ PUBLIC KEY ERROR:", e);} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {inputStream = null;throw new Exception("INPUT STREAM CLOSE ERROR:", e);}}}/**** decode by Base64*/public static byte[] decodeBase64(String input) throws Exception {Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");Method mainMethod = clazz.getMethod("decode", String.class);mainMethod.setAccessible(true);Object retObj = mainMethod.invoke(null, input);return (byte[]) retObj;}

最后,绑定参数请求微信提供的接口即可

java微信--企业付款到银行卡相关推荐

  1. 微信企业付款至银行卡 设置转账备注信息问题

    最近发现一个问题,还是用户反馈的,就是我们调起微信企业付款的接口,按照API中的参数都赋予响应的值之后,发现在一个参数desc(转账备注)中添加文字说明后,转账到微信零钱,收款方上面有我的备注信息,但 ...

  2. Java 微信企业付款到个人钱包

    Java 微信企业付款到个人钱包 希望可以帮助到你 文章目录 **Java 微信企业付款到个人钱包** 前言 一.需要准备的配置 二.开发 总结 前言 微信企业付款到个人钱包,此功能模块需要提前在微信 ...

  3. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  4. 微信企业付款到银行卡

    第一次做微信企业付款到银行卡,特地记录下来,因为这个功能自己用了2-3天,这中间的坑主要是再rsa加密那块.自己记录下来,供朋友参考.自己用的php开发 第一,首先你需要开通企业的微信认证公众号平台, ...

  5. 微信企业付款到银行卡(微信转账)(Java完整版)

    业务介绍 微信付款到银行卡,也就是转账.需要将银行卡号.卡主真实姓名按照微信支付制定的加密规则进行加密,(开发完感觉加密比转账复杂,哈哈哈).加密的秘钥,也就是钥匙,也要通过请求向微信获取,重点是获取 ...

  6. java实现微信企业付款到银行卡_微信企业付款到银行卡实现方式 - 黎明互联-官方博客 - 黎明互联 - 区块链培训,PHP培训,IT培训,职业技能培训,追求极致!改变您的职业生涯!...

    首先说一下微信支付已上线企业付款至银行卡功能.商户可以将商户号余额付款至指定的收款银行账户.通过指定收款银行账户户名.卡号,以及收款银行信息即可实现付款.但是功能目前为灰度开放,已灰度新资金流直连普通 ...

  7. weixin4j-pay~最简单的微信企业付款到银行卡SDK

    估计大家搜到这里,已经是看了不少文档了,我这边背景就不多说了,直接上干货~~! 先睹为快,直接上调用方法 企业付款到银行卡 public static void main(String[] args) ...

  8. java微信企业付款_Java微信支付-微信企业付款到个人

    [实例简介] 微信支付企业付款到个人,包括付款 以及 查询 参考文章http://blog.csdn.net/fengshizty/article/details/53204566 [实例截图] [核 ...

  9. java 付款,java微信企业付款到个人完整源码

    [实例简介] 简单的demo实现企业付款到个人,eclipse导出的完整源码,带jar包,适合初学者小白,大佬请无视,纯后台实现,无前端,可供参考实现流程,代码也是网上抄抄改改而来,感谢被我抄过的大佬 ...

最新文章

  1. linux 解压war到root_部署War包到Tomcat根目录位置(Ubuntu/CentOS)
  2. 素数环(dfsamp;amp;STL做法)HDU - 1016
  3. Go语言-defer的使用
  4. json数据格式基础知识
  5. 非客观书评(三)——《ARM Cortex-M3 权威指南》
  6. Leetcode 105. 前序和中序遍历序列构造二叉树
  7. 终于等到你——ggplot2树状图
  8. 线性代数-线性转化和矩阵
  9. svn linux客户端使用教程,linux svn 客户端安装配置
  10. python拦截游戏封包_【求助】关于pygame封包问题
  11. 更换kindle书籍的字体
  12. 塔望 · ​食业​研究 |食品品牌能从植物奶第一股OATLY破圈中学到什么
  13. java on Mac:解决无法打开jnlp文件的问题
  14. c#等比例缩放、压缩gif、动图文件
  15. ubuntu petalinux 2018 安装操作说明
  16. 【AE模板】扁平化MG动画卡通人物解说角色场景元素包
  17. 串口调试助手版本合集
  18. 12864与24C04的原理和使用方法——以电子密码锁为例(下篇)
  19. 『前端大事记』之「几件大事」
  20. 破解IT公司高管频繁离职的密码

热门文章

  1. python数组分组
  2. 家纺智慧零售怎么落地?这家公司堪称标杆
  3. 海豚php分页问题,关于php:Double Entry Accounting分页问题
  4. gn算法java_R语言构建蛋白质网络并实现GN算法
  5. 需要外语翻译怎么办?用好语音翻译器就够了
  6. ECharts边框阴影圆环
  7. 「元」时代潮流启幕 树图生态淘派参展上海时装周回顾
  8. python字符串输入语句_Python 字符串与基本语句
  9. Oracle GoldenGate的思想天空--感悟OGG的本质
  10. java毕业生设计法律知识分享平台计算机源码+系统+mysql+调试部署+lw