2012-04-02 82 views
8

我正在寻找建立一个应用程序,用户将有能力从我的网站购买产品。购买将包括他们正在购买的实物商品,运费,税金(如果适用)等。我知道PayPal有许多可用于付款的选项,其中之一是Web服务,另一个只是重定向到他们的网站。我想为用户的体验,以尽可能无缝的,但我并不想进入存储信用卡等业务玩!框架支付处理(电子商务/ PayPal)

如果我做处理我的服务器上的事务(与安全连接/ SSL ),我是否会将信用卡信息传递给他们的服务进行处理?

回答

11

玩! Framework v1.2对WebServices有很好的支持。 Play没有贝宝模块,但代码不太复杂。我为我们的工作板(www.express-board.fr)实施了Web服务解决方案,并花了3天时间。

第一:用户总是重定向到贝宝网站。没有贝宝客户端面临的解决方案。如果您使用Webservice解决方案(developer.paypal.com),则可以使用您的徽标自定义贝宝网页。不是最好的解决方案,但它有效。

在播放方面,这里是一个检验方法的样本代码,使用贝宝的Web服务:

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

什么是** **的用户???它是一个类?或者是其他东西 ?? – 2014-03-06 12:00:24

+0

以及如何在scala中添加** WS **依赖关系_ ** build.sbt ** _ ?? – 2014-03-06 12:06:04

+0

我在哪里可以找到类** PaypalResponse **? – 2017-08-18 11:25:17