首先感谢大佬“快乐树上快乐果”,没有他的支持,不知道要多踩多少坑,先贴上大佬的原文链接
https://blog.csdn.net/qq_39404258/article/details/103371256

以下代码可以直接运行,但是前提需要导入jar包,请自行去工行开放平台下载。
(文章下半部分是SDK下载,网关公钥,错误码等链接)

ps:工行的测试环境只有早上九点-下午四点可用(也没人跟我说过,自己发现的规律,后来被别人告知确实如此)

public class AggregatePayHidePayRequestV1Test {//appid需要工行提供protected static final String APP_ID = "10000000000000188369";//网关公钥(自行去工行开放平台下载)protected static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb66666AQUAA4GNADCBiQKBgQCwFgHD4kzEVPd12345tKM7KV+16bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zp5r6R52MY0O77777LT7aHaxsANsvI9ABGx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg88888AGqwIDAQAB";//合作方私钥protected static final String MY_PRIVATE_KEY  = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC268A3frqjxUKdSye4RLIWgX+bOV5ooFODj0qYqRFGrazeVj4qhLAdQa8tY5ipiKS7VLMOtj+c26K3jeCiUJcGkd84qt3xsw7gPqVX9HkSs2IG1cbCS8LnyTSP88GOMuIvSLBcUSda41RbYCEx75eac8vLui9wklEPKXNvuZbrKeTfYZY68tuD8jKV/yyLp+5Mp4RylWXIQ+xv55X7LPhP2l8zqUXQQO8Rv5fziJ8aJcm1CqssTS5TB02Mj7Y1RsMKj07NDNz3F2jKUl86chRkckpQFpD5R2UEiiPqw76VEix1QNDIAt0Ol7scKjq/gYBzw1X2ymFPcsqBnU11Px11111BAAECggEBAIj/sIrfw3F9ABNGgo0kBi2M98GOCgNacLIL09baaTICSYKMHStDDZQb6dOY0HHJAXe8TA8suCAG76uB+0gWC8bD4edTMb8gWHfi83sYgsVazIRJ//7tNyDaNR/LdJ/HxFednVjG/y63LCrzqGj6BRWMvIns/23456Yz+V0oJrwg8ds4Zw9Qf81Tg/U99jQK2y++UvwKfsm0hhkpUCN9G/GbJMRVPUgUqJ3S1mMl5Q6x5/wczUVrlx3prsU7yS+gLM7N3mZwJDPqsg2T8ZFJfdxGk2hdwJYigU+QKqjn/ZumUV2wcRBvCLeawVlx5wlM4Vay2+33333yiHmCOS/NUMECgYEA9Fj8dR6b9hmoNZ639yyap5WMhodYDv2ca3bGpUwyGQgucHyqleMl8cNVbVBAReEELVeLCjiFSRYD8Smn9hWSt5Hmk+aJkb5EJ6A9h/gB1ClFqK+6GIueZIL8REIwcCrKGw7OxaYrqg+pP9MhOxLF0tE5/Kw7uj7WJD3TdQs8MxkCgYEAv6Tc6H3/Z5tMQWPVw0P3mrwQERQ0ipIPCz0vKVH4RHKMVbF/ZgaBZfrX9pOHug/5wAIY4Ax/gDc66dEbXy4nWRAq0gj2xe7f3avQIA/qR0CjUWqylagpmXT3chWrvmJqtvu/LXIo2QuOUp+zW15FVYk222224BE3i+UPXXE56789gYAHT7ZWJtFR3tiqqhIlIj+Kbi4jRF99K1eH26j7/zisiRMiqIhOLdrPziF7QOB7ds0yMiFl7+UFF9SMXcu50FFwjrwQhuBs7P2LFf9hVylu2MFN19xAqcTWixjTTgu2/4DGqH3FakB6OTe+QioHY3tp4HrUta6f1wt/UB5IrUpi2QKBgQCSOaPIzWKUVh1QA3H2RKTnbrk/ntAcLyfFZpDWkVHCQDitpfpUCYCwJD6mSJkWMdxZUgBS65ZZaUrNXxzoednSDhDuI6LPEd3EULVD0YDrjvlORQAwSpg7G9E2PizF3mgYaGvNrD5YpYWZq3r5qytyAXxW7Lx08Q4V8tfPb1vttwKBgC1XfXD9LcTpTjB6d0DzexxRj1PC8Ve/cwj99sJsoeR7WAjQJD+VgLTwVpXdvQW43Z554VzJbduF6NmP7/iNyTwh/phaeQ2xJS4Oham2I8uBjm7vo6so+HlvCT1MBM2bl5Aq2VlCui7wn4+lJow+af8MhaIFcd+g6Rtky3h7C7FL";@Testpublic void test_cop() {//这里必须用RSA2DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);AggregatePayHidePayRequestV1 request = new AggregatePayHidePayRequestV1();//url地址,工行提供request.setServiceUrl("https://apiyyh3.wmmnet.com.cn/api/mybank/pay/aggregatepay/hidepayrequest/V2");AggregatePayHidePayRequestV1Biz bizContent = new AggregatePayHidePayRequestV1Biz();//为什么要加上13天,因为工行测试环境有一个时间对照表(直接找工行要,不然时间对不上,就会出现商品不在时间范围内的错误)Calendar nowTime = Calendar.getInstance();nowTime.add(Calendar.DATE, 13);String startToday = new SimpleDateFormat("YYYYMMddHHmmss").format(nowTime.getTime());Calendar nowTime2 = Calendar.getInstance();nowTime2.add(Calendar.DATE, 13);nowTime2.add(Calendar.MINUTE, 10);String endToday = new SimpleDateFormat("YYYYMMddHHmmss").format(nowTime2.getTime());bizContent.setOutTradeNo(startToday); //商户订单号;需保证商户系统唯一bizContent.setOrderChannel("100"); // 下单发起渠道,100对应微信小程序, 101对应微信公众号,102对应支付宝生 活号bizContent.setTpAppId("wx042eb3cdfb2f16b9");  // 第三方应用ID;商户在微信公众号或小程序内接入时必送,上送微信分配的公众账号ID或小程序appid;商户通过支付宝生活号接入时必送,上送支付宝分配的应用ID。目前暂不支持上送bizContent.setMerId("1xxxxxxxxxx2");   //   商户号 一般为12位bizContent.setTpOpenId("oMS777eFXA_666xjdCgJe888HeeU");   //第三方用户标识;商户在微信公众号/支付宝生活号/小程序内接入时必送,上送用户在商户appid下的唯一标识。 目前暂不支持上送。bizContent.setTranType("OfflinePay"); //交易类型。用于区分交易场景为线上支 付还是线下支付,对应数据字典: OfflinePay-线下支付,OnlinePay-线上 支付。(这里统一填线下支付,工行要求的)bizContent.setOrderDate(startToday); //交易提交时间, 格式为: YYYYMMDDHHmmssbizContent.setEndTime(endToday); // 交易过期时间bizContent.setGoodsBody("可乐");bizContent.setInstallTimes("1");//统一为1bizContent.setOrderAmount("1000"); //总金额(单位:分)bizContent.setSpbillCreateIp("127.0.0.1"); //请求发起终端ip(商户后台发起请求的服务器IP地址,如果获取不到上送127.0.0.1即可)bizContent.setNotifyUrl("http://127.0.0.1/servlet/ICBCOFSTEBizServlet");bizContent.setNotifyType("HS"); //通知类型,表示在交易处理完成后把交 易结果通知商户的处理模式。 取 值“HS”:在交易完成后将通知信息,主 动发送给商户,发送地址为notify_url指 定地址; 取值“AG”:在交易完成后不通 知商户bizContent.setReturnUrl("http://paycenter.uboxol.com/payment/notify");bizContent.setInterfaceVersion("1.1.0.0"); //接口号,目前仅支持上送1.1.0.0bizContent.setResultType("0");request.setBizContent(bizContent);AggregatePayHidePayResponseV1 response;try {response = client.execute(request);System.out.println(response.getReturnCode()+"-----------");if (response.getReturnCode()==0) {// 业务成功String prepayId = response.getPrepayId();System.out.println(prepayId);} else {// 业务失败}} catch (IcbcApiException e) {e.printStackTrace();}}}

1.如果出现appid无效,没有权限,很可能是工行没有授权,或者就是工行给错了,url错误,再怎么搞都是白试。
2.如果一直出现400017错误,你就要考虑是不是自己的秘钥有问题,找工行确认,公钥是否已经授权,以及秘钥的准确性。

总之在出现商品错误码之前,问题一定出现在appId,网关公钥,合作方私钥,url地址四个地方。

3.一旦出现商品错误码,就说明你离成功更进一步了,这时候就需要你根据提示,来找到自己bizContent中的错误。
4.当成功返回数据之后,会有一个sign_data,但是它是base64编码,需解码,解码完之后会有一串内容,用于唤起小程序支付即可。
5.小程序官方API里的小程序支付提示的是MD5加密,不要管这个,直接使用RSA,signType为RSA。

总结:及时和工行反馈,很大程度上都是工行的问题,并不是你的demo有问题。我只想说,看似只有这么一点代码,但是其中的心酸真的一言难尽,和工行对接确实是太难了,毕竟对方也不是直接派技术人员和你对接,一般也只是普通业务员对接,一有问题,就让你提供上送报文和返回数据,真是太难了。

工行SDK链接
https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html

错误码对照表
对照表链接
https://open.icbc.com.cn/icbc/apip/faq_detail.html?id=10000000000000001045

测试网关公钥下载地址
https://open.icbc.com.cn/icbc/apip/faq_detail.html?id=10000000000000002004

商品错误码
错误码 错误说明
96314025 商户上送的订单不在有效时间范围内。
96314026 检查订单时间是否在有效范围内出错。
96112318 商户上送的订单不在有效时间范围内。
96314408 订单分解有误,请校验订单!
96112318 商户代码有误
96314023 商户上送订单信息中通知地址项不能为空。
96314024 商户上送订单信息中通知地址项错误。
96314132 商户上送订单信息中通知类型错误。
96114739 该商户未开通微信支付
96114740 该商户未开通支付宝支付

工行demo的链接(这个demo的可用性并不高,不过看一下也是可以的,里面会有一些必填参数,我想说,工行这个页面看起来实在是不舒服,一个英语单词给你分成几行,我也是醉了)
https://open.icbc.com.cn/icbc/apip/api_detail.html?apiId=10000000000000046000&baseUrl=%2Fmybank%2Fpay%2Faggregatepay&resUrl=%2Fhidepayrequest&version=V1&apiName=%E5%B9%B3%E5%8F%B0%E5%85%AC%E4%BC%97%E5%8F%B7%E5%8F%8A%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%9F%8B%E5%90%8D%E8%81%9A%E5%90%88%E6%94%AF%E4%BB%98&serviceId=P0067&resourceId=10000000000000004420

希望能帮助到大家吧,这个仅仅是支付而已,退款还在研究当中,如果有大佬做过,还请大佬能指点一二,退款之后做出来的话,也会发出来。最后还是要感谢一下“快乐树上快乐果”,如果我的文章描述的不够详细,大家可以去参考他的文章,在我文章的顶部有他的链接。

微信小程序走工行聚合支付相关推荐

