2021年调用工商二维码生成接口及回调接口demo
2021年 要对接工商银行二维码生成接口 里面包含一个回调的接口 这里只是一个简单的demo
需求
对接工商银行二维码生成二维码支付 , 支付成功后工商银行调用回调接口 响应支付成功信息
特别说明
回调接口要配置在生成二维码接口中
回调接口要在服务里面写
整体操作流程
a.熟悉工商二维码生成接口文档和demo
b.编写二维码生成接口测试类 问项目上的人要一些固定的参数appid 私钥 公钥... 工商二维码生成接口需要配置 开启通知 和 回调的接口url (也可以不配置等回调接口写好配置进来)
工商二维码生成接口需要配置 开启通知 和 回调的接口url 代码如下
c.编写代码回调接口 在你的服务里面写代码
使用第三方工具映射url地址 就是内网穿透 局域网映射到公网
这里使用 https://natapp.cn/ 注册 登录 开通隧道(购买0元) 配置映射端口号
下载对应版本的客户端 这里使用的是window 64的客户端
将authtoken值复制到cmd窗口回车自动映射成功
http://gdjdmc.natappfree.cc ---映射为->127.0.01:8082
测试使用的完整的请求路径是http://gdjdmc.natappfree.cc/qrGenerateController/callBlack
开启回调接口所在的服务 局域网请求 和 外网请求都能访问回调接口
1.工行API在线文档地址地址 ---->https://open.icbc.com.cn/icbc/apip/api_list.html
工商二维码生成接口文档 搜素关键字如下 二维码生成
这里使用的是第二个
点击蓝色字体进入文档内容
2.相应Demo开发包 地址---->https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html 根据自己要对接的接口找到对应的demo
但是你懂得demo的例子也不是很全 这里的二维码生成的回调接口就没有例子
3.编写二维码生成接口 文档的参数需要根据自己的项目实际配置
下面使用main方法调用二维码生成接口
需要使用工商的jar和大名鼎鼎的hutool pom.xml引入
<dependency> <groupId>com.jdd.icbc</groupId> <artifactId>icbc-server-service</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.icbc</groupId> <artifactId>icbc-api-sdk-cop</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.icbc</groupId> <artifactId>icbc-api-sdk-cop-io</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.icbc</groupId> <artifactId>hsm-software-share</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>com.icbc</groupId> <artifactId>ocr-api</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.5.16</version> </dependency>
二维码生成接口测试类
在这里有个坑 请看 https://www.cnblogs.com/wf-zhang/p/14772864.html
public class QrGenerateTest { public static void main(String[] args) { String appId = "APP的编号,应用在API开放平台注册时生成"; String privateKey = "私钥"; String icbcPulicKey = "公钥"; DefaultIcbcClient client = new DefaultIcbcClient(appId,privateKey,icbcPulicKey); CardbusinessQrcodeQrgenerateRequestV1 request = new CardbusinessQrcodeQrgenerateRequestV1(); //正式环境 这里的url地址使用8 请求示例中的 request.setServiceUrl("https://gw.open.icbc.com.cn/api/qrcode/V2/generate"); CardbusinessQrcodeQrgenerateRequestV1.CardbusinessQrcodeQrgenerateRequestV1Biz bizContent = new CardbusinessQrcodeQrgenerateRequestV1.CardbusinessQrcodeQrgenerateRequestV1Biz(); request.setBizContent(bizContent); bizContent.setMerId("1********9"); // 商户线下档案编号(特约商户12位,特约部门15位) bizContent.setStoreCode("0*******7"); // e生活档案编号 bizContent.setOutTradeNo("ZHL777O15002096"); // 商户系统订单号 ZHL777O15002039 //bizContent.setOutTradeNo(UUID.randomUUID().toString().replace("-","")); bizContent.setOrderAmt("1"); // 订单总金额,单位:分 bizContent.setTradeDate(DateUtil.format(DateUtil.date(), "yyyyMMdd")); // 商户订单生成日期,格式:yyyyMMdd bizContent.setTradeTime(DateUtil.format(DateUtil.date(), "HHmmss")); // 商户订单生成时间,格式:HHmmss bizContent.setTporderCreateIp("127.0.0.1"); // 商户订单生成的机器IP bizContent.setNotifyFlag("1"); // 商户是否开启通知接口,0-否;1-是;非1按0处理 bizContent.setPayExpire("1200"); // 二维码有效期,单位:秒,必须小于24小时 String myURL ="http://gdjdmc.natappfree.cc/qrGenerateController/callBlack";//映射后的公网地址 bizContent.setNotifyUrl(myURL);//回调接口url bizContent.setSpFlag("0"); bizContent.setAttach("abcdefg"); CardbusinessQrcodeQrgenerateResponseV1 response; try { response = client.execute(request, System.currentTimeMillis() + "");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一 if (response.getReturnCode() == 0) { // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据 System.out.println("ReturnCode:" + response.getReturnCode()); System.out.println("response:" + JSON.toJSONString(response)); System.out.println("工行二维码链接为:"+response.getQrcode()); } else { // 失败 System.out.println("response:" + JSON.toJSONString(response)); System.out.println("ReturnCode:" + response.getReturnCode()); System.out.println("ReturnMsg:" + response.getReturnMsg()); } } catch (IcbcApiException e) { e.printStackTrace(); } } }
在服务里编写回调接口
@RestController @RequestMapping("/qrGenerateController") public class QrGenerateCallBlackController { @PostMapping("/callBlack") public void callBlack(HttpServletRequest request, HttpServletResponse response){ System.out.println("=========================>开始扫码支付回调"); // 参数Map Map properties = request.getParameterMap(); // 返回值Map Map returnMap = new HashMap(); Iterator entries = properties.entrySet().iterator(); Map.Entry entry; String name = ""; String value = ""; while (entries.hasNext()) { entry = (Map.Entry) entries.next(); name = (String) entry.getKey(); Object valueObj = entry.getValue(); if (null == valueObj) { value = ""; } else if (valueObj instanceof String[]) { String[] values = (String[]) valueObj; for (int i = 0; i < values.length; i++) { value = values[i] + ","; } value = value.substring(0, value.length() - 1); } else { value = valueObj.toString(); } System.out.println("扫码支付回调参数:" + name + ":" + value); returnMap.put(name, value);
} System.out.println("=========================>扫码支付回调结束"); } }
测试流程
特别说明
回调接口服务一直开启,内网穿透已经映射
11 调用二维码生成接口 这里是main方法运行 里面配置了回调的接口地址------> 映射后的公网地址
111 扫码支付成功后,工商银行会调用回调接口
1111 回调接口拿到工商响应的信息 进行业务处理 这里只是打印出来响应的参数
测试运行 二维码生成接口测试类
结果如下 如文档所说的ReturnCode 是0 就是调用成功
生成二维码 将二维码串复制到工具里生成 我这里使用的FeHelper 还有草料二维码 https://cli.im/ 用法一样
手机扫码 微信扫码会显示微信支付 支付宝扫码会显示支付宝支付
支付成功后工商银行会调用回调接口
最后响应结果是 success
附上工商银行回调的参数