继微信收款码之后,迎来了又一个新的对接支付方式---工商银行收款码支付

 准备工作:

1.获取工行API在线文档地址:https://open.icbc.com.cn/icbc/apip/api_list.html

2.拿到相应的业务参数,包括publicKey,privateKey,appId,merId,storeCode等参数

3.获取相应Demo开发包:https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html

4.根据自己的相应业务场景需要,打开相应的demo文件(开发包中有几百个业务场景,并且根据不同版本有不同的demo示例,需要我们找到自身的版本及业务场景获得正确的代码)

 开发

1.工行二维码----生成二维码

package com.youfuli.vendor.utils.icbc;import com.icbc.api.DefaultIcbcClient;
import com.icbc.api.IcbcApiException;
import com.icbc.api.IcbcConstants;
import com.icbc.api.request.QrcodeGenerateRequestV2;
import com.icbc.api.request.QrcodeGenerateRequestV2.QrcodeGenerateRequestV2Biz;
import com.icbc.api.response.QrcodeGenerateResponseV2;import java.text.SimpleDateFormat;
import java.util.Date;/*** 工银二维码生成接口** 请商户配置SDK中的lib文件夹中的jar包后,根据备注1-6提示进行数据替换*/
public class QrcodeGenerateTest {//1、网关公钥protected static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwFgHddddD4kzEVPdOj03ctKM7KV+16bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zp5r6R52MY0O7BsTCLT7aHaxsANsvI9ABGx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg0W6O3AGqwIDAQAB";//2、appidprotected static final String APP_ID = "1000000ddd0000000651001";//3、密钥对认证方式,公钥在API平台登记,此处为私钥protected static final String MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7HTTvUpWkNs9ShetLtmfVXOVAhwGu3wB88TBnp+xd5Du2hthidHwOIWMo6JV58r2trIuDhap7MPiubbeJy6W4IsHwtRxV4cZ5ZvRpIHKM005A4eIfHmr/Vwo9PNXCmFHictU0ggTtwNNNrFM4gdOn1W8qMmhLjorjWglcEPj8oZgO5BNih2LCylZtRpUhTmNGzNue+hxQjY48eGWZy+cKPf147oMTqKC87P5xDfCTF/aIpVyHNeZfW1kj6VmanPoZVZL9sI4rMwacznBW+EJyqoXw1uHXMiW/WW/Zfm3LQM4lkOPneMsY8IOTq9ypPEpaUZTnDPyfXpG87Zerk9EYtAgMBAAECggEAcK3T9NL8vlkrXHy9B2ke+kPo4oTqpI4yUwtDpQhgtOH+e5qUsCfhWJl1DP0BDQAxIE2gw09EoqusAtrnnrxdsdluAIcd14CZQbamuPEg+jXKBbgyBayBaU/+Cyo1Rk9eQsNLfFy+u9IYebyHAt1leD/mX8mOGhEk8WszhFnyDPlDl48MQat+qieuZgJJ+3s4XO6u6FFWhwRnJrRDFSpc14qzsjoBUdiDtgwVFtjXL9DubxifqoQTzXj8nwFUvBXPtOzl+0JimImzM90cB0mR+bkeJ8NgaEKVz5ln1OiXfOr3RBnytMyW1D7hjlwOjdm1hg8oAWQFeN8fGUx6dmx9UD8zzmQKBgQdasdD/s+MRQ+e7lWQfV/PjbxeFpVb23FsPaHtWpPUbgJBxxi6ajEjbybzhJlkqt6cz8JGC+Nq8rn3AEMCC0/GtwqsTVD2rZRx1HUMZskfT15zCGnP/9WXsSrYJVmqs4IafiBg4vJp//aJsuO1AiabM7maWZIpmiVfZs2TvfNNCB8VrLwKBgQC7VOdP+jPTNsbFOf6s1+2FZTL+qADMu3ZJp2NQPZ/sulazKsY5WmrOqYzZgA4THEILcCk7/P2YIW+rYdSZPmkeEYPsMVpnCjdPUMtb5LoxZzvn2JeGaGY1MB/TcwkSt/anpCLnsvDSolRU2qI9K6qjPY5rBJ9oOZHjFPSPhSdasdCdYwKBgQD2LMKkYaLdVuNQxcV5JgAYW+kQu28zs1xjO2b69liaILnHct3GNEAS52+bD7r651XAKUO1uaw5WCdvDQu1RSCc+FJzC2JNYkGyoJBEZGV3/i3FtAVPa1I8RSVokLUrK8ReAz4fkRlp4NQReTTMQY0kp2ETfJDGd87qPlvJS2AGYdsadwKBgEG2RbHDVZyYkV8ruc9Nqy7o0duMeUNX2uV5RxgllczHjJQqw//oXKEDzrmY9tbzSaOTg5NcamSMDgzzM01SHDOE917J7SlJ5x72e29Pq5Sa3uO0EWr/giLUL8XPi3Y6e9ZQeEIIffuVH7noO5Lzl1bNyAB4TaaU0zzx49vYWhl7AoGAPZhGcp33nKLUvmPh1yl+L4Ziqmb7b+jT72goj3IdCxSMHQWumNp11PQKJbS10rqbJsVY8JOeUW3Cj7ZMxFsF5aTkiH/OC5yPi5X4++pYIJKLj8WsAS+MTyQD0aCdoKe4O6hJWeZLRrqZ5YlyCkAdhBsre5WEYkPXtaAfte8oMYg=";public static void main(String[] args) throws Exception {//签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);QrcodeGenerateRequestV2 request = new QrcodeGenerateRequestV2();//4、根据测试环境和生产环境替换相应ip和端口request.setServiceUrl("https://gw.open.icbc.com.cn/api/qrcode/V2/generate");//5、请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值QrcodeGenerateRequestV2Biz bizContent = new QrcodeGenerateRequestV2Biz();Date date=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");SimpleDateFormat sdf2=new SimpleDateFormat("HHmmss");System.out.println(sdf2.format(date));bizContent.setMerId("108787871409");bizContent.setStoreCode("1007878778018138");//商户系统订单号bizContent.setOutTradeNo(System.currentTimeMillis()+"");//订单总金额,单位:分bizContent.setOrderAmt("1");//商户订单生成日期bizContent.setTradeDate(sdf.format(date));//商户订单生成时间bizContent.setTradeTime(sdf2.format(date));//商户附加数据bizContent.setAttach("abcdefg");//该字段非必输项//二维码有效期  秒bizContent.setPayExpire("1200");bizContent.setNotifyUrl("127.0.0.1");//该字段非必输项//商户订单生成的机器IPbizContent.setTporderCreateIp("127.0.0.1");//扫码后是否需要跳转分行,0:否,1:是;非1按0处理bizContent.setSpFlag("0");//该字段非必输项//商户是否开启通知接口 0-否;1-是;非1按0处理bizContent.setNotifyFlag("1");request.setBizContent(bizContent);QrcodeGenerateResponseV2 response = new QrcodeGenerateResponseV2();try {//response = client.execute(request, "msgId");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一response = client.execute(request, bizContent.getMerId());//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一if (response.isSuccess()) {//6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据System.out.println("ReturnCode:"+response.getReturnCode());System.out.println("response:" + response);System.out.println("工行二维码链接为:"+response.getQrcode());} else {//失败System.out.println("ReturnCode:" + response.getReturnCode());System.out.println("ReturnMsg:" + response.getReturnMsg());}} catch (IcbcApiException e) {e.printStackTrace();}}}

这个是工行提供的demo中的源代码,其中我们只需要修改相应的merId和storeCord,以及对相应的业务参数做出匹配修改即可,本文中的demo是我修改后的版本,大家替换自己的参数修改即可。

注意,跑通代码需要导入几个jar包,前者三个是必须的,最后一个根据自己电脑的条件进行添加,这些jar包都可以在工行提供的开发包中找到

2.接收工行支付回调

