本文对接工行聚合支付二维码扫码支付接口,实现二维码生成(用户扫二维码支付)、二维码被扫(商户扫用户付款码)、支付查询、退款、退款查询、冲正的代码实现,首先下载工行聚合支付API文档,见链接“工行聚合支付二维码扫码支付”。开发者可以通过下载对应SDK进行学习使用,如图所示:

1.各个API对应请求地址

二维码生成:https://gw.open.icbc.com.cn/api/qrcode/V2/generate
此接口返回的二维码串为工商银行总行标准生成,非银联标准,建议商户将接口返回的字符串转化为二维码图片时使用业界通用的QR标准格式。
二维码退款:https://gw.open.icbc.com.cn/api/qrcode/V2/reject
二维码退款:https://gw.open.icbc.com.cn/api/qrcode/V2/reverse
二维码退款查询:https://gw.open.icbc.com.cn/api/qrcode/reject/query/V3
二维码被扫:https://gw.open.icbc.com.cn/api/qrcode/pay/V4
二维码查询:https://gw.open.icbc.com.cn/api/qrcode/query/V5
本接口由支付结果查询扩展为订单状态查询,含退款、冲正等情况,详细内容见响应参数pay_status描述。

2.代码实现:
下面列出各个接口的实现类,按照API文档上传对应参数即可,其中通用参数由申请开放平台时由平台分配。
其中request为请求工行聚合支付的请求参数枚举类(通用请求参数+请求参数);
bizContent为请求参数枚举类。

