infoseccrypto_java下载_關於php接ICBC的支付接口的解決方案

一:背景: 目前項目使用的是php語言開發,需要接入中國工商銀行的ICBC的線上支付接口。

二:遇到的問題:支付時需要對數據簽名,但是銀行那邊不提供php版本的程序,只有java版本的,以下是對接人回復的郵件:

af04ee0125ec13d9c535ea908cedb489.png

三:思路:

目前大概有3種解決方案:

1.  通過使用一個叫 php-java-bridge 的插件,在php中調用java的函數

2. 把java的函數改寫成php版本

3. 在服務器配置javaWeb環境,通過http請求把簽名的參數傳入,從而獲取簽名

四: 具體做法:

我採取的是第3種方法,畢竟對java不太熟悉,不想在語言層面作文章。

我使用到的是ubuntu14.04 作爲服務器,首先配置javaWeb的環境

1. 因爲php的環境已經配置好了,所以 php環境的配置環境可以參考: http://www.cnblogs.com/weishuan/p/4402744.html

2.  tomcat 的環境配置:

sudo apt update

sudo apt install tomcat7//安裝tomcat7

sudo apt installdefault-jdk //javac 編譯

安裝好之後,默認的端口是8080,可以通過 http://www.服務器url:8080 驗證

如果需要修改端口號,可以修改 /var/lib/tomcat7/config/server.xml

//原來的配置

//修改後的配置

接下來就是java的代碼

getSign.java

importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcn.com.infosec.icbc.ReturnValue;/*** Servlet implementation class getSign*/@WebServlet("/getSign")public class getSign extendsHttpServlet {private static final long serialVersionUID = 1L;/***@seeHttpServlet#HttpServlet()*/

publicgetSign() {super();

}protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

doPost(request,response);

}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

PrintWriter out=response.getWriter();

String type= request.getParameter("type"); //區分是調用哪個函數if (type != null) {

String interfaceName= request.getParameter("interfaceName");

String interfaceVersion= request.getParameter("interfaceVersion");

String areaCode= request.getParameter("areaCode");

String merID= request.getParameter("merID");

String merAcct= request.getParameter("merAcct");

String merURL= request.getParameter("merURL");

String notifyType= request.getParameter("notifyType");

String orderid= request.getParameter("orderid");

String amount= request.getParameter("amount");

String curType= request.getParameter("curType");

String resultType= request.getParameter("resultType");

String orderDate= request.getParameter("orderDate");

String merCerFileKeyPath= request.getParameter("merCerFileKeyPath");

String keyPass= request.getParameter("keyPass");

StringBuilder tranData= newStringBuilder();

tranData.append(interfaceName).append(interfaceVersion).append(areaCode).append(merID).append(merAcct).append(merURL).append(notifyType).append(orderid).append(amount).append(curType).append(resultType).append(orderDate);

String MerSign=getMerSignMsgBase64(tranData.toString(), merCerFilePath, keyPass);

out.print(MerSign);

}else{

String merCerFileCrtPath= request.getParameter("merCerFileCrtPath");

String merCertBase64=getMerCertBase64(merCerFilePath);

out.print(merCertBase64);

}

}public staticString getMerSignMsgBase64(String tranData,String merCerFilePath,String keyPass) {byte[] tranByteSrc =tranData.toString().getBytes();char[] keyPasss =keyPass.toCharArray();

File merSineFile= newFile(merCerFilePath);

FileInputStream fileInputStream;try{

fileInputStream= newFileInputStream(merSineFile.getAbsolutePath());byte[] sineBytes = new byte[fileInputStream.available()];

fileInputStream.read(sineBytes);

fileInputStream.close();byte[] sign =ReturnValue.sign(tranByteSrc,tranByteSrc.length,sineBytes,keyPasss);byte[] EncSign =ReturnValue.base64enc(sign);

String merSignMsgBase64= new String(EncSign,"UTF-8").toString();

merSignMsgBase64= merSignMsgBase64.replace("\n", "");

merSignMsgBase64= merSignMsgBase64.replace("\r", "");returnmerSignMsgBase64;

}catch(Exception e) {

System.out.println("getMerSignMsgBase64"+e.getMessage());

e.printStackTrace();

}return "";

}public staticString getMerCertBase64(String merCerFilePath) {

File merCerFile= newFile(merCerFilePath);

FileInputStream fileInputStream;try{

fileInputStream= newFileInputStream(merCerFile.getAbsolutePath());

System.out.println(merCerFile.getAbsolutePath());byte[] bytes = new byte[fileInputStream.available()];

fileInputStream.read(bytes);

fileInputStream.close();byte[] EncCerts=ReturnValue.base64enc(bytes);

String merCertBase64=newString(EncCerts).toString();

merCertBase64= merCertBase64.replace("\n", "");

merCertBase64= merCertBase64.replace("\r", "");

System.out.println("IcbcOpayFileReader.getMerCertBase64:"+merCertBase64);returnmerCertBase64;

}catch(FileNotFoundException e) {

System.out.println("getMerCertBase64"+e.getMessage());

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}return "";

}

}