    工行的支付回调,只需要在下单时传入notify_url字段即可,但是坑就坑在这里,既没有说回调参数是哪些,也没有说通过哪种方式传递参数,关键的关键是,工行就给你开放了一个80端口,但是它还就不告诉你,因为这个我是真的到处怀疑人生。所以,大家在接收回调的时候,以80端口接收,打印出所有传递参数,然后自己再做处理,这边我把打印返回参数的map贴一下

// 参数MapMap properties = request.getParameterMap();// 返回值MapMap 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();}log.info("回调参数:"+name+":"+ value);returnMap.put(name,value);}

由于返回参数涉及我们公司的一些信息,就不张贴了,大家可以根据此代码自己尝试。

工行的回调通知,不需要我们返回相应的响应信息,也不管我们有没有收到,宇宙第一大行是真的厉害!!!

3.工行退款

  

package com.youfuli.vendor.utils.icbc;import com.icbc.api.DefaultIcbcClient;
import com.icbc.api.IcbcApiException;
import com.icbc.api.IcbcConstants;
import com.icbc.api.request.QrcodeRejectRequestV2;
import com.icbc.api.request.QrcodeRejectRequestV2.QrcodeRejectRequestV2Biz;
import com.icbc.api.response.QrcodeRejectResponseV2;/*** 工银二维码退款接口* * 请商户配置SDK中的lib文件夹中的jar包后,根据备注1-6提示进行数据替换*/
public class QrcodeRejectTest {//1、网关公钥protected static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBsiQKBgQCwFgHD4kzEVPdOj03ctKM7KV+1aaa6bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zprl5r6R52MY0O7BsTCLT7aHaxsANsvI9ABGddx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg0dW6O3AGqwIDAQAB";//2、appidprotected static final String APP_ID = "10000000000000002156";//3、密钥对认证方式,公钥在API平台登记,此处为私钥protected static final String MY_PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIJBzZNaiobplRUgtJ4OzmUvZRK99ih/fUyDBOoFLtpJJCCRzp8T6V11YNlE7Xg5dt+EG7byQs2NImqg0eWEj/mBdZ7UmlAct7BNw2hyF2h4R5OEfXyjoH3wqGjKJayhaHTvLM1DYy/mDFBb0ShJYI1QMScQJZhsOhMMFhrrZwIZAgMBAAECgYAA2kdrOIOBoJPOQJmOE1C8jtPdjIrI9xSt5Imqsn/9A8dd+NuwacOfgkGXmZ0n6vc8jYa7f2uZ1AVTUtdd4IIO5bpq8s0Tw2BfWALYwr/JdUuNKSjHVQsh/Do+wl8BgOgB4RqsNXWNGtoMdsdsaC8lHKHmrVcpyJMfDc3cP07NZ1wG2zB0lQJBAM+dNZv2L/Z4RzvQcoVZEthYavZ4pkFfoWGYC4jwc5G8um76zoQyrtxWYrtTP0GS+xFFX2dDZHAkBGnZ8vfdYIUVeDbDrzWXvCEXXJqewbKwOT2KqnTKM9yj9IBatttJGgvrAKiyH4zCqZD9JaG23sKGeJ8QopL60dAkEAtc4tlKoj3XZzRUXboqz0EhkgkjzDj50zpCD1sJKZ2EZH+A/7tXwPug+RnuSmKpM2uv3msqw3prdS3K4En8+rog==";public static void main(String[] args) throws Exception {//签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);QrcodeRejectRequestV2 request = new QrcodeRejectRequestV2();//4、根据测试环境和生产环境替换相应ip和端口request.setServiceUrl("https://ip:port/api/qrcode/V2/reject");//5、请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值QrcodeRejectRequestV2Biz bizContent = new QrcodeRejectRequestV2Biz();bizContent.setMerId("02011101515151");bizContent.setCustId("Ey0LsS39FwdE35TsSW1A2eeoIRMZrjSa");//该字段非必输项bizContent.setOutTradeNo("X000000001");//该字段非必输项,out_trade_no和order_id选一项上送即可bizContent.setOrderId("020001515151201701030000001");//该字段非必输项,out_trade_no和order_id选一项上送即可bizContent.setRejectNo("X000000001");bizContent.setRejectAmt("100");bizContent.setOperId("X000000001");//该字段非必输项request.setBizContent(bizContent);QrcodeRejectResponseV2 response;try {response = client.execute(request, "msgId");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一if (response.isSuccess()) {// 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据System.out.println("ReturnCode:"+response.getReturnCode());System.out.println("response:" + response);} else {// 失败System.out.println("ReturnCode:"+response.getReturnCode());System.out.println("ReturnMsg:"+response.getReturnMsg());}       } catch (IcbcApiException e) {e.printStackTrace();}}}

换一个请求退款的url链接,相应装载参数的实体也需要变换,此处请见代码。

工行二维码支付,相比微信支付,银联支付而言,流程相对简单,规范也比较轻松,功能定位也比较明确,相应的代码都封装在sdk中,只可远观而不可亵玩焉。所以我们还得努力学习。

工商银行二维码业务开发相关推荐