@Service
public class IcbcPayServiceImpl implements IcbcPayServiceInf {private final static Logger logger = LoggerFactory.getLogger(IcbcPayServiceImpl.class);/*** 工行聚合支付,获取二维码*/@Overridepublic Map<String, Object> generateQrcode(Map<String, Object> data) {// TODO Auto-generated method stubMap<String, Object> icbcpaymap = new HashMap<String, Object>();Map<String, Object> strResult = new HashMap<String, Object>();logger.info("IcbcPayServiceImpl generateQrcode = " + data);icbcpaymap = (Map<String, Object>) ICBCPayConstants.icbcConstantsmap.get(data.get("merchantId"));// DefaultIcbcClient client = new DefaultIcbcClient(IcbcPayConstants.AppId,// IcbcPayConstants.SIGN_TYPE_RSA2,// IcbcPayConstants.private_key, IcbcPayConstants.public_key);DefaultIcbcClient client = new DefaultIcbcClient((String) icbcpaymap.get("AppId"),(String) icbcpaymap.get("SIGN_TYPE_RSA2"), (String) icbcpaymap.get("private_key"),(String) icbcpaymap.get("public_key"));QrcodeGenerateRequestV2 request = new QrcodeGenerateRequestV2(); //工行聚合支付生成支付二维码请求(通用请求参数+请求参数)的枚举类// request.setServiceUrl(IcbcPayConstants.generateQrcodeURL);request.setServiceUrl((String) icbcpaymap.get("generateQrcodeURL"));QrcodeGenerateRequestV2Biz bizContent = new QrcodeGenerateRequestV2Biz(); //工行聚合支付请求参数的枚举类// bizContent.setMerId(IcbcPayConstants.Mer_ID);//商户线下档案编号(特约商户12位,特约部门15位)// bizContent.setStoreCode(IcbcPayConstants.Store_Code);//e生活档案编号bizContent.setMerId((String) icbcpaymap.get("Mer_ID"));// 商户线下档案编号(特约商户12位,特约部门15位)bizContent.setStoreCode((String) icbcpaymap.get("Store_Code"));// e生活档案编号bizContent.setOutTradeNo((String) data.get("fOrdertrace"));// 商户系统订单号bizContent.setOrderAmt((String) data.get("settleAmt"));// 订单总金额,单位:分bizContent.setTradeDate((String) data.get("fRegdate"));// 商户订单生成日期,格式:yyyyMMddbizContent.setTradeTime((String) data.get("fRegtime"));// 商户订单生成时间,格式: HHmmss// bizContent.setAttach("");//该字段非必输项,商户附加数据,最多21个汉字字符,原样返回bizContent.setPayExpire("280");// 二维码有效期,单位:秒,必须小于24小时,终端页面超时时间要比这个长,且没有返回按钮// bizContent.setNotifyUrl("127.0.0.1");//该字段非必输项,商户接收支付成功通知消息URL,当notify_flag为1时必输bizContent.setTporderCreateIp("127.0.0.1");// 商户订单生成的机器IPbizContent.setSpFlag("0");// 该字段非必输项,扫码后是否需要跳转分行,0:否,1:是;非1按0处理bizContent.setNotifyFlag("0");// 商户是否开启通知接口 0-否;1-是;非1按0处理request.setBizContent(bizContent);QrcodeGenerateResponseV2 response = new QrcodeGenerateResponseV2();try {response = client.execute(request, "msgId");if (response.isSuccess()) {// 成功strResult.put("statuscode", response.getReturnCode() + "");strResult.put("QrCodeData", response.getQrcode() + "");logger.info("icbc generateQrcode isSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc generateQrcode isSuccess ReturnMsg = "+response.getReturnMsg());} else {// 失败strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc generateQrcode notSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc generateQrcode notSuccess ReturnMsg = "+response.getReturnMsg());}} catch (Exception e) {e.printStackTrace();strResult.put("statuscode", "999");}logger.info("generateQrcode resp = " + strResult);return strResult;}/*** 工行聚合支付,商户扫描用户二维码*/@Overridepublic Map<String, Object> scanPay(Map<String, Object> data) {// TODO Auto-generated method stubMap<String, Object> icbcpaymap = new HashMap<String, Object>();Map<String, Object> strResult = new HashMap<String, Object>();logger.info("IcbcPayServiceImpl scanPay = " + data);icbcpaymap = (Map<String, Object>) ICBCPayConstants.icbcConstantsmap.get(data.get("merchantId"));// DefaultIcbcClient client = new DefaultIcbcClient(IcbcPayConstants.AppId,// IcbcPayConstants.SIGN_TYPE_RSA2,// IcbcPayConstants.private_key, IcbcPayConstants.public_key);DefaultIcbcClient client = new DefaultIcbcClient((String) icbcpaymap.get("AppId"),(String) icbcpaymap.get("SIGN_TYPE_RSA2"), (String) icbcpaymap.get("private_key"),(String) icbcpaymap.get("public_key"));QrcodePayRequestV2 request = new QrcodePayRequestV2();// request.setServiceUrl(IcbcPayConstants.scanPayURL);logger.info("scanPayURL = " + (String) icbcpaymap.get("scanPayURL"));request.setServiceUrl((String) icbcpaymap.get("scanPayURL"));QrcodePayRequestV2Biz bizContent = new QrcodePayRequestV2Biz();bizContent.setQrCode((String) data.get("thirdAuthCode"));// 商户扫描上送,客户的付款码// bizContent.setMerId(IcbcPayConstants.Mer_ID);bizContent.setMerId((String) icbcpaymap.get("Mer_ID"));// 商户线下档案编号(特约商户12位,特约部门15位)bizContent.setOutTradeNo((String) data.get("fOrdertrace"));// 商户系统订单号bizContent.setOrderAmt((String) data.get("settleAmt"));bizContent.setTradeDate((String) data.get("fRegdate"));bizContent.setTradeTime((String) data.get("fRegtime"));request.setBizContent(bizContent);QrcodePayResponseV2 response;try {response = client.execute(request, "msgId");if (response.isSuccess()) {// 成功strResult.put("statuscode", response.getReturnCode() + "");strResult.put("pay_status", response.getPayStatus() + "");// 交易结果标志,-1:下单失败,0:支付中,1:支付成功,2:支付失败logger.info("icbc scanPay isSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc scanPay isSuccess pay_status = "+response.getPayStatus());logger.info("icbc scanPay isSuccess ReturnMsg = "+response.getReturnMsg());} else {// 失败strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc scanPay notSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc scanPay notSuccess pay_status = "+response.getPayStatus());logger.info("icbc scanPay notSuccess ReturnMsg = "+response.getReturnMsg());}} catch (Exception e) {e.printStackTrace();strResult.put("statuscode", "999");}logger.info("scanPay resp = " + strResult);return strResult;}/*** 工行聚合支付,查询支付结果*/@Overridepublic Map<String, Object> queryPayResult(Map<String, Object> data) {// TODO Auto-generated method stubMap<String, Object> icbcpaymap = new HashMap<String, Object>();Map<String, Object> strResult = new HashMap<String, Object>();logger.info("IcbcPayServiceImpl queryPayResult = " + data);icbcpaymap = (Map<String, Object>) ICBCPayConstants.icbcConstantsmap.get(data.get("merchantId"));// DefaultIcbcClient client = new DefaultIcbcClient(IcbcPayConstants.AppId,// IcbcPayConstants.SIGN_TYPE_RSA2,// IcbcPayConstants.private_key, IcbcPayConstants.public_key);DefaultIcbcClient client = new DefaultIcbcClient((String) icbcpaymap.get("AppId"),(String) icbcpaymap.get("SIGN_TYPE_RSA2"), (String) icbcpaymap.get("private_key"),(String) icbcpaymap.get("public_key"));QrcodeQueryRequestV2 request = new QrcodeQueryRequestV2();// request.setServiceUrl(IcbcPayConstants.queryPayResultURL);request.setServiceUrl((String) icbcpaymap.get("queryPayResultURL"));QrcodeQueryRequestV2Biz bizContent = new QrcodeQueryRequestV2Biz();// bizContent.setMerId(IcbcPayConstants.Mer_ID);bizContent.setMerId((String) icbcpaymap.get("Mer_ID"));// 商户线下档案编号(特约商户12位,特约部门15位)// bizContent.setCustId("1076dAbpBsrJXpI4J+/HXthaHj+mORib");//该字段非必输项bizContent.setOutTradeNo((String) data.get("orderId"));// 该字段非必输项,out_trade_no和order_id选一项上送即可,商户系统订单号// bizContent.setOrderId("020002040095201802202148775");//该字段非必输项,out_trade_no和order_id选一项上送即可,行内系统订单号request.setBizContent(bizContent);QrcodeQueryResponseV2 response;try {response = client.execute(request, "msgId");if (response.isSuccess()) {// 成功strResult.put("statuscode", response.getReturnCode() + "");strResult.put("PayStatus", response.getPayStatus() + "");// 交易结果标志,0:支付中,1:支付成功,2:支付失败logger.info("icbc queryPayResult isSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc queryPayResult isSuccess ReturnMsg = "+response.getReturnMsg());} else {// 失败strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc queryPayResult notSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc queryPayResult notSuccess ReturnMsg = "+response.getReturnMsg());}} catch (Exception e) {e.printStackTrace();strResult.put("statuscode", "999");}logger.info("queryPayResult resp = " + strResult);return strResult;}/*** 二维码退款*/@Overridepublic Map<String, Object> payReject(Map<String, Object> data) {// TODO Auto-generated method stubMap<String, Object> icbcpaymap = new HashMap<String, Object>();Map<String, Object> strResult = new HashMap<String, Object>();logger.info("IcbcPayServiceImpl payReject = " + data);icbcpaymap = (Map<String, Object>) ICBCPayConstants.icbcConstantsmap.get(data.get("merchantId"));// DefaultIcbcClient client = new DefaultIcbcClient(IcbcPayConstants.AppId,// IcbcPayConstants.SIGN_TYPE_RSA2,// IcbcPayConstants.private_key, IcbcPayConstants.public_key);DefaultIcbcClient client = new DefaultIcbcClient((String) icbcpaymap.get("AppId"),(String) icbcpaymap.get("SIGN_TYPE_RSA2"), (String) icbcpaymap.get("private_key"),(String) icbcpaymap.get("public_key"));QrcodeRejectRequestV2 request = new QrcodeRejectRequestV2();// request.setServiceUrl(IcbcPayConstants.payRejectURL);request.setServiceUrl((String) icbcpaymap.get("payRejectURL"));QrcodeRejectRequestV2Biz bizContent = new QrcodeRejectRequestV2Biz();// bizContent.setMerId(IcbcPayConstants.Mer_ID);bizContent.setMerId((String) icbcpaymap.get("Mer_ID"));// 商户线下档案编号(特约商户12位,特约部门15位)// bizContent.setCustId("1076dAbpBsrJXpI4J+/HXthaHj+mORib");//该字段非必输项bizContent.setOutTradeNo((String) data.get("orderId"));// 该字段非必输项,out_trade_no和order_id选一项上送即可// bizContent.setOrderId("020001515151201701030000001");//该字段非必输项,out_trade_no和order_id选一项上送即可bizContent.setRejectNo((String) data.get("fOrdertrace"));bizContent.setRejectAmt((String) data.get("refundAmt"));// bizContent.setOperId("X000000001");//该字段非必输项,操作人员IDrequest.setBizContent(bizContent);QrcodeRejectResponseV2 response;try {response = client.execute(request, "msgId");if (response.isSuccess()) {// 成功strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc payReject isSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc payReject isSuccess ReturnMsg = "+response.getReturnMsg());} else {// 失败strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc payReject notSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc payReject notSuccess ReturnMsg = "+response.getReturnMsg());}} catch (Exception e) {e.printStackTrace();strResult.put("statuscode", "999");}logger.info("payReject resp = " + strResult);return strResult;}/*** 二维码冲正*/@Overridepublic Map<String, Object> payReverse(Map<String, Object> data) {// TODO Auto-generated method stubreturn null;}/*** 二维码退款查询*/@Overridepublic Map<String, Object> queryRejectResult(Map<String, Object> data) {// TODO Auto-generated method stubMap<String, Object> icbcpaymap = new HashMap<String, Object>();Map<String, Object> strResult = new HashMap<String, Object>();logger.info("queryRejectResult payReject = " + data);icbcpaymap = (Map<String, Object>) ICBCPayConstants.icbcConstantsmap.get(data.get("merchantId"));// DefaultIcbcClient client = new DefaultIcbcClient(IcbcPayConstants.AppId,// IcbcPayConstants.SIGN_TYPE_RSA2,// IcbcPayConstants.private_key, IcbcPayConstants.public_key);DefaultIcbcClient client = new DefaultIcbcClient((String) icbcpaymap.get("AppId"),(String) icbcpaymap.get("SIGN_TYPE_RSA2"), (String) icbcpaymap.get("private_key"),(String) icbcpaymap.get("public_key"));QrcodeRejectQueryRequestV3 request = new QrcodeRejectQueryRequestV3();// request.setServiceUrl(IcbcPayConstants.queryRejectResultURL);request.setServiceUrl((String) icbcpaymap.get("queryRejectResultURL"));QrcodeRejectQueryRequestV3Biz bizContent = new QrcodeRejectQueryRequestV3Biz();// bizContent.setMerId(IcbcPayConstants.Mer_ID);bizContent.setMerId((String) icbcpaymap.get("Mer_ID"));// 商户线下档案编号(特约商户12位,特约部门15位)// bizContent.setCustId("1076dAbpBsrJXpI4J+/HXthaHj+mORib");//该字段非必输项bizContent.setOutTradeNo((String) data.get("orderId"));// bizContent.setOrderId("020001515151201701030000001");bizContent.setRejectNo((String) data.get("refundorderId"));request.setBizContent(bizContent);QrcodeRejectQueryResponseV3 response;try {response = client.execute(request, "msgId");if (response.isSuccess()) {// 成功strResult.put("statuscode", response.getReturnCode() + "");strResult.put("refund_json_list", response.getRefundJsonList());logger.info("icbc queryRejectResult isSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc queryRejectResult isSuccess ReturnMsg = "+response.getReturnMsg());} else {// 失败strResult.put("statuscode", response.getReturnCode() + "");logger.info("icbc queryRejectResult notSuccess ReturnCode = "+response.getReturnCode());logger.info("icbc queryRejectResult notSuccess ReturnMsg = "+response.getReturnMsg());}} catch (Exception e) {e.printStackTrace();strResult.put("statuscode", "999");}logger.info("queryRejectResult resp = " + strResult);return strResult;}}```

工行聚合支付二维码扫码付对接流程及代码实现相关推荐

