微信企业付款至银行卡 详细Demo 独立封装

大家好,我是梦辛工作室的灵,在最近的开发项目中,需要用到微信的企业付款至银行卡,在有过之前的企业付款到零钱包的封装好,就变的简单了许多,不过我还是在采用RSA加密银行卡 和 真实姓名的步骤上卡了许久,经过我不断地尝试还是搞定了这个功能,为了以后方便使用 顺便封装了下,WxPayUtilV1.0.2版,下面是如何使用:

 /*** 企业付款到银行卡示例*/public static void compayWxPayBank() {try {// 获取公钥String key = getWxPayPublicKey();CompanyWxPayBankBuilder wxPayBankBuilder = new CompanyWxPayBankBuilder("证书路径", key); // key 为微信返回的公钥wxPayBankBuilder.setMch_id("商户号");wxPayBankBuilder.setAPI_KEY("APIKEY");wxPayBankBuilder.setAmount(200); // 支付金额wxPayBankBuilder.setDesc("支付描述");wxPayBankBuilder.setEnc_bank_no("银行卡卡号");wxPayBankBuilder.setEnc_true_name("真实姓名");wxPayBankBuilder.setBank_code("银行编码");wxPayBankBuilder.build();// 验证数据System.out.println(wxPayBankBuilder.hand());// 发送处理} catch (LackParamExceptions e) {e.printStackTrace();}}/*** 获取公钥*/public static String getWxPayPublicKey() {try {GetPublicKeyBuilder builder = new GetPublicKeyBuilder("证书路径");builder.setAPI_KEY("APIKEY");builder.setmch_id("微信商户号");builder.build();// 验证数据JSONObject result = builder.hand();System.out.println(result);// 发送处理return result.getString("pub_key");} catch (LackParamExceptions e) {e.printStackTrace();}return null;}/*** 企业付款到银行卡查询示例*/public static void compayWxPayBankQuery() {try {CompanyWxPayBankQueryBuilder wxPayBankQueryBuilder = new CompanyWxPayBankQueryBuilder("支付证书路径","交易订单号(商家,不是微信的)");wxPayBankQueryBuilder.setMch_id("商户号");wxPayBankQueryBuilder.setAPI_KEY("APIKEY");wxPayBankQueryBuilder.build();// 验证数据System.out.println(wxPayBankQueryBuilder.hand());// 发送处理} catch (LackParamExceptions e) {e.printStackTrace();}}

有了这个我集成好的工具后,是不是就简单了很多,没有其余更多的复杂逻辑,hand()后就可以拿到对应的处理数据,该工具项目 我还集成了 微信JSAPI付款 发送模板消息 微信退款 微信退款查询 微信企业付款至零钱包 付款至银行卡 等功能,
下面讲一下我企业付款至银行卡步骤(不感兴趣的同学可直接到底部,github去下载源代码):

在拿到商户号秘钥和支付证书的基础上,需先获取到公钥



将以上信息按照ASCII码顺序拼接成以下格式:

mch_id=&nonce_str=&key=

然后MD5拿到sign,最后拼接成xml格式:

最后带证书访问值地址:https://fraud.mch.weixin.qq.com/risk/getpublickey
带证书访问代码如下:

public static String httpClientResultGetPublicKey(String url, String xml, String mch_id, String path)throws Exception {StringBuffer reultBuffer = new StringBuffer();KeyStore keyStore = KeyStore.getInstance("PKCS12");FileInputStream instream = new FileInputStream(new File(path));try {keyStore.load(instream, mch_id.toCharArray());} finally {instream.close();}SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);HttpPost httpPost = new HttpPost(url);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();StringEntity myEntity = new org.apache.http.entity.StringEntity(xml);myEntity.setContentType("text/xml;charset=UTF-8");myEntity.setContentEncoding("utf-8");httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8");httpPost.setEntity(myEntity);CloseableHttpResponse response = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader bufferedReader = null;try {response = httpclient.execute(httpPost);HttpEntity entity = response.getEntity();if (entity != null) {inputStream = entity.getContent();inputStreamReader = new InputStreamReader(inputStream);bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {reultBuffer.append(str);}}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {httpclient.close();response.close();bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;}return reultBuffer.toString();}

访问成功后可以拿到公钥,格式如下:

需要注意的是,这里获取到的秘钥格式是PKCS#1, 我们在用JAVA代码进行RSA加密的时候回报错,这是因为需要将格式转换为PKCS#8才可以,等下后面会讲到

进行企业付款至银行卡

在我们拿到公钥后,就按照以下参数请求,请求格式和加密方法和上面的一样,所需参数为:

这里需要对 银行卡 和真实姓名进行RSA加密,JAVA需要采用 " RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING" 填充方式,(需要将公钥格式转换为PKCS#8),加密代码如下(注意,这里的公钥需将头和尾去掉,即不要 “-----BEGIN RSA PUBLIC KEY-----” 和 “-----END RSA PUBLIC KEY-----”),需要为UTF-8格式:

 try {enc_bank_no_pwd = RSAEncryp.encrypt(enc_bank_no.getBytes("utf-8"), pub_key, 11,"RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");} catch (Exception e) {e.printStackTrace();enc_bank_no_pwd = "";}try {enc_true_name_pwd = RSAEncryp.encrypt(enc_true_name.getBytes("utf-8"), pub_key, 11,"RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");} catch (Exception e) {e.printStackTrace();enc_true_name_pwd = "";}public static String encrypt(byte[] plainBytes, String pub_Key, int reserveSize, String cipherAlgorithm)throws Exception {PublicKey publicKey = getPublicKey(pub_Key, "RSA");byte[] estr = encrypt(plainBytes, publicKey, pub_Key.length(), reserveSize, cipherAlgorithm);return new String(Base64.getEncoder().encode(estr));}public static PublicKey getPublicKey(String key, String keyAlgorithm) throws Exception {try {//在这里做的秘钥格式转换org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(org.bouncycastle.util.encoders.Base64.decode(key));java.security.spec.RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(rsaPublicKey.getModulus(), rsaPublicKey.getPublicExponent());KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);return publicKey;} catch (Exception e) {throw new Exception("READ PUBLIC KEY ERROR:", e);} finally {}}
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);}}}

然后将这些参数按照ASCII码顺序排序凭借为以下字符串:

amount=&bank_code=&desc=&enc_bank_no=&enc_true_name=&mch_id=&nonce_str=&partner_trade_no=&key=

然后MD5拿到sign
然后拼接为以下格式:

然后带证书post到接口地址:https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank
然后就可以啦,企业付款到银行卡查询比较简单,且没有什么需要注意的,我就不说啦,格式和 获取公钥一样,仅是参数不同而已

github入口,记得打个start https://github.com/wintton/MxWxPayUtil

微信企业付款至银行卡 详细Demo 独立封装相关推荐

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

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

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

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

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

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

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

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

  5. java微信--企业付款到银行卡

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

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

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

  7. 关于微信新出的企业付款到银行卡API的问题(二)

    按照微信企业付款到银行卡接口文档,调用转账接口后,返回的XML: <xml><return_code><![CDATA[SUCCESS]]></return_ ...

  8. 企业付款到银行卡API~~

    近日,在开发"微信企业付款到银行卡"的功能.第一次接触"付款到银行卡"这一块的业务,查询了很多的博客资料以及走了很多的弯路.也发现"企业付款到银行卡& ...

  9. 微信企业付款至零钱包实现详细流程Demo

    微信企业付款实现详细流程Demo 大家好,我是 梦辛工作室的灵,下面来讲一下微信企业付款实现的流程 1.准备数据 微信企业付款需要 准备 微信支付API秘钥.支付证书:下面是获取流程: 先登录微信支付 ...

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

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

最新文章

  1. rasa算法_(六)RASA NLU意图分类器
  2. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
  3. Clang-Format: Visual Studio Style
  4. 思科CCNA考试实验常用的命令
  5. hdu5348 MZL's endless loop(欧拉回路)
  6. 【深入浅出WF】——令牌环的变身—书签
  7. 【计算机网络】TCP/IP模型
  8. (STL,set,priority_queue)丑数
  9. life of a NPTL pthread
  10. Kernel Method核方法—应用与理解
  11. python aiohttp百万并发
  12. Windows10从 微软商店 安装 linux(ubuntu)
  13. 【Excel高阶技巧】条件函数、查找函数、字符串相关函数、公式审核、保护工作表/工作簿、模拟分析、宏
  14. 乒乓球比赛赛程_2018国际乒联乒乓球重大赛事详细赛程表,看点爆点早知道
  15. 宋鸿兵在《货币战争5》中谈到的美国医疗
  16. ad怎么修改栅格_AD 10怎么设置栅格?
  17. 淘宝客引流玩法介绍(一)
  18. 插画师的配色灵感分享
  19. Android动画特效之Animator属性动画实现
  20. JavaScript设计模式 Item 6 --单例模式Singleton

热门文章

  1. 计算机阵列除法器原理,并行除法器 ,并行除法器结构原理是什么?
  2. 2.1数据库-MySQL
  3. 很多IT从业者感觉到中国程序员前景一片灰暗,事实是如此吗?
  4. 多数据源配置MyBatisPlus(十八)
  5. 常用泰勒、微积分公式
  6. laravel实现打包多个文件,并下载
  7. 电脑浏览器主页被360锁定 - 解决方案
  8. 会计学原理与财务报表分析
  9. 学生科学计算机,学生科学计算器
  10. Beaver‘s triple(乘法三元组)-秘密共享的乘法计算