tarjeta predeterminada por pago hacer forma como cambiar paypal paypal-sandbox express-checkout paypal-nvp

predeterminada - cambiar tarjeta principal paypal



Paypal: L_ERRORCODE0: 10401 El total del pedido no es válido y el argumento no es válido (1)

Debe enviar el importe en su llamada a la API DoExpressCheckoutPayment, así como su llamada a la API SetExpressCheckout. Actualmente, no está enviando la cantidad tanto para su SetEC como para DoEC, solo para su SetEC. (Si no lo configuró para SetEC, nunca habría recibido un token).

Su llamada a DoEC debería ser prácticamente la misma que su llamada a SetEC, excepto que no necesita RETURNURL y CANCELURL.

Además, el importe no se mostrará en el resumen de la orden a menos que envíe los detalles de la línea de pedido para su transacción:

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

Seguí https://www.paypal-labs.com/integrationwizard/ecpaypal/main.php para implementar la cuenta de sandbox de paypal en mi aplicación. Mi código se distribuye en 3 páginas de jsp como index.jsp -> expresscheckout.jsp -> paypalfunctions.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 es el siguiente:

<% 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" ); }

%>

Cuando hago clic en el pago exprés, lo redirecciono a https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=EC-9CY1483461514290L . Pero en ''Resumen de su orden'', no se muestra el monto actual de la compra. También después de iniciar sesión con mi cuenta de comprador y confirmar la dirección y el pago, aparecen los siguientes mensajes de error en mi página success.jsp:

TIMESTAMP: 2012-09-18T06: 07: 32Z CORRELATIONID: b4fe3695b410a ACK: Failure VERSIÓN: 84.0 BUILD: 3622349 L_ERRORCODE0: 10401 L_SHORTMESSAGE0: Transacción rechazada debido a un argumento no válido. Ver mensajes de error adicionales para más detalles. L_LONGMESSAGE0: el total del pedido no es válido. L_SEVERITYCODE0: error

Pero cuando imprimí mi par nombre-valor-par (nvp), contiene la cantidad

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

Por favor resuelva o sugiera una solución.