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

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

三:思路:

目前大概有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的文件夾:

先看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

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

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

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);

最後能獲取簽名:

最後的最後 :

在開發過程中,我遇到了一個問題, 通過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文件中。

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

  1. 信捷伺服刚性调整_信捷電氣(603416):伺服與PLC增長將加速,口罩機解決方案帶來新增量...

    來源:電新產業研究 ◾公司是國產小型PLC領先企業,具有一定的技術.渠道優勢.藉助PLC業務的影響與渠道優勢,公司比較成功的推動了伺服的搭售使用比例.近幾年,公司伺服業務產品品質也有較大提升,業內口碑 ...

  2. Ripro9.0全解密去扩展版修正升级版+两款WP美化包+下载信息美化等插件,新增易支付接口

    Ripro9.01.去扩展(去除了,可以直接在虚拟机上用,免安装扩展,省去了很多麻烦) 链接:Ripro9.0修正升级版带WP两款美化包和稀有插件_随便下源码网 2.修复直接付费开通会员,泛滥的版本加 ...

  3. 力特usb转232驱动程序下载_毕亚兹 USB转RJ45网线接口USB扩充口,特殊时期在家办公更轻松...

    现在笔记本越来越轻薄,机身上自带RJ45接口的越来越少.但是日常使用过程中,无论在办公环境还是在酒店环境,发现无线WIFI并不是那么的稳定,即使碰到有网口的地方,发现自己电脑还插不了网线,最终结果就是 ...

  4. 杉德支付php代码实现_杉德ecshop,thinkphp,shopnc在线支付接口,支付插件(payment plugin含源码)...

    最近应一个客户的要求,给他的一个ecshop网站开发杉德在线支付接口和代付接口. 杉德有自己的收银台,集成了各类银行,也是不错. 杉德支持H5,APP,网银快捷等支付接口.文档还算比较齐全. 比较有特 ...

  5. thinkpadt410接口介绍_转:联想ThinkPad T410笔记本DisplayPort接口详解

    联想ThinkPad笔记本T410采用了DisplayPort接口,很多朋友不了解这个接口做什么用的,我们这里给大家介绍一下. DisplayPort也是一种高清数字显示接口标准,可以连接电脑和显示器 ...

  6. php-v 查看不到版本,解決php -v查看到版本於phpinfo()打印的版本不一致問題

    整個事件的起因是這樣的 通過git拉取laraevl項目發現缺少.env文件,打算使用composer install生成一個.env文件,然后提示composer最低使用php版本7.1.3而檢測到 ...

  7. 關於python 2.x中文字編碼的簡單說明

    關於python 2.x中文字編碼的簡單說明 關於python 2.x中文字編碼的簡單說明 from v2ex By 013231 at 2 天前, 154 次点击 剛剛看到有人在糾結文字編碼的問題, ...

  8. figma下载_在Figma上进行原型制作的各种触发选项

    figma下载 Prototypes are model versions of digital products. They're used to measure usability by test ...

  9. figma下载_在Figma中进行原型制作的技巧和窍门

    figma下载 自定义过渡和微交互 (Custom transitions and micro-interactions) Yep, I know that there are a lot of us ...

最新文章

  1. Python图像处理:形态学操作
  2. 鼠标终将消失,未来我们有哪些人机交互方式?
  3. 内存颗粒位宽和容量_64M的SDRAM颗粒 一般内存是多大的?
  4. springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南
  5. 结合Composer 新版本PHP的开发方式
  6. kali怎么进入root用户_linux中怎么进入root用户
  7. html代码怎么出歌词,html中的歌词翻译
  8. yasm,nasm的关系
  9. Java期末重点复习 | 文本版
  10. android netd的工作流程解析
  11. 神经网络的参数(Weight)
  12. MYS-6ULX-IOT 开发板测评——实现简单的物联网应用
  13. java抽奖活动_java抽奖思路
  14. 【Win 10 应用开发】MIDI 音乐合成——音符消息篇
  15. 约瑟夫环!编 号是1,2,??,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向 自1开始顺序报数,报到m时停止报数。
  16. 浪潮服务器键盘自动输空格,浪潮推出自主车载加固1U服务器填补国内该领域空白...
  17. java-php-python-ssm商场VIP管理系统计算机毕业设计
  18. JavaScript弹出模式窗口
  19. MDK中符号代号说明
  20. LCD液晶显示屏闪屏问题解析

热门文章

  1. 常用 SQL Server 规范集锦
  2. 有一种感情,叫“发小”
  3. sqlhelper中事务的简单用法(初学者)
  4. asp js单步调试_如何使用Chrome的控制台高效的调试Javascript代码?
  5. v380pro设备连接失败_天猫精灵可以连接台式电脑使用吗?需要什么东西? 安装操作是哪几个步骤? 最好有图片解说!...
  6. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc
  7. 送你一份用Electron开发桌面应用的避坑指南【送3本书,含犀牛书】
  8. Web Components 上手指南
  9. JS中创建函数的几种方式
  10. 本周ASP.NET英文技术文章推荐[10/21 – 10/27]