4

https://www.paypal-labs.com/integrationwizard/ecpaypal/main.phpに従って、アプリケーションにペイパル サンドボックス アカウントを実装しました。私のコードは、 index.jsp -> expresscheckout.jsp -> paypalfunctions.jsp などの 3 つの jsp ページにまたがっています。

expresscheckout.jsp

<%@ include file="paypalfunctions.jsp"%>
<%
    String paymentAmount = "25";

    String currencyCodeType = "USD";
    String paymentType = "Sale";



    String returnURL = "http://2.appid.appspot.com/sucess.jsp";

    String cancelURL = "http://2.appid.appspot.com/canceled.jsp";


    HashMap nvp = CallShortcutExpressCheckout(paymentAmount,
            currencyCodeType, paymentType, returnURL, cancelURL,
            session);
    String strAck = nvp.get("ACK").toString();
    if (strAck != null && strAck.equalsIgnoreCase("Success")) {
        //' Redirect to paypal.com
        RedirectURL(nvp.get("TOKEN").toString(), response);
    } else {


        String ErrorCode = nvp.get("L_ERRORCODE0").toString();
        String ErrorShortMsg = nvp.get("L_SHORTMESSAGE0").toString();
        String ErrorLongMsg = nvp.get("L_LONGMESSAGE0").toString();
        String ErrorSeverityCode = nvp.get("L_SEVERITYCODE0")
                .toString();
    }
%>

paypalfunctions.jsp は次のとおりです。

<%

    gv_APIUserName  = "myid_78955666_biz_api1.gmail.com";
    gv_APIPassword  = "1347856389";
    gv_APISignature = "AFcWxV21C7fd0v3bYYYRCpSSRl31AuP4KrN6UABOJ1fGdNRYoIpc.qjr";

    //BN Code is only applicable for partners
    gv_BNCode       = "PP-ECWizard"; 

    boolean bSandbox = true;



    if (bSandbox == true)
    {
        gv_APIEndpoint = "https://api-3t.sandbox.paypal.com/nvp";
        PAYPAL_URL = "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=";
    }
    else
    {
        gv_APIEndpoint = "https://api-3t.paypal.com/nvp";
        PAYPAL_URL = "https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=";
    } 

    String HTTPREQUEST_PROXYSETTING_SERVER = "";
    String HTTPREQUEST_PROXYSETTING_PORT = "";
    boolean USE_PROXY = false;

    gv_Version  = "2.3";

    //WinObjHttp Request proxy settings.
    gv_ProxyServer  = HTTPREQUEST_PROXYSETTING_SERVER;
    gv_ProxyServerPort = HTTPREQUEST_PROXYSETTING_PORT;
    gv_Proxy        = 2;    //'setting for proxy activation
    gv_UseProxy     = USE_PROXY;


%>

