다음 메서드를 사용하여 구매자 계정 및 클라이언트의 제안서를 수락하거나 취소할 수 있습니다.
제안서 수락
buyers.proposals.accept
를 사용하여 지정된
proposalRevision에서 지정된 제안서와 연결된 거래를 승인할 수 있습니다.
구매자는 게시자가 제안서를 수락한 후에만 제안서를 수락할 수 있습니다. 게시자보다 먼저 제안서를 수락하면
buyers.proposals.accept
에서 오류가 반환됩니다.
양 당사자가 제안서를 수락하면 제안서의 state가 FINALIZED로 설정되고 제안서의 거래가 구성에 따라 게재를 시작할 수 있게 됩니다.
다음 샘플은 accept 메서드를 사용하여 제안서를 수락하는 방법을 보여줍니다.
REST
요청
POST https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/proposals/MP48576074:accept?alt=json
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"proposalRevision": "4"
}응답
{
"name": "buyers/12345678/proposals/MP49876074",
"updateTime": "2022-03-26T04:03:19.282Z",
"proposalRevision": "5",
"dealType": "PROGRAMMATIC_GUARANTEED",
"displayName": "Test PG Proposal #0ce643e9-5518-4e8e-b352-0cb45cc2eeb2",
"state": "FINALIZED",
"originatorRole": "BUYER",
"publisherProfile": "buyers/12345678/publisherProfiles/PP111111",
"buyer": "buyers/12345678",
"buyerPrivateData": {
"referenceId": "2f5e9550-8d22-495e-ba38-9b9496347a3b"
},
"billedBuyer": "buyers/12345678",
"sellerContacts": [
{
"email": "jeff@hypersonicmedia.com"
},
{
"email": "alex@hypersonicmedia.com"
},
],
"buyerContacts": [
{
"email": "testemail89319783@test.com",
"displayName": "Joe"
}
],
"lastUpdaterOrCommentorRole": "BUYER",
"pausingConsented": true,
"notes": [
{
"createTime": "2022-03-26T04:03:19.548Z",
"creatorRole": "BUYER",
"note": "Test programmatic guaranteed deal proposal."
},
{
"createTime": "2022-03-26T05:36:23.406Z",
"creatorRole": "BUYER",
"note": "Test note."
}
]
}자바
/* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.proposals; import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace; import com.google.api.services.authorizedbuyersmarketplace.v1.model.AcceptProposalRequest; import com.google.api.services.authorizedbuyersmarketplace.v1.model.Proposal; import com.google.api.services.samples.authorizedbuyers.marketplace.v1.Utils; import java.io.IOException; import java.security.GeneralSecurityException; import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.inf.ArgumentParser; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; /** * Accepts a proposal for the given account and proposal IDs. * * <p>Note that a proposal can only be accepted if it is in the BUYER_ACCEPTANCE_REQUESTED state. * Once both a buyer and seller have accepted a proposal, its state will change to FINALIZED. */ public class AcceptProposals { public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) { Long accountId = parsedArgs.getLong("account_id"); String proposalId = parsedArgs.getString("proposal_id"); String name = String.format("buyers/%d/proposals/%s", accountId, proposalId); AcceptProposalRequest acceptProposalRequest = new AcceptProposalRequest(); acceptProposalRequest.setProposalRevision(parsedArgs.getLong("proposal_revision")); Proposal proposal = null; try { proposal = marketplaceClient.buyers().proposals().accept(name, acceptProposalRequest).execute(); } catch (IOException ex) { System.out.printf("Marketplace API returned error response:%n%s", ex); System.exit(1); } System.out.printf("Accepting proposal with name \"%s\":%n", name); Utils.printProposal(proposal); } public static void main(String[] args) { ArgumentParser parser = ArgumentParsers.newFor("AcceptProposals") .build() .defaultHelp(true) .description(("Accepts a proposal for the given account and proposal IDs.")); parser .addArgument("-a", "--account_id") .help( "The resource ID of the buyers resource under which the proposal exists. This will " + "be used to construct the name used as a path parameter for the proposals.accept " + "request.") .required(true) .type(Long.class); parser .addArgument("-p", "--proposal_id") .help( "The resource ID of the buyers.proposals resource that is being accepted. This " + "will be used to construct the name used as a path parameter for the " + "proposals.accept request.") .required(true); parser .addArgument("-r", "--proposal_revision") .help( "The last known revision number of the proposal. If this is less than the " + "revision number stored server-side, it means that the proposal revision being " + "worked upon is obsolete, and an error message will be returned.") .required(true) .type(Long.class); Namespace parsedArgs = null; try { parsedArgs = parser.parseArgs(args); } catch (ArgumentParserException ex) { parser.handleError(ex); System.exit(1); } AuthorizedBuyersMarketplace client = null; try { client = Utils.getMarketplaceClient(); } catch (IOException ex) { System.out.printf("Unable to create Marketplace API service:%n%s", ex); System.out.println("Did you specify a valid path to a service account key file?"); System.exit(1); } catch (GeneralSecurityException ex) { System.out.printf("Unable to establish secure HttpTransport:%n%s", ex); System.exit(1); } execute(client, parsedArgs); } }
협상 취소
buyers.proposals.cancelNegotiation
메서드를 사용하여 지정된 제안서의 협상을 취소할 수 있습니다.
완료된 적이 없는 제안서를 취소하면 state가 TERMINATED로 설정되고 게시자와의 협상이 종료됩니다. 이전에 완료된 proposalRevision이 있는 제안서를 취소하면 제안서가 종료되는 대신 마지막으로 완료된 proposalRevision으로 되돌아갑니다.
Marketplace API를 사용하여 비공개 입찰 거래를 취소할 수는 없습니다. Authorized Buyers Marketplace UI에서 비공개 입찰 거래를 보관처리할 수 있습니다.
다음 샘플은 cancelNegotiation 메서드를 사용하여 제안서의 협상을 취소하는 방법을 보여줍니다.
REST
요청
POST https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/proposals/MP14138120:cancelNegotiation?alt=json Authorization: Bearer ACCESS_TOKEN Content-Type: application/json
응답
{
"name": "buyers/12345678/proposals/MP14138120",
"updateTime": "2022-03-20T03:08:36.424Z",
"proposalRevision": "2",
"dealType": "PROGRAMMATIC_GUARANTEED",
"displayName": "Test PG Proposal 3",
"state": "TERMINATED",
"originatorRole": "BUYER",
"publisherProfile": "buyers/12345678/publisherProfiles/PP892146",
"buyer": "buyers/12345678",
"billedBuyer": "buyers/12345678",
"sellerContacts": [
{
"email": "cindy@garb.com"
}
],
"buyerContacts": [
{
"email": "testemail2022@gmail.com"
}
],
"lastUpdaterOrCommentorRole": "BUYER",
"notes": [
{
"createTime": "2022-03-20T03:08:36.424Z",
"creatorRole": "BUYER",
"note": "Verified that ad sizes are supported."
}
]
} 자바
/* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.proposals; import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace; import com.google.api.services.authorizedbuyersmarketplace.v1.model.CancelNegotiationRequest; import com.google.api.services.authorizedbuyersmarketplace.v1.model.Proposal; import com.google.api.services.samples.authorizedbuyers.marketplace.v1.Utils; import java.io.IOException; import java.security.GeneralSecurityException; import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.inf.ArgumentParser; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; /** * Cancels the ongoing negotiation for the specified proposal. * * <p>This method is not supported for proposals including private auction deals because negotiation * for that deal type can not be canceled. On successful cancelation, the proposal's state will be * set to TERMINATED. * * <p>This does not cancel or end serving for deals that have already been finalized. For finalized * deals that are under renegotiation, calling this method will instead reset the proposal's state * to FINALIZED. */ public class CancelNegotiationForProposals { public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) { Long accountId = parsedArgs.getLong("account_id"); String proposalId = parsedArgs.getString("proposal_id"); String name = String.format("buyers/%d/proposals/%s", accountId, proposalId); CancelNegotiationRequest cancelNegotiationRequest = new CancelNegotiationRequest(); Proposal proposal = null; try { proposal = marketplaceClient .buyers() .proposals() .cancelNegotiation(name, cancelNegotiationRequest) .execute(); } catch (IOException ex) { System.out.printf("Marketplace API returned error response:%n%s", ex); System.exit(1); } System.out.printf("Canceling negotiation for a proposal with name \"%s\":%n", name); Utils.printProposal(proposal); } public static void main(String[] args) { ArgumentParser parser = ArgumentParsers.newFor("CancelNegotiationForProposals") .build() .defaultHelp(true) .description( ("Cancels negotiation for a proposal with the given account and proposal " + "IDs.")); parser .addArgument("-a", "--account_id") .help( "The resource ID of the buyers resource under which the proposal exists. This will " + "be used to construct the name used as a path parameter for the " + "proposals.cancelNegotiaton request.") .required(true) .type(Long.class); parser .addArgument("-p", "--proposal_id") .help( "The resource ID of the buyers.proposals resource that is being canceled. This " + "will be used to construct the name used as a path parameter for the " + "proposals.cancelNegotiation request.") .required(true); Namespace parsedArgs = null; try { parsedArgs = parser.parseArgs(args); } catch (ArgumentParserException ex) { parser.handleError(ex); System.exit(1); } AuthorizedBuyersMarketplace client = null; try { client = Utils.getMarketplaceClient(); } catch (IOException ex) { System.out.printf("Unable to create Marketplace API service:%n%s", ex); System.out.println("Did you specify a valid path to a service account key file?"); System.exit(1); } catch (GeneralSecurityException ex) { System.out.printf("Unable to establish secure HttpTransport:%n%s", ex); System.exit(1); } execute(client, parsedArgs); } }