通過http的post或者get方法接收參數,簽名後返回字符串。

部署java的代碼,在/var/lib/tomcat7/webapps/目錄下,新建一個icbc的文件夾:

18e1eaa1466b9f01a2760d9e26282fef.png

先看web.xml裏面的內容

http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"metadata-complete="true">

icbc

getSign

icbc

/getSign

關於getSign.class的編譯,先確保工行的兩個jar包放在lib的目錄里,然後在getSign.java所在的路徑執行以下目錄

javac -cp /var/lib/tomcat7/webapps/icbc/WEB-INF/lib/InfosecCrypto_Java1_02_JDK13+.jar:/var/lib/tomcat7/webapps/icbc/WEB-INF/lib/icbc.jar:/usr/share/tomcat7/lib/servlet-api.jar -d /var/lib/tomcat7/webapps/icbc/WEB-INF/classes/ getSign.java

新建一個 /var/www/icbc/ 的文件,把 getSign.java 丟進去,爲了方便,我新建一個腳本文件 javac_icbc.sh

if javac -cp /var/lib/tomcat7/webapps/icbc/WEB-INF/lib/InfosecCrypto_Java1_02_JDK13+.jar:/var/lib/tomcat7/webapps/icbc/WEB-INF/lib/icbc.jar:/usr/share/tomcat7/lib/servlet-api.jar -d /var/lib/tomcat7/webapps/icbc/WEB-INF/classes/getSign.java

then

echo"javac -cp /var/lib/tomcat7/webapps/icbc/WEB-INF/lib/InfosecCrypto_Java1_02_JDK13+.jar:/var/lib/tomcat7/webapps/icbc/WEB-INF/lib/icbc.jar:/usr/share/tomcat7/lib/servlet-api.jar -d /var/lib/tomcat7/webapps/icbc/WEB-INF/classes/ getSign.java"echo"------ 编译成功,重启tomcat 服务器 --------"

if sudo /etc/init.d/tomcat7 restart

then

echo"------ 服务器重启成功 ---------"

elseecho"------ 服务器重启失败, 请手动输入下面命令重启 ------"echo"sudo /etc/init.d/tomcat7 restart"fielseecho"------ 编译失败,请查看 /var/lib/tomcat7/webapps/icbc/WEB-INF/lib/ 文件夹是否存在以下2个文件: --------"echo"1. InfosecCrypto_Java1_02_JDK13+.jar"echo"2. icbc.jar"fi

然後添加執行權限:

sudo chmod +x javac_icbc.sh

在執行文件編譯之前,請確保 /var/lib/tomcat7/webapps/icbc/ 具有讀寫權限

