中国工商银行支付对接

一:参考资料

工行支付SDK:https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html

工行支付资料:https://download.csdn.net/download/huaweichenai/92636164

PHP对接工行支付组件:https://download.csdn.net/download/huaweichenai/92636166

二:支付详解

1.支付地址

https://gw.open.icbc.com.cn/api/cardbusiness/qrcode/qrgenerate/V1

2.支付参数

app_id:APP的编号,应用在API开放平台注册时生成

msg_id:消息通讯唯一编号,每次调用独立生成,APP级唯一

format:请求参数格式,仅支持json

charset:字符集 ,缺省为UTF-8

sign_type:签名类型,本接口为RSA2-RSAWithSha256认证方式,为RSA2

sign:报文签名

timestamp:交易发生时间戳,yyyy-MM-dd HH:mm:ss格式

biz_content:请求参数的集合

请求参数

mer_id:商户线下档案编号

out_trade_no:商户系统订单号

order_amt:订单总金额 单位:分

trade_date:商户订单生成日期 yyyyMMdd

trade_time:商户订单生成时间 HHmmss

pay_expire:二维码有效期 单位:秒,必须小于24小时

notify_url:商户接收支付成功通知消息URL

tporder_create_ip:商户订单生成的机器IP

sp_flag:扫码后是否需要跳转分行 0:否,1:是,默认值0

notify_flag:商户是否开启通知接口 0-否;1-是,默认值0

3.签名生成逻辑

(1)签名原文构造

  • 获取所有请求参数,不包括字节型参数,如文件、字节流,剔除sign字段。
  • 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
  • 将排序后的参数与其对.值,组合成"参数=参数值"的格式,并且把这些参数用&字符连接来,此时生成的字符串为待签名字符串。

签名原文示例:

复制代码
/api/cardbusiness/qrcode/qrgenerate/V1?app_id=XXX&biz_content={"mer_id":"XXX","out_trade_no":"XXX","order_amt":"1","trade_date":"20260206","trade_time":"095241","pay_expire":"3600","notify_url":"XXX","tporder_create_ip":"127.0.0.1","notify_flag":"1"}&charset=UTF-8&format=json&msg_id=XXX&sign_type=RSA2&timestamp=2026-02-06 09:52:41

(2)签名生成

将待签名字符串进行RSA2签名,这里以PHP为例如下:

复制代码
$privateKey = '提供的签名私钥';
$data = '待签名字符串';
$privateKey = str_replace(["\r", "\n", " "], '', $privateKey);
$privateKey "-----BEGIN PRIVATE KEY-----\n".$privateKey."\n-----END PRIVATE KEY-----";
$success = openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
if (!$success) {
    echo '签名失败';
    exit();
}
$signature = base64_encode($signature);

4:接口调用demo示例

复制代码
$bizContent = [
    'mer_id' => 'xxx',//商户线下档案编号
    'out_trade_no' => 'xxx',//商户系统订单号
    'order_amt' => '1,//金额 单位:分
    'trade_date' => '20260206',//商户订单生成日期
    'trade_time' => '100101',//商户订单生成时间
    'pay_expire' => '3600',//二维码有效期
    'notify_url' => 'http://www.test.com',//商户接收支付成功通知消息URL
    'tporder_create_ip' => '127.0.0.1',//商户订单生成的机器IP
	'sp_flag' => '0',//扫码后是否需要跳转分行
    'notify_flag' => '1',//商户是否开启通知接口
];

$requestData = [
    'app_id' => 'xxx',//APPID
    'msg_id' => 'xxx',//消息通讯唯一编号
    'format' => 'json',//请求参数格式
    'charset' => 'UTF-8',//字符集
    'sign_type' => 'RSA2',//签名类型
    'timestamp' => '2026-02-06 10:01:01',
    'biz_content' => json_encode($bizContent, JSON_UNESCAPED_UNICODE),
];

//签名
$requestData['sign'] = 'xxx';//签名


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '接口地址');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($requestData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 生产环境开启SSL验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
    throw new \Exception("HTTP请求失败:" . curl_error($ch));
}
curl_close($ch);

return $response;
相关推荐
两个人的幸福9 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820712 天前
PHP 扩展——从入门到理解
php
鹏仔先生13 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下13 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip13 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒13 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25013 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis13 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel