2025-10-17 17:18:15 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace addons\shopro\library\ccblife;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 建行生活MD5签名类
|
|
|
|
|
|
* 处理API消息签名和支付字符串签名
|
|
|
|
|
|
*/
|
|
|
|
|
|
class CcbMD5
|
|
|
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 生成API消息签名
|
2025-10-18 01:16:25 +08:00
|
|
|
|
*
|
|
|
|
|
|
* ⚠️ 注意:建行API接口签名使用大写MD5
|
|
|
|
|
|
* 签名规则:MD5(JSON报文 + 服务方私钥) → 转大写
|
|
|
|
|
|
*
|
|
|
|
|
|
* 示例:
|
|
|
|
|
|
* message = '{"CLD_HEADER":{...},"CLD_BODY":{...}}'
|
|
|
|
|
|
* privateKey = 'MIICeAIBA...'
|
|
|
|
|
|
* sign = strtoupper(md5(message + privateKey))
|
2025-10-17 17:18:15 +08:00
|
|
|
|
*
|
|
|
|
|
|
* @param string $message JSON格式的源报文
|
2025-10-18 01:16:25 +08:00
|
|
|
|
* @param string $privateKey 服务方私钥(BASE64格式)
|
2025-10-17 17:18:15 +08:00
|
|
|
|
* @return string 大写的32位MD5签名
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function signApiMessage($message, $privateKey)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 移除私钥中的空格和换行
|
|
|
|
|
|
$privateKey = preg_replace('/\s+/', '', $privateKey);
|
|
|
|
|
|
|
2025-10-18 01:16:25 +08:00
|
|
|
|
// 计算MD5并转大写(建行要求)
|
2025-10-17 17:18:15 +08:00
|
|
|
|
return strtoupper(md5($message . $privateKey));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 验证API消息签名
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $message JSON格式的源报文
|
|
|
|
|
|
* @param string $signature 待验证的签名
|
|
|
|
|
|
* @param string $privateKey 商户私钥(BASE64格式)
|
|
|
|
|
|
* @return bool 签名是否有效
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function verifyApiSignature($message, $signature, $privateKey)
|
|
|
|
|
|
{
|
|
|
|
|
|
$expectedSignature = self::signApiMessage($message, $privateKey);
|
|
|
|
|
|
return $expectedSignature === strtoupper($signature);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 生成交易流水号
|
|
|
|
|
|
* 格式:YYYYMMDDHHMMSS + 6位随机数
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string 20位交易流水号
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function generateTransactionSeq()
|
|
|
|
|
|
{
|
|
|
|
|
|
$timestamp = date('YmdHis');
|
|
|
|
|
|
$random = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
|
|
|
|
|
|
return $timestamp . $random;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 生成订单号
|
|
|
|
|
|
* 格式:前缀 + YYYYMMDDHHMMSS + 4位随机数
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $prefix 订单号前缀,默认'CCB'
|
|
|
|
|
|
* @return string 订单号
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static function generateOrderId($prefix = 'CCB')
|
|
|
|
|
|
{
|
|
|
|
|
|
$timestamp = date('YmdHis');
|
|
|
|
|
|
$random = str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
|
|
|
|
|
|
return $prefix . $timestamp . $random;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|