  1. 微信小程序走工行渠道的微信支付

    首先吐槽一个工行的效率问题,兜圈子,回复慢,人家事还多.对接和一堆业务员对接,完全不懂技术,说不到点上.给的账号三番五次是错的,并且文档描述也和实际demo不一致,完全靠百度一点一点磨出来的. 微信小 ...

  2. 微信小程序中使用JSAPI支付

    微信小程序中使用JSAPI支付 在微信小程序中使用微信支付api[wx.requestPayment]需要传递以下字段 如何获取支付所需要的值 在微信小程序中使用微信支付api[wx.requestP ...

  3. 微信小程序服务商下子商户支付下单接口

    微信小程序服务商下子商户支付下单流程 调用方法 <?php namespace app\index\controller; class WeixinPay extends Base { prot ...

  4. 微信小程序实现押金管理(支付押金、申请退还押金、押金明细)

    前言 本教程是基于 "apifm-wxapi" 模块,教你快速实现小程序开发,所以你可能需要先了解以下知识点: <创建 HelloWorld 项目> <使用 &q ...

  5. 微信小程序+java后台实现支付(java操作)

    支付,在微信小程序上面称为当一个用户使用该小程序,当进入到支付环节,我们需要调用微信支付接口过程,进行一系列的操作,并记录下来. 微信小程序与java接口实现支付操作,大致思路如下: 1.微信小程序调 ...

  6. 微信小程序走出国门,国际化将指日可待?

    最近在全球旅行行业最重要的旅游大展--德国柏林国际旅游博览会(2018 ITB Berlin)上,德国最大的酒店集团MARITIM玛丽蒂姆与腾讯微信达到合作,微信小程序正式向入住MARITIM玛丽蒂姆 ...

  7. 仿抖音滑动小短剧影视微信小程序源码带支付收益等模式

    项目功能介绍:支持无限滑动 高性能滑动 预加载 视频预览 支持剧情介绍,集合壁纸另外仿抖音滑动效果 支持会员模式,支持用户单独购买等等多功能 丰富的后台设置,具体大家可以看小编的后台演示图 具体小编也 ...

  8. nodejs+koa2实现微信小程序签名和请求支付(二)

    废话不多说直接上代码: const getTradeNo = function() {let date = new Date();let arr = [date.getFullYear(),((dat ...

  9. Python对接微信小程序V3接口进行支付,并使用uwsgi+nginx+django进行https部署

    网上找了很多教程,但是很乱很杂,并且教程资源很少且说的详细.这里就记录一下分享给大家 共分为以下几个步骤: 一.开始前准备信息 二.使用前端code获取用户的openid 三.对接小程序v3接口下单 ...

最新文章

  1. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
  2. java jdbc工具类抽取_JavaWeb入门(三):JDBC工具类的抽取
  3. 【python3的学习之路七】函数
  4. 灰度重心法原理与实现
  5. linux中mysql如何删除库,Linux环境下MySQL基础命令(2)----查看、创建、删除库和表...
  6. ae这样设置导出比较快 480p比较适合快速看看demo的样子,注意tradeoff
  7. 首届“开悟AI+游戏高校大赛”启动
  8. linux rsync 安装教程,linux下的rsync配置和使用教程
  9. 杂七杂八DataTable获取Table某一列成List转换Table成List
  10. 服务器监控之 ping 监控
  11. mysql数据库如何新建查询_数据库新建查询
  12. 开箱即用——用模板快速上线一个HR 服务中心
  13. Unity 导出obj模型
  14. 微信小程序豆瓣电影(上)
  15. 可ping通外网,浏览器却访问不了外部网络
  16. VirtualBox 删除虚拟机
  17. 转换 如 # x4E0A; # x 6D77; 的编码为中文
  18. 2 Tables and Table Clusters读书笔记
  19. 航海王热血航线服务器要维修多久,航海王热血航线
  20. phpstorm使用

热门文章

  1. java ap_AP计算机教程1:Java基础
  2. 命令中Tab键无法自动补全解决办法
  3. Mongodb学习总结十条
  4. asp.net 新建项目与新建网站区别
  5. ggplot2绘制双坐标轴图
  6. 7-8 帅到没朋友 (20 分) 【思路】【PTA】【C语言】
  7. Linux那些事儿 之 戏说USB(25)设备的生命线(四)
  8. js对页面进行动态编译以及生成导出word文件
  9. 课体回顾,杂质半导体
  10. [经验教程]一个爱奇艺VIP会员帐号怎么共享给多个朋友家人使用同一个爱奇艺会员账号?