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.pswp.cn/news/277489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277489.shtml
英文地址,請注明出處:http://en.pswp.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、遠…