  1. 手机二维码业务行业报告

    条码公司调查取样2010 1 30 View more documents from changeself. 报告中一共73页,历经2年多的收集,算得上行业中比较齐全的第一手资料了,下面贴上报告中十几 ...

  2. EBS系统扫二维码登录开发

    EBS系统扫二维码登录开发 INTRODUCTION介绍 二维码扫码登录的逻辑 INTRODUCTION介绍 目前对ERP系统的安全性提了很高的要求,其中一块就是要保证ERP用户登录系统的安全性. 之 ...

  3. Android二维码扫描开发(一):实现思路与原理

    2019独角兽企业重金招聘Python工程师标准>>> Android二维码扫描开发(一):实现思路与原理 Android二维码扫描开发(二):YUV图像格式详解 Android二维 ...

  4. 【Android 学习】之二维码扫描开发(闪光灯功能)

    .............................................................................. Android二维码扫描我们可以调用Zin ...

  5. uniApp简单使用webSocket实现核销二维码业务

    主要功能逻辑 - > 用户支付订单获取订单详情 - > 点击订单详情建立长连接 ->  商家使用机器核销二维码 -> 二维码被核销后及时刷新页面使用状态并告知用户核销成功 代码 ...

  6. 基于Android的二维码识别系统的研究与实现(eclipse开发)

