中国工商银行支付对接

一:参考资料

工行支付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;
相关推荐
JdayStudy2 小时前
SIR 网络传播仿真软件说明书
开发语言·网络·php
BingoGo4 小时前
Laravel 13 正式发布 使用 Laravel AI 无缝平滑升级
后端·php
代龙涛6 小时前
WordPress 主题开发指南:模板文件、函数与页面选型规则
开发语言·后端·php·wordpress
Qlittleboy9 小时前
TP5.0的“请求缓存”,把页面缓存为静态HTML文件,提升加载速度
前端·缓存·html·php
zhougl9969 小时前
配置SSH免密
网络·ssh·php
xiangpanf9 小时前
PHP vs C语言:30字解析两大编程语言差异
c语言·开发语言·php
海边的梦9 小时前
救命!此电脑网络位置异常?AD域排错3步封神,DNS/NetLogon/GPO根因一键定位
服务器·开发语言·php
weixin_449310849 小时前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
幽络源小助理9 小时前
Typecho博客搭建全攻略:宝塔面板安装教程、源码部署 | 幽络源
php·typecho
Qlittleboy10 小时前
thinkphp如何配置模版缓存,来显著提高页面加载速度
缓存·php