sayren Docs
상점 설정

포트원 연결·수정

포트원(V2) Store ID·채널·API Secret을 저장한다. 채널은 결제수단별로 여러 개 등록할 수 있고, 결제수단마다 그 결제수단을 받는 첫 채널이 쓰인다. 결제 요청의 결제수단을 받는 채널이 없으면 그 결제에서 포트원은 준비 장애로 처리된다. PG마다 `TEST`(샌드박스)·`LIVE`(실결제) 자격 증명 세트를 따로 저장한다. 요청의 `environment`는 **저장할 세트**이고, 어느 세트로 결제할지는 샌드박스 스위치(`PATCH …/{provider}`의 `sandboxMode`)가 정한다. 같은 가맹점(토스 클라이언트 키·포트원 Store ID)이면 그 세트를 갱신하고, 가맹점이 바뀌면 이전 세트를 **보관**한 뒤 새 세트를 만든다 (예전에 보관한 같은 가맹점 세트가 있으면 새로 만들지 않고 그 세트를 다시 쓴다). 보관된 세트는 새 결제에 쓰이지 않지만, 그 가맹점으로 이미 받은 결제의 취소·환불과 결제 확인에는 계속 쓰인다. 실결제 중(샌드박스 꺼짐)인 PG의 LIVE 세트를 저장하면 가맹점이 같아도 저장 전에 연결 테스트를 한다. 처음 연결하면 사용 중지·샌드박스 켜짐 상태로 만들어진다. 수정 시 `apiSecret`·`webhookSecret`을 생략하면 저장된 값을 유지한다. 상점 플랫폼에 로그인한 **OWNER 전용**이다. ADMIN·STAFF, API 토큰(PAT), M2M 클라이언트, 3rd-party 앱이 위임받은 토큰은 스코프가 있어도 `403 INSUFFICIENT_ROLE`이다.

PUT
/v1/store/payment-providers/portone

포트원(V2) Store ID·채널·API Secret을 저장한다. 채널은 결제수단별로 여러 개 등록할 수 있고, 결제수단마다 그 결제수단을 받는 첫 채널이 쓰인다. 결제 요청의 결제수단을 받는 채널이 없으면 그 결제에서 포트원은 준비 장애로 처리된다. PG마다 TEST(샌드박스)·LIVE(실결제) 자격 증명 세트를 따로 저장한다. 요청의 environment는 저장할 세트이고, 어느 세트로 결제할지는 샌드박스 스위치(PATCH …/{provider}의 sandboxMode)가 정한다. 같은 가맹점(토스 클라이언트 키·포트원 Store ID)이면 그 세트를 갱신하고, 가맹점이 바뀌면 이전 세트를 보관한 뒤 새 세트를 만든다 (예전에 보관한 같은 가맹점 세트가 있으면 새로 만들지 않고 그 세트를 다시 쓴다). 보관된 세트는 새 결제에 쓰이지 않지만, 그 가맹점으로 이미 받은 결제의 취소·환불과 결제 확인에는 계속 쓰인다. 실결제 중(샌드박스 꺼짐)인 PG의 LIVE 세트를 저장하면 가맹점이 같아도 저장 전에 연결 테스트를 한다. 처음 연결하면 사용 중지·샌드박스 켜짐 상태로 만들어진다. 수정 시 apiSecret·webhookSecret을 생략하면 저장된 값을 유지한다. 상점 플랫폼에 로그인한 OWNER 전용이다. ADMIN·STAFF, API 토큰(PAT), M2M 클라이언트, 3rd-party 앱이 위임받은 토큰은 스코프가 있어도 403 INSUFFICIENT_ROLE이다.

Authorization

accessToken
headerAuthorizationBearer <token>

Sayren 계정 토큰(로그인 토큰 또는 개인 액세스 토큰, RFC 9068 JWT)

Header Parameters

X-Store-Id*string

대상 상점 id. 토큰의 상점 범위 밖이면 403 STORE_NOT_GRANTED, 없으면 400 STORE_ID_REQUIRED다

Request Body

application/json
  1. body
environment*string

저장할 자격 증명 세트. PG마다 TEST(샌드박스)·LIVE(실결제) 세트를 따로 둔다. 어느 세트로 결제할지는 이 값이 아니라 샌드박스 스위치(sandboxMode)가 정한다

Value in"TEST""LIVE"
credentials*

Response Body

성공

application/json
  1. response
meta*
data*
error*|null
curl -X PUT 'https://api.sayren.io/v1/store/payment-providers/portone' \  -H 'X-Store-Id: string' \  -H 'Content-Type: application/json' \  -d '{  "environment": "TEST",  "credentials": {    "storeId": "stringst",    "channels": [      {        "channelKey": "stringst",        "payMethods": [          "CARD"        ]      }    ]  }}'
{  "meta": {    "status": 200,    "code": "OK",    "message": "OK",    "isSuccess": true  },  "data": {    "provider": "tosspayments",    "displayName": "string",    "connected": true,    "enabled": true,    "priority": 0,    "environment": "TEST",    "publicConfig": {      "clientKey": "string"    },    "secrets": [      {        "field": "string",        "configured": true,        "masked": "string"      }    ],    "lastVerification": {      "result": "SUCCESS",      "message": "string",      "checkedAt": "string"    },    "updatedAt": "string",    "sandboxMode": true,    "credentialSets": {      "TEST": {        "environment": "TEST",        "publicConfig": {          "clientKey": "string"        },        "secrets": [          {            "field": "string",            "configured": true,            "masked": "string"          }        ],        "lastVerification": {          "result": "SUCCESS",          "message": "string",          "checkedAt": "string"        },        "updatedAt": "string"      },      "LIVE": {        "environment": "TEST",        "publicConfig": {          "clientKey": "string"        },        "secrets": [          {            "field": "string",            "configured": true,            "masked": "string"          }        ],        "lastVerification": {          "result": "SUCCESS",          "message": "string",          "checkedAt": "string"        },        "updatedAt": "string"      }    },    "liveGate": {      "status": "LOCKED",      "conditions": [        {          "code": "TEST_CONNECTION",          "met": true,          "message": "string"        }      ],      "openedAt": "string"    },    "easyPayProviders": [      "string"    ],    "retiredCredentialCount": 0,    "routingExclusion": null  },  "error": null}