    目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系 ...

  7. 个性二维码生成(android开发)

    @二维码生成 个性二维码 第一次接触二维码开发,对二维码刚有所了解的时候,就得到要做个性二维码 的需求.看着网络上的个性二维码,陷入了沉思. 心里千万遍问自己,这到底是什么实现原理呢?后面找来找去,各 ...

  8. uniapp中H5网页和打包app分别生成二维码

    一.h5网页中生成二维码业务 引入"qrcodejs2.js":npm install qrcodejs2: <template><view><vie ...

  9. 手机二维码---实现数字化图书出版之利器

    1 背景  3G:在目前TD-CDMA.WCDMA.CDMA2000三种承载网络下,3G的发展不仅仅从网络技术上比2G有很大的先进性,其业务形态和手机终端提供的功能都非常丰富地满足了手机用户的需要, ...

  10. 关于二维码的一些基础知识和问题

    什么是二维条码/二维码: 二维条码/二维码 (2-dimensional bar code) 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧 ...

最新文章

  1. 应用Java程序片段动态生成表格
  2. Android开发之在Fragment和Activity页面拍照需要注意的地方
  3. Training a classifier
  4. mockito入门_Mockito入门
  5. ServletRequest startAsync()的有用性有限
  6. 认知空间是什么意思_Number是“数”,one是“一”,那么number one什么意思?
  7. CraftAR入门教程
  8. vue axios 接口封装
  9. jQuery UI dialog实现dialog弹框显示
  10. 现控笔记(五)稳定性与Lyapunov方法
  11. 使用HanLP分词时,词性标注错误的问题
  12. Redis进阶不得不了解的内存优化细节
  13. 惠普打印机换硒鼓图解_惠普打印机墨盒更换步骤
  14. 手机中如何使用阿里云的企业邮箱
  15. 华为云计算IE面试笔记-桌面云中的用户组、虚拟机模板、模板虚拟机、虚拟机组和桌面组的关系及区别。发放完整复制和链接克隆虚拟机时,步骤有什么区别,要怎么选择桌面组?
  16. mysql视图 实验报告_数据库实验报告(视图).doc
  17. 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了
  18. 交换机的全trunk模式(native vlan)
  19. 微信公众平台消息体加解密实现
  20. 为什么戏说php,戏说PHP的嵌套函数

热门文章

  1. android studio开发app设置登录界面
  2. 如何查询HP-UX主机防火墙状态
  3. 保密基本知识试题(2017年版)(共281题)
  4. 物联网技术主要有哪些,目前都应用在哪些领域?
  5. 台式计算机为什么数字输入不了,电脑小键盘不能输入数字该怎么办?
  6. 台式计算机把光驱改成硬盘,台式机光驱位怎么安装硬盘
  7. mysql如何创建视图
  8. java 音频 网络传输_如何流式传输音频?
  9. Java 计量单位换算 工具类
  10. libcurl入门之相关接口函数curl_easy_getinfo