访问令牌
为了系统安全的目的,在发送交易请求之前,您需要完成两个步骤。
步骤 1. 获取随机代码
在请求流程的开始,您应该从我们的服务中获取一个随机代码。
请求
API URL: /merchant/random_code
Note
✅ 必填 ⭕ 可選 ❌ 不適用
标头 | 内容 |
---|---|
Content-Type | application/json |
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
user_id | 字符串 | ✅ | 商户识别码 |
请求示例
- PHP
- Java
- Python
function get_random_code()
{
global $user_id, $base_url;
$url = "{$base_url}/merchant/random_code";
$params = json_encode(['user_id' => $user_id]);
$header = ['Content-Type: application/json'];
$response = send_curl_request($url, $params, $header);
$response = json_decode($response, true);
return $response['data']['code'];
}
function send_curl_request($url, $body, $header): string
{
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => 'utf-8',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => $header,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
]);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
public static String getRandomCode() throws UnirestException {
Map<String, String> params = new HashMap<>();
params.put("user_id", userId);
JSONObject jsonObject = new JSONObject();
SortedSet<String> parameter = new TreeSet<>(params.keySet());
for (String key : parameter) {
jsonObject.put(key, params.get(key));
}
Unirest.setTimeouts(0, 0);
HttpResponse<JsonNode> jsonResponse = Unirest.post(requestUrl + "/merchant/random_code")
.header("Content-Type", "application/json")
.body(jsonObject.toString())
.asJson();
System.out.println("getRandomCode response:: " + jsonResponse.getBody());
return jsonResponse.getBody().getObject().getJSONObject("data").getString("code");
}
def get_random_code():
response = requests.post(url=(url + '/merchant/random_code'), json={'user_id': user_id})
print(response.text)
if response.status_code == 200:
dict_obj = json.loads(response.text)
return dict_obj.get('data')['code']
else:
return None
响应
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
code | 字符串 | ✅ | 用于获取访问令牌的随机代码。请注意,它仅在 5分钟 内有效。 |
expires_in | 整数 | ✅ | 随机代码的过期时间(以秒为单位) |
expires_at | 整数 | ✅ | 随机代码的过期时间(时间戳)) |
响应示例
{
"code": "1000",
"message": "Accepted",
"data": {
"code": "VL4hrMLmM3THd2iQDNOoa45cGZhx2zH7", // here is the random code
"expires_in": 300,
"expires_at": 1704699776
}
}
步骤 2. 获取访问令牌
获取随机代码后,您需要发送第二个请求来获取访问令牌,然后将其放入您发送给 PTS 的每个交易请求中。访问令牌将一直有效,直到响应中提供的到期时间到达。这意味着您应该在您的服务中缓存访问令牌,并在访问令牌到期时再次执行这两个步骤的请求。
注意
您应该实现某种机制来保存访问令牌并在发送交易请求之前检测其是否已过期。
请求
API URL: /merchant/token
标头 | 内容 |
---|---|
Content-Type | application/json |
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
user_id | 字符串 | ✅ | 商户识别码 |
hash | 字符串 | ✅ | 请按照下面的提示生成 |
提示
请按照给定的顺序,不使用任何分隔符或空格,将 random_code
+ user_id
+ safecode
连接在一起。然后将连接的字符串放入 SHA256
哈希函数中以获取哈希代码。
请求示例
- PHP
- Java
- Python
function get_token(): string
{
global $user_id, $safecode, $base_url;
$url = "{$base_url}/merchant/token";
$params = json_encode([
'user_id' => $user_id,
'hash' => hash('SHA256', get_random_code().$user_id.$safecode)
]);
$header = ['Content-Type: application/json'];
$response = send_curl_request($url, $params, $header);
$response = json_decode($response, true);
$data = $response['data'];
return $data['token_type'].' '.$data['access_token'];
}
function send_curl_request($url, $body, $header): string
{
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => 'utf-8',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => $header,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
]);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
public static String getToken() {
try {
String randomCode = getRandomCode();
String originalString = randomCode + userId + safecode;
System.out.println("getToken originalString::" + originalString);
String sha256hex = DigestUtils.sha256Hex(originalString);
Map<String, String> params = new HashMap<>();
params.put("user_id", userId);
params.put("hash", sha256hex);
JSONObject jsonObject = new JSONObject();
SortedSet<String> parameter = new TreeSet<>(params.keySet());
for (String key : parameter) {
jsonObject.put(key, params.get(key));
}
Unirest.setTimeouts(0, 0);
HttpResponse<JsonNode> jsonResponse = Unirest.post(requestUrl + "/merchant/token")
.header("Content-Type", "application/json")
.body(jsonObject.toString())
.asJson();
System.out.println("getToken response:: " + jsonResponse.getBody());
String tokenType = jsonResponse.getBody().getObject().getJSONObject("data").getString("token_type");
String accessToken = jsonResponse.getBody().getObject().getJSONObject("data").getString("access_token");
return tokenType + " " + accessToken;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
def get_token():
random_code = get_random_code()
s = hashlib.sha256()
before_hash_string = (random_code + user_id + safecode).encode('utf-8')
s.update(before_hash_string)
hash_value = s.hexdigest()
response = requests.post(url=(url + '/merchant/token'), json={'user_id': user_id, 'hash': hash_value})
print(response.text)
if response.status_code == 200:
dict_obj = json.loads(response.text)
return dict_obj.get('data')['token_type'] + ' ' + dict_obj.get('data')['access_token']
else:
return None
响应
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
access_token | 字符串 | ✅ | 要放入您的请求头中的令牌。请注意,它仅在 60分钟 内有效。 |
token_type | 字符串 | ✅ | 令牌的类型 |
expires_in | 整数 | ✅ | 令牌的过期时间(以秒为单位) |
expires_at | 整数 | ✅ | 令牌的过期时间(时间戳) |
响应示例
{
"code": "1000",
"message": "Accepted",
"data": {
"access_token": "cyJacasxzxc...",
"token_type": "bearer",
"expires_in": 300,
"expires_at": 1704699776
}
}