PHP 对接ICBC支付的经验分享

本文分享了在PHP项目中对接工商银行支付接口的经验,包括如何重写JAVA DEMO以适应PHP,搭建JAVA接口进行加密,以及整合数据请求支付的详细步骤,解决了没有PHP版本DEMO的困境。
摘要由CSDN通过智能技术生成

概述:

最近在做一个澳门的商城项目,其中需要跟当地的工商银行对接支付,其中的提交支付时,工商银行的加密有自己加密程序,然而他们只提供了JAVA和C 语言的DEMO,并没有PHP的DEMO,甚至连PHP的扩展也说没有,一时让我陷入了困境,不知道怎解决,于是我在百度 谷歌上寻找解决方法。

问题解决方案:

1、java版本的domo用PHP重写

其实这澳门提供的接口的加密方式跟国内大陆的一致,也是用infosec扩展的程序进行加密,大陆的一些开发人员对接接口是直接把JAVA转化成PHP,不过必须的当然是相关的PHP扩展。不过,让我失望的是,当我问工作人员有没有PHP扩展时,他却一问三不知,只有JAVA版本的。而网友分享的PHP拓展,一来不安全,二来只有PHP5.6的版本,而我们服务器已经升级到PHP7了,不知道能否兼容。因此,保守起见,最终放弃了该做法。
(该方法可参考链接:https://blog.csdn.net/weixin_41750160/article/details/83341199)

2、调用java接口进行加密

既然他们提供了java的demo,其实应用起来也不难。但是需要的是搭建javaWeb的环境,并且把demo部署好,我们让php程序加密时候调用一下自己的做的java 加密接口就好了。最终,我选择了该方法。
(该方法可参考链接:https://www.cnblogs.com/weishuan/p/8372063.html)

搭建java接口过程:

1、安装tomcat

该过程不熟悉的朋友,可以按照教程一步步来,值得注意的是,tomcat的端口是8080,其实根据我们的需求,我们只需要自己的PHP程序所在服务器能请求到就行,也就是说localhost能访问或者固定IP就好了,以防给黑客多一个攻击的入口,因此该端口可以不开放或者限制IP访问。
可以参考https://blog.csdn.net/lcyaiym/article/details/76696192

2、部署java项目

其实工商银行对接人一般会提供接口介绍的PPT给你,有加密方法的demo,但是也还没达到开箱即用的程度,因此我分享一下我自己的写的java demo给大家参考。请根据自己的文件路径进行修改,注释部分是调试的,如果返回不成功,可以去掉注释进行分步调试。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.com.infosec.icbc.ReturnValue;



/**
 * Servlet implementation class getSign
 */
@WebServlet(&
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Java代码示例,用于对接银盛支付: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class YinshengPay { // 银盛支付API地址 private static final String API_URL = "https://api.ysepay.com/gateway/api/directPay"; // 商户号和API密钥 private static final String MERCHANT_ID = "your_merchant_id"; private static final String API_KEY = "your_api_key"; public static void main(String[] args) throws Exception { // 构造请求参数 Map<String, String> params = new HashMap<String, String>(); params.put("version", "1.0"); params.put("merchantId", MERCHANT_ID); params.put("orderNo", "your_order_no"); params.put("orderAmount", "100.00"); params.put("orderCurrency", "CNY"); params.put("orderDatetime", "20210813120000"); params.put("productName", "your_product_name"); params.put("productDesc", "your_product_desc"); params.put("payType", "1"); params.put("bankCode", "ICBC"); params.put("cardType", "1"); params.put("cardNo", "your_card_no"); params.put("cardExpire", "202212"); params.put("cardCvv", "123"); params.put("notifyUrl", "your_notify_url"); params.put("signType", "MD5"); // 生成签名 String sign = generateSign(params, API_KEY); params.put("signMsg", sign); // 发送请求 String response = sendRequest(API_URL, params); // 解析响应结果 System.out.println(response); } /** * 生成签名 */ private static String generateSign(Map<String, String> params, String apiKey) throws Exception { StringBuilder sb = new StringBuilder(); sb.append(apiKey); Iterator<String> it = params.keySet().iterator(); while (it.hasNext()) { String key = it.next(); String value = params.get(key); sb.append(key).append("=").append(value).append("&"); } sb.deleteCharAt(sb.length() - 1); String sign = MD5(sb.toString()).toUpperCase(); return sign; } /** * 发送请求 */ private static String sendRequest(String url, Map<String, String> params) throws Exception { HttpURLConnection conn = null; OutputStreamWriter osw = null; BufferedReader br = null; try { URL u = new URL(url); conn = (HttpURLConnection) u.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); conn.setUseCaches(false); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); osw = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); osw.write(getRequestData(params)); osw.flush(); br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } return sb.toString(); } finally { if (osw != null) { osw.close(); } if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } } /** * 构造请求数据 */ private static String getRequestData(Map<String, String> params) throws Exception { StringBuilder sb = new StringBuilder(); Iterator<String> it = params.keySet().iterator(); while (it.hasNext()) { String key = it.next(); String value = params.get(key); sb.append(key).append("=").append(URLEncoder.encode(value, "UTF-8")).append("&"); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } /** * 计算MD5摘要 */ private static String MD5(String s) throws Exception { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(s.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte b : array) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } } ``` 上面的代码中,需要替换掉示例中的商户号、API密钥、订单号、金额、商品名称、商品描述、银行卡信息等参数。发送请求和解析响应的代码也需要根据具体的业务进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值