微信小程序走工行聚合支付
首先感谢大佬“快乐树上快乐果”,没有他的支持,不知道要多踩多少坑,先贴上大佬的原文链接
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
希望能帮助到大家吧,这个仅仅是支付而已,退款还在研究当中,如果有大佬做过,还请大佬能指点一二,退款之后做出来的话,也会发出来。最后还是要感谢一下“快乐树上快乐果”,如果我的文章描述的不够详细,大家可以去参考他的文章,在我文章的顶部有他的链接。
微信小程序走工行聚合支付相关推荐
- 微信小程序走工行渠道的微信支付
首先吐槽一个工行的效率问题,兜圈子,回复慢,人家事还多.对接和一堆业务员对接,完全不懂技术,说不到点上.给的账号三番五次是错的,并且文档描述也和实际demo不一致,完全靠百度一点一点磨出来的. 微信小 ...
- 微信小程序中使用JSAPI支付
微信小程序中使用JSAPI支付 在微信小程序中使用微信支付api[wx.requestPayment]需要传递以下字段 如何获取支付所需要的值 在微信小程序中使用微信支付api[wx.requestP ...
- 微信小程序服务商下子商户支付下单接口
微信小程序服务商下子商户支付下单流程 调用方法 <?php namespace app\index\controller; class WeixinPay extends Base { prot ...
- 微信小程序实现押金管理(支付押金、申请退还押金、押金明细)
前言 本教程是基于 "apifm-wxapi" 模块,教你快速实现小程序开发,所以你可能需要先了解以下知识点: <创建 HelloWorld 项目> <使用 &q ...
- 微信小程序+java后台实现支付(java操作)
支付,在微信小程序上面称为当一个用户使用该小程序,当进入到支付环节,我们需要调用微信支付接口过程,进行一系列的操作,并记录下来. 微信小程序与java接口实现支付操作,大致思路如下: 1.微信小程序调 ...
- 微信小程序走出国门,国际化将指日可待?
最近在全球旅行行业最重要的旅游大展--德国柏林国际旅游博览会(2018 ITB Berlin)上,德国最大的酒店集团MARITIM玛丽蒂姆与腾讯微信达到合作,微信小程序正式向入住MARITIM玛丽蒂姆 ...
- 仿抖音滑动小短剧影视微信小程序源码带支付收益等模式
项目功能介绍:支持无限滑动 高性能滑动 预加载 视频预览 支持剧情介绍,集合壁纸另外仿抖音滑动效果 支持会员模式,支持用户单独购买等等多功能 丰富的后台设置,具体大家可以看小编的后台演示图 具体小编也 ...
- nodejs+koa2实现微信小程序签名和请求支付(二)
废话不多说直接上代码: const getTradeNo = function() {let date = new Date();let arr = [date.getFullYear(),((dat ...
- Python对接微信小程序V3接口进行支付,并使用uwsgi+nginx+django进行https部署
网上找了很多教程,但是很乱很杂,并且教程资源很少且说的详细.这里就记录一下分享给大家 共分为以下几个步骤: 一.开始前准备信息 二.使用前端code获取用户的openid 三.对接小程序v3接口下单 ...
最新文章
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
- java jdbc工具类抽取_JavaWeb入门(三):JDBC工具类的抽取
- 【python3的学习之路七】函数
- 灰度重心法原理与实现
- linux中mysql如何删除库,Linux环境下MySQL基础命令(2)----查看、创建、删除库和表...
- ae这样设置导出比较快 480p比较适合快速看看demo的样子,注意tradeoff
- 首届“开悟AI+游戏高校大赛”启动
- linux rsync 安装教程,linux下的rsync配置和使用教程
- 杂七杂八DataTable获取Table某一列成List转换Table成List
- 服务器监控之 ping 监控
- mysql数据库如何新建查询_数据库新建查询
- 开箱即用——用模板快速上线一个HR 服务中心
- Unity 导出obj模型
- 微信小程序豆瓣电影(上)
- 可ping通外网,浏览器却访问不了外部网络
- VirtualBox 删除虚拟机
- 转换 如 # x4E0A; # x 6D77; 的编码为中文
- 2 Tables and Table Clusters读书笔记
- 航海王热血航线服务器要维修多久,航海王热血航线
- phpstorm使用