Appearance
开始
UCC-PAY是领先的支付解决方案,提供支付、查询等功能。
HONGKONG支付API地址
API接口请求
必须采用application/json格式进行请求,统一采用POST,接口需要拼接验签GET参数
API返回格式
code=200表示请求成功,其它状态码均表示失败,如有返回的数据均在data参数中
{"code":200,"message":"返回的信息","data":{}}公共验签GET参数
| 参数 | 说明 |
|---|---|
| key | APIKEY |
| time | 接口调用时间戳(UTC+8),如果时间戳偏差超过60秒,则无法访问 |
| nonceStr | 随机数,至少8位 |
| sign | 签名 |
接口验签
签名方式,所有GET参数包含time、nonceStr、key进行ksort排列,排序好的参数加上secret,如nonceStr=2&time=3&key=4secret,然后进行32位MD5加密,最后get参数为:nonceStr=2&time=3&key=4&sign=xxxx
PHP DEMO
/**
* 生成认证链接
* @param string $secret secret
* @param array $data 需要提交的数据,包含接口提供的key
* @param string $signName 接口需要认证加密的参数值,默认为sign
* @return mixed
*/
protected function encodeUrlParam(string $secret, array $data = [], string $signName = 'sign'): mixed
{
if (isset($data[$signName])) {
unset($data[$signName]);
}
$data['time'] = time();
$data['nonceStr'] = $this->random(16);
$params = $this->sortParams($data);
$params .= $secret;
$data[$signName] = strtolower(md5($params));
return $data;
}
/**
* 参数排序
* @param array $params
* @return string
*/
protected function sortParams(array $params): string
{
ksort($params);
$buff = "";
foreach ($params as $k => $v) {
if ($v != "" && !is_array($v)) {
$buff .= $k . "=" . urlencode($v) . "&";
}
}
return trim($buff, "&");
}
/**
* 生成随机值
* @param int $length
* @param bool $numeric
* @return string
*/
protected function random(int $length, bool $numeric = false): string
{
$seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
$seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
$hash = '';
if (!$numeric) {
$hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
$length--;
}
$max = strlen($seed) - 1;
$seed = str_split($seed);
for ($i = 0; $i < $length; $i++) {
$hash .= $seed[mt_rand(0, $max)];
}
return $hash;
}
//以获取接口主体信息为例,生成接口访问URL
$api = 'https://www.morebestshop.com/externalApi/v1/company/get-info';
$key = 'aaaaaa';
$secret = 'bbbbbb';
$data = [];
$data['key'] = $key;
$apiUrl = $api .'?'. http_build_query($this->encodeUrlParam($secret,$data));
//生成完接口访问URL后,使用POST向该URL提交参数JAVA DEMO
import java.util.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.stream.Collectors;
public class UrlParamEncoder {
// 生成认证链接
public Map<String, String> encodeUrlParam(String secret, Map<String, String> data, String signName) {
if (data.containsKey(signName)) {
data.remove(signName);
}
// 添加时间戳和随机数
data.put("time", String.valueOf(System.currentTimeMillis() / 1000)); // 时间戳
data.put("nonceStr", random(16)); // 随机字符串
// 排序并生成签名
String params = sortParams(data) + secret;
data.put(signName, md5(params).toLowerCase());
return data;
}
// 参数排序
public String sortParams(Map<String, String> params) {
return params.entrySet().stream()
.filter(entry -> !entry.getValue().isEmpty() && !(entry.getValue() instanceof String && entry.getValue().equals("")))
.sorted(Map.Entry.comparingByKey())
.map(entry -> entry.getKey() + "=" + encode(entry.getValue()))
.collect(Collectors.joining("&"));
}
// MD5 加密
public String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
// URL 编码
public String encode(String value) {
try {
return java.net.URLEncoder.encode(value, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 生成随机字符串
public String random(int length) {
return random(length, false);
}
public String random(int length, boolean numeric) {
String seed = numeric ? "0123456789" : "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder hash = new StringBuilder();
for (int i = 0; i < length; i++) {
int index = (int) (Math.random() * seed.length());
hash.append(seed.charAt(index));
}
return hash.toString();
}
// 示例:生成接口访问URL
public String generateApiUrl(String api, String key, String secret) {
Map<String, String> data = new HashMap<>();
data.put("key", key);
// 编码参数并生成URL
Map<String, String> encodedParams = encodeUrlParam(secret, data, "sign");
String queryString = encodedParams.entrySet().stream()
.map(entry -> entry.getKey() + "=" + encode(entry.getValue()))
.collect(Collectors.joining("&"));
return api + "?" + queryString;
}
public static void main(String[] args) {
UrlParamEncoder encoder = new UrlParamEncoder();
String api = "https://www.morebestshop.com/externalApi/v1/company/get-info";
String key = "aaaaaa";
String secret = "bbbbbb";
String apiUrl = encoder.generateApiUrl(api, key, secret);
System.out.println("Generated API URL: " + apiUrl);
}
}