  1. 聚合支付二维码如何实现自动识别扫码客户端跳转相应支付页面

    前言 前面有一篇<聚合支付之流程概述>和大家聊了一下关于聚 合 支 付的一个简单流程.很多小伙伴私信我,如何实现聚合支付码的自动跳转呢? 其实,刚开始接触的时候我也很迷茫,一个静态的二维码 ...

  2. 聚合支付二维码生成原理

    聚合支付二维码生成原理 聚合支付平台提供平台支付URL,生成统一的支付二维码.当消费者根据二维码扫描时,聚合支付平台根据扫描者浏览器类型判断支付类型,并提交参数给聚合支付平台支付处理接口处理.平台支付 ...

  3. 聚合支付PC端-微信扫码

    聚合支付 第二章 微信扫码 文章目录 聚合支付 前言 一.开发前准备 二.java实现 1.pom中引入相关jar包 2.支付相关工具类 3.支付相关商户参数 4.微信支付统一下单-生成二维码 5.微 ...

  4. 移动二维码支付 推进二维码扫码智能POS

    现如今:银币.再到纸币,演变到"钱"变得越来越轻薄.在现在这个移动支付市场中,互联网技术的支撑下,刷手机乘公交.刷支付宝买菜购物.缴水电费--日常生活中使用"现金&quo ...