sudo chmod -R 777 /var/lib/tomcat7/webapps/icbc/sudo chmod-R 777 /var/lib/tomcat7/webapps/icbc/*

然後執行javac_icbc.sh

./javac_icbc.sh

db56c425cddc629e66eba72c0c28903f.png

最後,測試一下環境是否配置成功

確保你的公鑰和私鑰都有權限

sudo chmod -R 777 私鑰.keysudochmod -R 777 公鑰.crt

新建一個index.php文件測試一下:

$url = "http://localhost:8080/icbc/getSign?merCerFileCrtPath=".$merCerFileCrtPath;function _request($url){$ch=curl_init();

curl_setopt($ch,CURLOPT_HEADER,0);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_URL,$url);$result=curl_exec($ch);

curl_close($ch);return $result;

}echo _request($getBaseUrl);echo "
";echo "-----------";echo _request($getSignUrl);

最後能獲取簽名:

a6ae9278231ab5d645df61c4f77aa534.png

最後的最後 :

在開發過程中,我遇到了一個問題, 通過post或者get 方法時,傳遞的參數過多,超出tomcat的緩衝區,目前還沒解決。

org.apache.coyote.http11.AbstractHttp11Processor process

信息: Error parsing HTTP request header

Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

百度和google 發現是:Tomcat的header缓冲区大小不够,只需要在server.xml中增加maxHttpHeaderSize字段即可

但是我加了還是報錯,無奈只能把post的參數減少,把固定的參數寫死在java文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AS 中 Plugin for Gradle 和 Gradle 之间的版本对应关系

Plugin for Gradle 和 Gradle 之间的版本对应关系 来源:https://developer.android.com/studio/releases/gradle-plugin.html Plugin versionRequired Gradle version1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.…

java bean 工厂模式_深入理解Java的三种工厂模式

一、简单工厂模式简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类实现汽车接口public interfaceCar {String getName();}奔驰类public class Benz implementsCar {Ov…

java windows 取所有任务_Win下,通过Jstack截取Java进程中的堆栈信息

在Java软件的使用过程中,有时会莫名的出现奇怪的问题。而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里。举个例子,当我们在做某个操作时,莫名的会弹出多个警告框&#…

docker mysql Exit 1

用laradock启动mysql时,state总是 Exit 1 ,docker-compose build后也没有效果 这时应该在~/.laradock/data(.env的DATA_PATH_HOST路径)下,把mysql的数据文件删除 这种情况常见于mysql安装多版本&#xff0c…

redis基础一_常用指令

# Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: #./redis-server /path/to/redis.conf docker启动redis: docker run -d -p 6379:6379 -v /home/anmin/Desktop/…

滴滴Booster移动APP质量优化框架 学习之旅 三

推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源优化和无用资源优化进行了讨论。这里对不可编译无用assets资源优化进行讨论。 先看微信Matrix-ApkC…

java 最后的异常_java – 最后不要抛出堆栈溢出异常

Error不是例外.所以捕捉任何异常都不会捕获StackOverflowError.所以让我们先来看一下“明显的错误” – (这段代码不太适合这个答案后面的说明):catch(Throwable e){System.out.println("Catch");}如果您进行此更改,您将发现代码仍然不打印.但是它不会打印…

Colder框架硬核更新(Sharding+IOC)

目录 引言控制反转读写分离分库分表 理论基础设计目标现状调研设计思路实现之过五关斩六将 动态对象动态模型缓存数据源移植查询表达式树深度移植数据合并算法事务支持实际使用展望未来引言 前方硬核警告:全文干货11000字,请耐心阅读 遥想去年这个时候&a…

python:小心类实例的属性动态绑定机制

为什么80%的码农都做不了架构师?>>> class Test:def __init__(self):self.__keyinitdef get_key(self):return self.__keydef set_key(self,key):self.__keykeyif __name__ __main__:obj Test()print(obj.get_key())#输出初始值initobj.set_key(通过s…

java 获取手机归属地_java 获取手机归属地

java 获取手机归属地[2021-01-30 20:46:44] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:…

Atom常用功能插件

minimap代码缩略图插件 代码粒子效果activate-power-mode 代码格式化插件atom-beautify packages-->Atom Beautify-->Beautify进行格式化 标签折叠 autoclose-html 转载于:https://www.cnblogs.com/chenxi-hxl/p/9464120.html

mui aniShow 动画属性

aniShow: animationType //mui切换窗口的动画效果;(默认为slide-in-right);1."auto": (String 类型 )自动选择动画效果,使用上次显示窗口设置的动画效果,如果是第一次显示则默认动画效果。 2.&qu…

java中和char功能相反的是_JAVA基础语法

java的基础语法Java中的程序可分为结构定义语句和功能执行语句.结构定义语句:用于声明一个类或方法,功能执行语句用于实现具体的功能。功能执行语句:每条功能执行语句的结尾都必须用英文分号(;)结束。public修饰的类名必须和文件名一致(如果没…

P1357 花园 (矩阵快速幂+ DP)

题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m < 5 n < 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速幂加速dp的 因为每一位的转移都是一样的 用一个矩阵表示状态i能否转移到状态j 然后跑一遍 统计答案特…

IDEA设置类、方法注释模板

类注释模板 File -> Other Setting -> Default Setting打开默认设置 Editor -> File and Code Templates -> Files -> Class 找到类注释模板&#xff0c;在public class前面添加模板注释 /** * program: ${PROJECT_NAME}->${NAME} * description: ${descript…

Element.shadowRoot

Element.shadowRoot转载于:https://www.cnblogs.com/yishenweilv/p/11083278.html

netty源码分析之服务端启动全解析

background netty 是一个异步事件驱动的网络通信层框架&#xff0c;其官方文档的解释为 Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and stream…

捕鱼达人java源代码解析_捕鱼达人源码Java

【实例简介】捕鱼达人源码Java实现的完整代码,对应的源码分析文章http://write.blog.csdn.net/postedit【实例截图】【核心代码】Fishlord├── bin│ ├── fishlord│ │ ├── Fish.class│ │ ├── Fishlord.class│ │ ├── Net.class│ │ ├─…

Android-一张图理解MVP的用法

M和V通过P交互&#xff0c;M做了两件事&#xff0c;开启子线程做耗时操作&#xff0c;然后使用原生的Hander方式切回主线程回调结果给P。 M做的两件事也可以使用比较流行的rxjava实现&#xff1a; 备注&#xff1a;图片不清晰可以看这里 转载于:https://www.cnblogs.com/develo…

Android 使用jtds远程访问数据库

最近老师让我用jtds这个jar包远程访问数据库中的数据&#xff0c;虽然不难&#xff0c;但有几个点还是要注意一下的。 1、jtds的jar包我使用的是1.2.7这个版本的&#xff0c;如果是Java工程使用的是1.3.1这个版本&#xff0c;Android工程不能使用1.3.1否则连接不上数据库 2、远…