0

過去にいくつかの支払い処理業者とショッピング カートを統合しましたが、この Google Checkout API の統合はうまくいきません。診断リンクを使用しても、Google から 400 応答が返されます。URL に何か問題があることは確かですが、何が原因なのかわかりません。サンドボックスのマーチャント ID とキーを使用しています。

この 400 応答を得るために私が何をしているのか、誰か助けてもらえますか?

私はJavaを使用しており、サーバーから投稿しているため、サーバーからサーバーへのAPIリンクを呼び出しています:

https://sandbox.google.com/checkout/api/checkout/v2/merchantCheckout/Merchant/%SANDBOXID%

<?xml version="1.0" encoding="UTF-8"?>
<checkout-shopping-cart xmlns="http://checkout.google.com/schema/2">
    <shopping-cart>
        <merchant-private-data>
            <merchant-note>8Ra8fw4tBaOdP4v3lseykKO6crR0dFqhzWV0EmqKuVuQaN1w0mcScAAR71pbexXlVnrwpP8wNzehuc7wz3KO9JM6xfedW8106olarCZcZBs=</merchant-note>
        </merchant-private-data>
        <items>
            <item-name>MyName : MySubname</item-name>
            <item-description>Weigh in on this year's...</item-description>
            <unit-price currency="USD">100</unit-price>
            <quantity>1</quantity>
         </items>
     </shopping-cart>
</checkout-shopping-cart>

このデータを投稿するために Java を使用しています。以下のコードでは、上記の URL はコード内の sandboxLink であり、checkReq は XML 投稿です...

    public static String postCheckoutReqData(String userID, String gameName, boolean test) {

    String checkRequest = GoogleCheckoutXML.getCheckoutRequestXML(userID, gameName);

    if(checkRequest.indexOf("error,") != -1) return checkRequest;

    URL url = null;
    try {           
        String baseCodeString;          
        if(test) {
            url = new URL(GoogleCheckoutXML.sandboxLink + GoogleCheckoutXML.sandboxMerchID);
            baseCodeString = GoogleCheckoutXML.sandboxMerchID + ":" + GoogleCheckoutXML.sandboxMerchKey;
        }
        else {
            url = new URL(GoogleCheckoutXML.productionLink + GoogleCheckoutXML.merchantID);
            baseCodeString = GoogleCheckoutXML.merchantID + ":" + GoogleCheckoutXML.merchantKey;
        }
        //url = new URL(GoogleCheckoutXML.diagnose);
        byte[] bytes = (baseCodeString.getBytes());
        baseCodeString = new Base64().encodeAsString(bytes);
        URLConnection conn = url.openConnection();          
        conn.setDoOutput(true);
        conn.setRequestProperty("Authorization", "Basic " + baseCodeString);
        conn.setRequestProperty("Content-Type", "application/xml; charset=UTF-8");
        conn.setRequestProperty("Accept", "application/xml; charset=UTF-8");

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(checkRequest);
        wr.flush();

        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            line = line + rd.readLine();
        }

        wr.close();
        rd.close();
        return line;
    } 
    catch (Exception e) {   
        e.printStackTrace();
        return "error,Purchase Error posting communcation failed";
    }

Tomcat の実際のスタック トレースは次のとおりです。

java.io.IOException: Server returned HTTP response code: 400 for URL: https://sandbox.google.com/checkout/api/checkout/v2/merchantCheckout/Merchant/[withheld]
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1612)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at com.[withheld]..GoogleCheckoutXML.postCheckoutReqData(GoogleCheckoutXML.java:194)
at com.[withheld]...l.getCheckoutLink(DubQueryImpl.java:270)
at com.[withheld]....GenerateCheckoutLinkServlet.doGet(GenerateCheckoutLinkServlet.java:56)
at com.[withheld]...doPost(GenerateCheckoutLinkServlet.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
4

1 に答える 1

0

同様の問題を解決したと思います-それはあなたのものかもしれませんし、そうでないかもしれません...

  1. 戻りコードを確認します。

    int コード = conn.getResponseCode(); // 整数 (上記の場合は 400 になります) \String msg = conn.getResponseMessage(); // 文字列 (上記の場合は「Bad Request」になります)

  2. 詳細を確認する

    InputStream in = new BufferedInputStream(conn.getErrorStream());

    さらに詳しい情報が提供されていることを確認するために読んでください - 私はそれが非常に役立つことがわかりました!

  3. 私の場合、慎重に準備された xml は途中で引用符を失い、<xml version="1.0" ... >最初に右を破棄し、それ以降大混乱を引き起こしました...

于 2012-11-29T19:54:28.947 に答える