  5. 在OpenJWeb平台中实现主动扫码(商家主动出示支付二维码)

    上一篇介绍了被动扫码的实现,本文介绍如何在OpenJWeb平台中实现主动扫码(商家生成支付二维码),出示给用户,用户扫码后通过微信付款. 业务流程: (1)商家在POS机中录好了商品和价格,然后调用微 ...

  6. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  7. 关于微信支付 二维码扫码支付

    首先注册微信公众平台服务号:https://mp.weixin.qq.com 获得开发者id和秘钥(appid & appsecret) 随后注册微信支付商户平台:https://pay.we ...

  8. B2C电商项目(第十二天、微信扫码支付、支付二维码、支付回调逻辑、推送支付通知)

    一. 微信扫码支付 学习内容: 能够根据微信支付的开发文档调用微信支付的 api 完成统一下单生成微信支付二维码功能 完成支付回调的逻辑处理,掌握 EchoSite的使用 完成推送支付通知功能 微信支 ...

  9. 西米支付:支付二维码的简单介绍

    二维码支付从1.0到3.0时代的历史进程 实际上二维码技术被推出来已经有十多年了,这段悠久绵长的英雄无用武之地的时代属于二维码1.0时代,得益于互联网电子商务的飞速发展首先将二维码应用于支付并发扬光大 ...

