2012-04-02 4 views
8

사용자가 내 사이트에서 제품을 구매할 수있는 응용 프로그램을 만들려고합니다. 구매에는 실제 구매 품목, 배송료, 세금 등이 포함됩니다. PayPal에는 지불 할 수있는 다양한 옵션이 있습니다. 하나는 웹 서비스이고 다른 하나는 사이트로 리디렉션하는 것입니다. 사용자의 경험을 가능한 한 원활하게하고 싶지만 신용 카드 등을 저장하는 사업에 참여하고 싶지 않습니다.재생! 프레임 워크 지불 처리 (전자 상거래/PayPal)

보안 연결/SSL을 사용하여 서버에서 트랜잭션을 처리하는 경우), 처리를 위해 신용 카드 정보를 서비스에 전달할 위험이 있습니까?

답변

11

Play! Framework v1.2는 WebServices를 아주 잘 지원합니다. Play 용 페이팔 모듈은 없지만 코드는 너무 복잡해서 작성할 수 없습니다. 우리 직업 게시판 (www.expressboard.fr) 용 웹 서비스 솔루션을 구현했으며 3 일이 걸렸습니다.

첫 번째 : 사용자는 항상 페이팔 웹 사이트로 리디렉션됩니다. paypal 클라이언트가 직면 한 해결책이 없습니다. Webservice 솔루션 (developer.paypal.com)을 사용하는 경우 로고가있는 페이팔 웹 페이지를 사용자 정의 할 수 있습니다. 최고의 솔루션은 아니지만 작동합니다.

재생 측면에서

, 여기에 페이팔 웹 서비스를 사용하는 체크 아웃 방법에 대한 샘플 코드입니다 :

public static void checkout() { 
    Double amount = Double.parseDouble(session.get("amount")); 
    Long userId = Long.parseLong(session.get("user-id")); 
    User user = User.findById(userId); 
    if (user != null) { 
     renderArgs.put("user", user); 
    } 

    // we calculate the net and gross amount with French V.A.T (19.6%) 
    BigDecimal amountBD = new BigDecimal(amount * 1.196); 
    BigDecimal netAmountBD = new BigDecimal(amount); 
    BigDecimal taxAmountBD = amountBD.subtract(netAmountBD); 

    String netAmount = netAmountBD.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString(); 
    String totalAmount = amountBD.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString(); 
    String taxAmount = taxAmountBD.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString(); 

    String subject="Publication d'une offre d'emploi"; 


// Paypal Web service callback executed by Play! 
// I have a paypal.api.server configuration property with prod and sandbox server 

    WS.HttpResponse res = WS.url(Play.configuration.get("paypal.api.server").toString() + 
      "&USER=%s" + 
      "&PWD=%s" + 
      "&SIGNATURE=%s" + 
      "&VERSION=%s" + 
      "&METHOD=%s" + 
      "&PAYMENTREQUEST_0_PAYMENTACTION=%s" + 
      "&LANDINGPAGE=%s" + 
      "&SOLUTIONTYPE=%s" + 
      "&EMAIL=%s" + 
      "&FIRSTNAME=%s" + 
      "&LASTNAME=%s" + 
      "&STREET=%s" + 
      "&STREET2=%s" + 
      "&CITY=%s" + 
      "&ZIP=%s" + 
      "&STATE=%s" + 
      "&PAYMENTREQUEST_0_CURRENCYCODE=%s" + 
      "&MAXAMT=%s" + 
      "&PAYMENTREQUEST_0_AMT=%s" + 
      "&PAYMENTREQUEST_0_ITEMAMT=%s" + 
      "&PAYMENTREQUEST_0_TAXAMT=%s" + 
      "&PAYMENTREQUEST_0_DESC=%s" + 
      "&L_PAYMENTREQUEST_0_NAME0=%s" + 
      "&L_PAYMENTREQUEST_0_NUMER0=%s" + 
      "&L_PAYMENTREQUEST_0_DESC0=%s" + 
      "&L_PAYMENTREQUEST_0_AMT0=%s" + 
      "&L_PAYMENTREQUEST_0_QTY0=%s" + 

      "&NOSHIPPING=%s" + 
      "&LOCALECODE=%s" + 
      "&RETURNURL=%s" + 
      "&CANCELURL=%s" + 
      "&ADDROVERRIDE=%s" + 
      "&BRANDNAME=%s" 
      , 
      //------- 
      Play.configuration.get("paypal.api.username").toString(), 
      Play.configuration.get("paypal.api.password").toString(), 
      Play.configuration.get("paypal.api.signature").toString(), 
      "69.0", // API Version 
      "SetExpressCheckout", //Method 
      "Sale", 
      "Billing", 
      "Sole", 
      user.email, 
      "" + user.fullname, 
      "" + user.fullname, 
      "" + user.postalAddress, 
      "" + user.postalAddress2, 
      "" + user.city, 
      "" + user.zip, 
      "None", 
      "EUR", 
      totalAmount, //MaxAMT 
      totalAmount, //amount.toString() 
      netAmount, //PAYMENTREQUEST_n_ITEMAMT 
      taxAmount, 
      subject, 
      //--------- 
      "Item name", 
      "1", 
      subject, 
      netAmount, 
      "1", 
      //--------- 
      "1", 
      "FR", 
      Play.configuration.get("paypal.returnUrl").toString(), 
      Play.configuration.get("paypal.cancelPay").toString(), 
      "1", //ADDROVERRIDE 
      "eXpress-Board pour Innoteria" 
    ).get(); 


    String message = res.getString(); 
    PaypalResponse paypalResponse = new PaypalResponse(message); 
    if (paypalResponse.isSuccess()) { 
     Payment payment = new Payment(); 
     payment.userId = user.id; 
     payment.totalAmount = totalAmount; 
     payment.netAmount = netAmount; 
     payment.taxAmount = taxAmount; 
     payment.token = paypalResponse.getToken(); 
     payment.correlationID = paypalResponse.getCorrelationID(); 
     payment.save(); 

     redirect(Play.configuration.get("paypal.api.http").toString() + "/cgi-bin/webscr?cmd=_express-checkout&token=" + paypalResponse.getToken()); 
    } 

    Logger.error("Error on SetExpressCheckout with: "); 
    for (String tokens : message.split("&")) { 
     try { 
      Logger.error(URLDecoder.decode(tokens, "UTF-8")); 
     } catch (UnsupportedEncodingException e) { 
     } 
    } 

    error("Error from Paypal"); 

} 

그것이 ** 사용자는 ** 무엇

+0

희망이 도움이 ??? 그것은 클래스인가? 또는 다른 것 ?? –

+0

및 ** WS ** 종속성을 스칼라에 추가하는 방법 _ ** build.sbt ** _ ?? –

+0

어디에서 찾을 수 있습니까 ** PaypalResponse **? –