<%!

    String gv_APIEndpoint;
    String gv_APIUserName;
    String gv_APIPassword;
    String gv_APISignature;
    String gv_BNCode;

    String gv_Version;
    String gv_nvpHeader;
    String gv_ProxyServer;  
    String gv_ProxyServerPort; 
    int gv_Proxy;
    boolean gv_UseProxy;
    String PAYPAL_URL;

    public HashMap CallShortcutExpressCheckout( String paymentAmount, String currencyCodeType, String paymentType, 
                                                String returnURL, String cancelURL,
                                                HttpSession session)
    {

        session.setAttribute("paymentType", paymentType);
        session.setAttribute("currencyCodeType", currencyCodeType);
ored in $nvpstr
        */
        String nvpstr = "&Amt=25&PAYMENTACTION=" + paymentType + "&ReturnUrl=" + URLEncoder.encode( returnURL ) + "&CANCELURL=" + URLEncoder.encode( cancelURL ) + "&CURRENCYCODE=" + currencyCodeType;

        /* 
        Make the call to PayPal to get the Express Checkout token
        If the API call succeded, then redirect the buyer to PayPal
        to begin to authorize payment.  If an error occured, show the
        resulting errors
        */

        HashMap nvp = httpcall("SetExpressCheckout", nvpstr);
        String strAck = nvp.get("ACK").toString();
        session.setAttribute("nvpstr", nvpstr);
        session.setAttribute("strAck", strAck);
        if(strAck !=null && strAck.equalsIgnoreCase("Success"))
        {
            session.setAttribute("TOKEN", nvp.get("TOKEN").toString());
        }

        return nvp;
    }

    public HashMap CallMarkExpressCheckout( String paymentAmount, String currencyCodeType, String paymentType, String returnURL, 
                                String cancelURL, String shipToName, String shipToStreet, String shipToCity, String shipToState,
                                String shipToCountryCode, String shipToZip, String shipToStreet2, String phoneNum,
                                HttpSession session)
    {

        session.setAttribute("paymentType", paymentType);
        session.setAttribute("currencyCodeType", currencyCodeType);

        String nvpStr = "ADDROVERRIDE=1&Amt=" + paymentAmount + "&PAYMENTACTION=" + paymentType;
        nvpStr = nvpStr + "&CURRENCYCODE=" + currencyCodeType + "&ReturnUrl=" + URLEncoder.encode( returnURL ) + "&CANCELURL=" + URLEncoder.encode( cancelURL );
        nvpStr = nvpStr + "&SHIPTONAME=" + shipToName + "&SHIPTOSTREET=" + shipToStreet + "&SHIPTOSTREET2=" + shipToStreet2;
        nvpStr = nvpStr + "&SHIPTOCITY=" + shipToCity + "&SHIPTOSTATE=" + shipToState + "&SHIPTOCOUNTRYCODE=" + shipToCountryCode;
        nvpStr = nvpStr + "&SHIPTOZIP=" + shipToZip + "&PHONENUM" + phoneNum;


        HashMap nvp = httpcall("SetExpressCheckout", nvpStr);//made a change from original code
        String strAck = nvp.get("ACK").toString();
        if(strAck !=null && (strAck.equalsIgnoreCase("Success") || strAck.equalsIgnoreCase("SuccessWithWarning")))
        {
            session.setAttribute("TOKEN", nvp.get("TOKEN").toString());
        }           
        return nvp;
    }

    public HashMap GetShippingDetails( String token, HttpSession session)
    {


        String nvpstr= "&TOKEN=" + token;


        HashMap nvp = httpcall("GetExpressCheckoutDetails", nvpstr);
        String strAck = nvp.get("ACK").toString();
        if(strAck !=null && (strAck.equalsIgnoreCase("Success") || strAck.equalsIgnoreCase("SuccessWithWarning")))
        {
            session.setAttribute("PAYERID", nvp.get("PAYERID").toString());
        }           
        return nvp;
    }

    public HashMap ConfirmPayment( String finalPaymentAmount, HttpSession session, HttpServletRequest request)
    {

        String token            =  session.getAttribute("TOKEN").toString();
        String currencyCodeType =  session.getAttribute("currencyCodeType").toString();
        String paymentType      =  session.getAttribute("paymentType").toString();
        String payerID          =  session.getAttribute("PAYERID").toString();
        String serverName       =  request.getServerName();

        String nvpstr  = "&TOKEN=" + token + "&PAYERID=" + payerID + "&PAYMENTACTION=" + paymentType + "&AMT=" + finalPaymentAmount;
        nvpstr = nvpstr + "&CURRENCYCODE=" + currencyCodeType + "&IPADDRESS=" + serverName;

        HashMap nvp = httpcall("DoExpressCheckoutPayment", nvpstr);

        return nvp;
    }


    HashMap DirectPayment ( String paymentType, String paymentAmount,
                        String creditCardType, String creditCardNumber, String expDate, String cvv2,
                        String firstName, String lastName, String street, String city, String state, String zip, String countryCode,
                        String currencyCode, String IPAddress)
    {
        String nvpStr = "Amt=" + paymentAmount + "&PAYMENTACTION=" + paymentType;
        nvpStr += "&IPADDRESS=" + IPAddress;
        nvpStr += "&CREDITCARDTYPE=" + creditCardType + "&ACCT=" + creditCardNumber + "&EXPDATE=" + expDate + "&CVV2=" + cvv2;
        nvpStr += "&FIRSTNAME=" + firstName + "&LASTNAME=" + lastName + "&STREET=" + street + "&CITY=" + city + "&STATE=" + state + "&COUNTRYCODE=" + countryCode + "&ZIP=" + zip;
        nvpStr += "&CURRENCYCODE=" + currencyCode;

        return httpcall("DoDirectPayment", nvpStr);
    }

    public HashMap httpcall( String methodName, String nvpStr)
    {

        String version = "2.3";
        String agent = "Mozilla/4.0";
        String respText = "";
        HashMap nvp=null;


        String encodedData = "METHOD=" + methodName + "&VERSION=" + gv_Version + "&PWD=" + gv_APIPassword + "&USER=" + gv_APIUserName + "&SIGNATURE=" + gv_APISignature + nvpStr + "&BUTTONSOURCE=" + gv_BNCode;

        try 
        {
            URL postURL = new URL( gv_APIEndpoint );
            HttpURLConnection conn = (HttpURLConnection)postURL.openConnection();

            // Set connection parameters. We need to perform input and output, 
            // so set both as true. 
            conn.setDoInput (true);
            conn.setDoOutput (true);

            // Set the content type we are POSTing. We impersonate it as 
            // encoded form data 
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty( "User-Agent", agent );

            //conn.setRequestProperty( "Content-Type", type );
            conn.setRequestProperty( "Content-Length", String.valueOf( encodedData.length()) );
            conn.setRequestMethod("POST");

            // get the output stream to POST to. 
            DataOutputStream output = new DataOutputStream( conn.getOutputStream());
            output.writeBytes( encodedData );
            output.flush();
            output.close ();

            // Read input from the input stream.
            DataInputStream  in = new DataInputStream (conn.getInputStream()); 
            int rc = conn.getResponseCode();
            if ( rc != -1)
            {
                BufferedReader is = new BufferedReader(new InputStreamReader( conn.getInputStream()));
                String _line = null;
                while(((_line = is.readLine()) !=null))
                {
                    respText = respText + _line;
                }           
                nvp = deformatNVP( respText );
            }
            return nvp;
        }
        catch( IOException e )
        {
            // handle the error here
            return null;
        }
    }

    public HashMap deformatNVP( String pPayload )
    {
        HashMap nvp = new HashMap(); 
        StringTokenizer stTok = new StringTokenizer( pPayload, "&");
        while (stTok.hasMoreTokens())
        {
            StringTokenizer stInternalTokenizer = new StringTokenizer( stTok.nextToken(), "=");
            if (stInternalTokenizer.countTokens() == 2)
            {
                String key = URLDecoder.decode( stInternalTokenizer.nextToken());
                String value = URLDecoder.decode( stInternalTokenizer.nextToken());
                nvp.put( key.toUpperCase(), value );
            }
        }
        return nvp;
    }

    public void RedirectURL( String token, HttpServletResponse response )
    {
        String payPalURL = PAYPAL_URL + token; 

        //response.sendRedirect( payPalURL );
        response.setStatus(302);
        response.setHeader( "Location", payPalURL );
        response.setHeader( "Connection", "close" );
    }       