  10. 支付宝支付 第九集:产品数据和支付二维码对接

    支付宝支付 第九集:产品数据和支付二维码对接 一.问题 javascript中单引号和双引号的区别是什么? vue中的:作用 v-bind指令 二.代码 目录结构 更新AlipayServiceImp ...

最新文章

  1. 怎么将一个数组转化成字符串
  2. HDU 4609 3-idiots
  3. 机器学习中样本不平衡处理办法
  4. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
  5. 【CF1394B】Boboniu Walks on Graph【图论】【集合哈希】
  6. 武汉工程大学2020GPLT选拔赛(上)
  7. 深入框架本源系列 —— Virtual Dom
  8. Android 检查版本更新 Server后台下载
  9. 一个立即关闭显示器的小软件(Masm开发,只有3KB大小)
  10. SQLPLUS 使用的一些技巧
  11. 9 [面向对象]-内置方法
  12. vmware 10使用心得记录
  13. java 给图片加水印图片(水印位置与角度可定义)
  14. ug二次开发环境配置
  15. 【题解】选数字 [51nod1354]
  16. Python报错解决:local variable ‘xxx‘ referenced before assignment
  17. 模拟鼠标键盘操作,含硬件模拟技术
  18. pubg显示服务器安装失败,绝地求生全军出击怎么安装不了 安装失败解决办法
  19. matlab中 spm,使用SPM批处理在MATLAB中运行预处理
  20. 习题11-8 单链表结点删除(没看懂我撤硕大口吃翔)

热门文章

  1. PostgreSQL 源码解读(152)- PG Tools#4(ReceiveXlogStream)
  2. LSB图像数字水印嵌入算法(含python代码)
  3. 论文笔记 Triformer: Triangular, Variable-Specific Attentions for Long SequenceMultivariate Time Series
  4. accept搭配用法_accept的固定搭配及用法
  5. cad详图怎么画_CAD结构图怎么画?手把手教你CAD结构图的绘制方法
  6. 信息最全--MySQL循环插入测试用户数据--姓名
  7. 小程序转发功能(类似于美团红包转发功能)的简单实现
  8. GPU VS FPGA对比
  9. 虚拟机ubuntu与真实机实现实现复制粘贴、传输文件
  10. linux重装系统步骤 包含raid【主要针对服务器重装】