签名说明和公共参数说明
<h2><strong>Java代码示例</strong></h2>
<pre><code>/** base64
* 加密
* @param str
* @return
* @throws UnsupportedEncodingException
*/
public String Base64Encode(String str) throws UnsupportedEncodingException {
return new String((new Base64()).encode(str.getBytes()), &quot;UTF-8&quot;);
}
/**
base64
* 解密
*/
public String Base64Decode(String str) throws UnsupportedEncodingException, IOException {
return new String((new Base64()).decode(str), &quot;UTF-8&quot;);
}
/**
* 生成签名
* 构建待签名字符串:
* 将所有签名参数按照一定规则(如字典序)进行排序。
* 将排序后的参数按照“key=value”的格式拼接成一个字符串,参数之间用“&amp;”符号连接。
* 例如:appid=xxx&amp;appkey=yyy&amp;timestamp=zzz&amp;param1=value1&amp;param2=value2。
* 生成签名:
* 使用哈希算法(如SHA-256对待签名字符串进行加密处理。
* 将加密后的结果作为签名。
*/
@SuppressWarnings(&quot;all&quot;)
public String generateSignature(String appKey,Map&lt;String, Object&gt; params) throws NoSuchAlgorithmException {
// 构建待签名字符串
StringBuilder sb = new StringBuilder();
TreeMap&lt;String, Object&gt; sortedParams = new TreeMap&lt;&gt;(params);
sortedParams.put(&quot;appKey&quot;, appKey);
System.out.println(JSONUtil.parseObj(sortedParams));
for (Map.Entry&lt;String, Object&gt; entry : sortedParams.entrySet()) {
sb.append(entry.getKey()).append(&quot;=&quot;).append(entry.getValue()).append(&quot;&amp;&quot;);
}
// 去除最后一个&#039;&amp;&#039;字符
String unsignedString = sb.toString().substring(0, sb.length() - 1);
// 使用SHA-256算法生成签名
MessageDigest digest = MessageDigest.getInstance(&quot;SHA-256&quot;);
byte[] hashBytes = digest.digest(unsignedString.getBytes());
// 将字节数组转换为十六进制字符串
StringBuilder hashString = new StringBuilder();
for (byte b : hashBytes) {
hashString.append(String.format(&quot;%02x&quot;, b));
}
return hashString.toString();
}
/**
* 请求手续费余额示例
* @throws NoSuchAlgorithmException
* @throws IOException
*/
@Test
public void t1() throws NoSuchAlgorithmException, IOException {
// 示例参数
Map&lt;String, Object&gt; params = new TreeMap&lt;&gt;();
params.put(&quot;appId&quot;, &quot;202412061144571005&quot;); //appId
params.put(&quot;clientTransId&quot;, &quot;12313131&quot;); //外部请求号
String timestamp = String.valueOf(System.currentTimeMillis()); // 获取当前时间戳
params.put(&quot;timestamp&quot;, timestamp);//时间戳误差不能在三分钟之外
//业务参数
JSONObject params1=new JSONObject();
params1.put(&quot;clientTransId&quot;,&quot;12313131&quot;);
String s = this.Base64Encode(params1.toString());
params.put(&quot;data&quot;,s);
// 生成签名 生成签名需要加appKey 外部不用传此参数
String signature = generateSignature(&quot;2a920199b90f4cecb71d4ef6c7179b57&quot;,params);
params.put(&quot;sign&quot;,signature);
JSONObject entries = JSONUtil.parseObj(params);
System.out.println(entries);
//发送请求
String post = HttpUtil.post(&quot;http://127.0.0.1:8081/zfb-apiV2/commission&quot;, entries.toString());
System.out.println(post);
JSONObject entries1 = JSONUtil.parseObj(post);
String data = entries1.getStr(&quot;data&quot;);
String s1 = this.Base64Decode(data);
System.out.println(s1);
System.out.println(post);
// 输出签名
System.out.println(&quot;Generated Signature: &quot; + signature);
}</code></pre>
<h3>PHP代码示例</h3>
<p>```<?php</p>
<p>/**</p>
<ul>
<li>Base64编码</li>
<li>@param string $str</li>
<li>@return string
*/
function base64Encode($str) {
return base64_encode($str);
}</li>
</ul>
<p>/**</p>
<ul>
<li>Base64解码</li>
<li>@param string $str</li>
<li>@return string
*/
function base64Decode($str) {
return base64_decode($str);
}</li>
</ul>
<p>/**</p>
<ul>
<li>生成签名</li>
<li>@param string $appKey</li>
<li>@param array $params</li>
<li>@return string</li>
<li>
<p>@throws Exception
*/
function generateSignature($appKey, $params) {
// 构建待签名字符串
ksort($params);
$params['appKey'] = $appKey;</p>
<p>$unsignedString = '';
foreach ($params as $key => $value) {
$unsignedString .= $key . '=' . urlencode($value) . '&';
}
// 去除最后一个'&'字符
$unsignedString = rtrim($unsignedString, '&');</p>
<p>// 使用SHA-256算法生成签名
$hashBytes = hash('sha256', $unsignedString, true);
// 将字节数组转换为十六进制字符串
$hashString = '';
foreach ($hashBytes as $b) {
$hashString .= sprintf('%02x', $b);
}
return $hashString;
}</p>
</li>
</ul>
<p>/**</p>
<ul>
<li>请求手续费余额示例</li>
<li>
<p>@throws Exception
*/
function t1() {
// 示例参数
$params = [];
$params['appId'] = '202412061144571005'; // appId
$params['clientTransId'] = '12313131'; // 外部请求号
$timestamp = time(); // 获取当前时间戳(秒级)
$params['timestamp'] = $timestamp; // 时间戳误差不能在三分钟之外(这里用的是秒级时间戳,根据需求可能需要转换为毫秒级)</p>
<p>// 业务参数
$params1 = ['clientTransId' => '12313131'];
$params['data'] = base64Encode(json_encode($params1));</p>
<p>// 生成签名(生成签名需要加appKey,外部不用传此参数)
$signature = generateSignature('2a920199b90f4cecb71d4ef6c7179b57', $params);
$params['sign'] = $signature;</p>
<p>// 将参数转换为JSON字符串(注意:这里是为了演示,实际发送HTTP请求时可能需要以其他方式格式化参数)
$entries = json_encode($params);
echo "Params: \n" . $entries . "\n";</p>
<p>// 发送请求(这里使用cURL作为示例)
$url = '<a href="http://127.0.0.1:8081/zfb-apiV2/commission'">http://127.0.0.1:8081/zfb-apiV2/commission'</a>;;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $entries);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);</p>
<p>echo "Response: \n" . $response . "\n";</p>
<p>// 解析响应中的data字段(假设它是Base64编码的)
$jsonObject = json_decode($response, true);
if (isset($jsonObject['data'])) {
$decodedData = base64Decode($jsonObject['data']);
echo "Decoded Data: \n" . $decodedData . "\n";
}</p>
<p>// 输出签名
echo "Generated Signature: " . $signature . "\n";
}</p>
</li>
</ul>
<p>// 执行示例函数
t1();</p>
<p>?></p>
<pre><code>
### 公共参数说明
:::highlight orange 💡
appId 系统分配的appId &lt;br&gt;
clientTransId 外部请求号 &lt;br&gt;
timestamp 当前时间戳 误差不能超过3分钟 &lt;br&gt;
sign 签名 将所有签名参数按照一定规则(如字典序)进行排序。将排序后的参数按照“key=value”的格式拼接成一个字符串,参数之间用“&amp;”符号连接。使用哈希算法(如SHA-256对待签名字符串进行加密处理。
:::
### data参数说明
:::highlight green 💡
所有的业务参数和clientTransId 先使用json格式包装然后在加密成base64 具体业务参数看接口文档。
:::
### 公共返回参数
</code></pre>
<p>{"msg":"操作成功","code":200,"data":"eyJiYWxhbmNlIjo5OS4yNCwiY2xpZW50VHJhbnNJZCI6IjEyMzEzMTMxIiwidGltZXN0YW1wIjoiMTczMzkxNjAzMzc0OCJ9"}
code=200代表成功 使用base64 解密data数据获得具体返回信息 </p>
<pre><code></code></pre>