Appearance
通用接口说明
通用请求是商户侧调用平台各业务接口都需要的参数,当前版本采用HTTPS请求头部信息的方式。
回调IP地址
- 108.137.64.70
金额单位
Rupiah(元)
请求正式域名
| 参数 | 是否必须 | 内容 |
|---|---|---|
| API endpoint | 是 | https://api-gateway.gsxpay.com/api |
请求头信息
| 参数 | 是否必须 | 类型 | 说明 | 示例 |
|---|---|---|---|---|
| Authorization | 是 | String | 调用生成公共访问 令牌接口,获取 token,拼接成 Bearer {token} | Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz I1NiJ9.eyJtZXJjaGFudE5hbWUiOi J0ZXN0IiwiZXhwIjoxNzE2ODg4M TMxfQ.ec7kJArUSySYeB982LQU W3m90rIcyYvA9UnoWyRL2k8 |
API信息说明
| 参数 | 说明 |
|---|---|
| ApiKey | 生成token必须的参数 |
| ApiSecret | 生成token必须的参数 |
| MerchantKey | 用于验证我方回调数据签名 |
生成公共访问令牌(JWT TOKEN) ✅
INFO
用途:身份验证
请求URL:/auth/token
请求方式:POST
请求参数
| 参数 | 必选 | 类型 | 说明 | 示例 |
|---|---|---|---|---|
| clientId | 是 | String | 用于授权生成公共令牌的key,取值同'API信息说明'中的ApiKey | 123456789 |
| clientSecret | 是 | String | 授权生成公共令牌的密码,取值同'API信息说明'中的ApiSecret | abcdefgh123 |
请求示例
json
{
"clientId": "123456789",
"clientSecret": "abcdefgh123"
}响应参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| token | String | 客户端唯一令牌,将此 令牌用于其他 API | eyJ0eXAiOiJKV1QiLCJhbGci OiJIUzI1NiJ9.eyJtZXJjaGFud E5hb923KSJI30IiwiZXhwIjox NzE2NjI2NTQ3fQ.6Katm1V YrnzMFrb0g7ZsjF3FeUW8X eEgK4_nX0oW23 |
| expiredAt | String | 令牌有效期 | 2024-10-01 15:19:40 |
响应信息
json
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtZXJjaGFudE5hb923KSJI30IiwiZXhwIjoxNzE2NjI 2NTQ3fQ.6Katm1VYrnzMFrb0g7ZsjF3FeUW8XeEgK4_nX0oW23",
"expiredAt": "2024-10-01 15:19:40"
}回调签名方法
INFO
用途:回调验签
签名规则:
将待签名字符串转换为TreeMap,按 key=value 形式拼接,并按ASCII升序排序,最后再加上 merchantKey ,进行MD5加密。将得到的签名与回调数据中的sign进行比对,一致则可以通过
注意: 待签名字符串不包括sign, 空字符串参与签名, 参数之间无任何符号拼接
仅最后的merchantKey字段前需要拼接&
示例:amount=10000.00clientId=xxxorderId=xxxpaidAmount=10000.00payMethod=203001serviceFee=5050.00status=SUCCESStransactionId=CI12345678999999&merchantKey=123456
签名方法
java
import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import java.util.TreeMap;
public class SignUtil {
private static String getMerchantKey() {
return "123456";
}
public static boolean verifySign(Object object, String sign) {
String encode = encode(object, getMerchantKey());
return encode.equalsIgnoreCase(sign);
}
public static String encode(Object o, String merchantKey) {
TreeMap<String, String> map = JSON.parseObject(JSON.toJSONString(o), new TypeReference<TreeMap<String, String>>() {
});
map.remove("sign");
StringBuilder sb = new StringBuilder();
map.forEach((k, v) -> sb.append(k).append("=").append(v));
sb.append("&merchantKey=").append(merchantKey);
String encode = sb.toString();
return DigestUtil.md5Hex(encode);
}
public static void main(String[] args) {
String body = "{\"amount\":10000.00,\"clientId\":\"xxx\",\"orderId\":\"xxx\",\"paidAmount\":10000.00,\"payMethod\":\"203001\",\"serviceFee\":5050.00,\"sign\":\"aa7ae61151de42d239386ea9892aee7e\",\"status\":\"SUCCESS\",\"transactionId\":\"CI12345678999999\"}\n";
JSONObject object = JSON.parseObject(body);
String sign = object.getString("sign");
System.out.println(verifySign(object, sign));
}
}通用返回
当接口请求处理被支付平台接收后,HTTPS状态码为200表示请求成功;非200表示请求失败。
通用错误码表
具体错误原因,请查看message返回的信息
响应参数 - errorType
| 错误编码 | 可能的情况 |
|---|---|
| AUTH | 必填参数未传,参数错误或不合法 |
| PARAM_ERROR | 支付方式错误, 金额/限额错误 |
| ORDER | 订单错误 |
| BALANCE | 余额不足 |
| RISK | 风控错误 |
| MERCHANT | 商户错误 |
| CLIENT_ID_EXIST | 商户订单号存在 |
| RATE_LIMIT_EXCEEDED | 请求过于频繁 |
| CHANNEL_NOT_AVAILABLE | 通道不可用 |
响应示例
json
{
"errorType": "AUTH",
"message": "ClientId: 2025103651364100 not found"
}