企业付款到银行卡其实就是企业付款到到零钱的进价版,只不过比到零钱多了一个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. android5.1和ios差距,Android 5.1和IOS运行流畅度比较Android获胜!
  2. 《Science》基因组比对的革命性技术
  3. 记录一次基于LV块做存储介质的KVM扩容过程
  4. 第一章:Flask安装
  5. mysql orm .net,2020年 .NET ORM 完整比较、助力选择
  6. Spark-1.4.0集群搭建
  7. max 宏定义取消:error C2589: error C2059: 语法错误 : “::”
  8. PHP写猜数字,PHP算法之猜数字
  9. java concurrent之前戏synchronized
  10. P3128-最大流Max Flow【树上差分,LCA】
  11. 【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)
  12. web 三联发票针式打印_不要买二手激光打印机,公开咸鱼卖家套路
  13. staruml java_非常详细的StarUML使用教程,推荐阅读!
  14. Windows 7,无法访问internet,DNS无响应
  15. Linux能运行intouch,Invensys Wonderware InTouch XML 外部实体漏洞
  16. python webpy 开发文档_Python webpy微信公众号开发之 回复图文消息
  17. 什么是应用宝统一链接服务器,腾讯只悄悄地在手Q中整合应用宝,就开始逆天了...
  18. JeeSite (三)前端
  19. npm中node更新_如何在Node中管理NPM和功能时保持理智
  20. 字节跳动疯狂招人,为何会有如此操作?

热门文章

  1. 啤酒公司与尿布公司的关联规则挖掘
  2. FFmpeg开发XPlay2.0播放器-03 FFmpeg解码
  3. typora简历主题推荐
  4. android 叉号 终端,android终端环境配置
  5. 任务启动需要经历九九八十一难,没有大师兄带路,咱们依旧可以取得真经
  6. 如何更改Excel中某些单元格的货币符号
  7. Java面试题(十) - SQL语句的优化
  8. 【优化算法】多元宇宙优化算法【含Matlab源码 265期】
  9. 在linux debian 10当中破解root密码
  10. IMX6ULL 开发板 UART3串口驱动,并与压力传感器通讯,获取压力值