%>

エクスプレス チェックアウトをクリックすると、https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=EC-9CY1483461514290Lにリダイレクトされます。しかし、「ご注文内容」には、現在の購入金額が表示されていません。また、バイヤー アカウントでログインし、住所と支払いを確認すると、success.jsp ページに次のエラー メッセージが表示されます。

TIMESTAMP:2012-09-18T06:07:32Z CORRELATIONID:b4fe3695b410a ACK:Failure VERSION:84.0 BUILD:3622349 L_ERRORCODE0:10401 L_SHORTMESSAGE0:無効な引数のためトランザクションが拒否されました。詳細については、追加のエラー メッセージを参照してください。L_LONGMESSAGE0:注文合計が無効です。L_SEVERITYCODE0:エラー

しかし、名前と値のペア(nvp)を印刷すると、金額が含まれています

NVPSTR===>&Amt=25&PAYMENTACTION=Sale&ReturnUrl=http%3A%2F%2F2.appid.appspot.com%2Fsucess.jsp&CANCELURL=http%3A%2F%2F2.appid.appspot.com%2Fcanceled.jsp&CURRENCYCODE=USD

解決するか、解決策を提案してください。

4

1 に答える 1

3

DoExpressCheckoutPayment API 呼び出しと SetExpressCheckout API 呼び出しで金額を送信する必要があります。現在、SetEC と DoEC の両方の金額を送信しておらず、SetEC のみを送信しています。(SetEC に設定しないと、トークンを取得できませんでした。)

DoEC 呼び出しは、RETURNURL と CANCELURL が必要ないことを除いて、SetEC 呼び出しとほとんど同じである必要があります。

また、トランザクションの項目の詳細を送信しない限り、金額は注文概要に表示されません。

L_PAYMENTREQUEST_0_NAME0=Books 
L_PAYMENTREQUEST_0_AMT0=154.00 
L_PAYMENTREQUEST_0_NUMBER0=ABC123 
L_PAYMENTREQUEST_0_QTY0=2 
L_PAYMENTREQUEST_0_NAME1=CDs 
L_PAYMENTREQUEST_0_AMT1=50.00 
L_PAYMENTREQUEST_0_NUMBER1=BY-Z4736 
L_PAYMENTREQUEST_0_QTY1=3 
PAYMENTREQUEST_0_ITEMAMT=458.00 
PAYMENTREQUEST_0_SHIPPINGAMT=20.00 
PAYMENTREQUEST_0_TAXAMT=46.20 
PAYMENTREQUEST_0_AMT=524.20 
于 2012-09-21T16:29:29.630 に答える