PayPal REST是PayPal提供的新的集成接口,現在來看看怎么集成REST。
1>Register with PayPal and get your credentials。
登錄網站https://developer.paypal.com/
獲取到了Credentials,看下怎么集成REST,網址https://developer.paypal.com/webapps/developer/docs/api/。
下載實例代碼:
按實例代碼開發,解壓下載文件。
配置web.config,paypal節點放在configSections后面,修改ClientID和ClientSecret
<configSections> <section name="paypal" type="PayPal.Manager.SDKConfigHandler, PayPalCoreSDK"/> </configSections>
<!-- PayPal SDK config --> <paypal> <settings> <add name="endpoint" value="https://api.sandbox.paypal.com/"/> <add name="oauth.EndPoint" value="https://api.sandbox.paypal.com/"/> <add name="connectionTimeout" value="360000"/> <!-- The number of times a request must be retried if the API endpoint is unresponsive --> <add name="requestRetries" value="1"/> <add name="ClientID" value="EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM"/> <add name="ClientSecret" value="EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM"/> </settings> </paypal>
添加引用:
PayPal賬戶支付
復制代碼到自己的action,做些許修改。實例如下:
public ActionResult PayPalREST() { Payment pymnt = null; //根據ClientID 和 ClientSecret 獲取accessToken string accessToken = new OAuthTokenCredential(ConfigManager.Instance.GetProperties()["ClientID"], ConfigManager.Instance.GetProperties()["ClientSecret"]).GetAccessToken(); //根據accessToken獲取 API 上下文 APIContext apiContext = new APIContext(accessToken); //如果PayerID不為null,是從PayPal跳轉回來的,執行支付 if (Request.Params["PayerID"] != null) { pymnt = new Payment(); if (Request.Params["guid"] != null) { pymnt.id = (string)Session[Request.Params["guid"]]; } PaymentExecution pymntExecution = new PaymentExecution(); pymntExecution.payer_id = Request.Params["PayerID"]; Payment executedPayment = pymnt.Execute(apiContext,pymntExecution); } //否則,創建支付,跳轉到PayPal去 else { //Payer Payer payr = new Payer(); payr.payment_method = "paypal"; Random rndm = new Random(); var guid = Convert.ToString(rndm.Next(100000)); //會跳地址 string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + Url.Action("PayPalREST", "PayPal"); RedirectUrls redirUrls = new RedirectUrls(); redirUrls.cancel_url = baseURI + "?guid=" + guid; redirUrls.return_url = baseURI + "?guid=" + guid; // Details Details details = new Details(); details.tax = "15"; details.shipping = "10"; details.subtotal = "75"; //Amount Amount amnt = new Amount(); amnt.currency = "USD"; // Total must be equal to sum of shipping, tax and subtotal. amnt.total = "100"; amnt.details = details; //Transaction List<Transaction> transactionList = new List<Transaction>(); Transaction tran = new Transaction(); tran.description = "Transaction description."; tran.amount = amnt; transactionList.Add(tran); //Payment pymnt = new Payment(); pymnt.intent = "sale"; pymnt.payer = payr; pymnt.transactions = transactionList; pymnt.redirect_urls = redirUrls; // The return object contains the status; Payment createdPayment = pymnt.Create(apiContext); var links = createdPayment.links.GetEnumerator(); while (links.MoveNext()) { Links lnk = links.Current; if (lnk.rel.ToLower().Trim().Equals("approval_url")) { Session.Add(guid, createdPayment.id); return Redirect(lnk.href); } } } return View(); }
這里有兩個需要注意的地方,第一是回跳地址,要寫仔細,稍微不同都會出錯。第二是跳轉之前的Session.Add,這里如果忘記添加的話,在從PayPal跳轉回來,就會出錯,無法完成支付。
信用卡支付
信用卡支付與賬戶支付大同小異,找到信用卡支付的代碼,做些修改就好了。實例代碼如下:
public ActionResult PayPalRESTREST() { // ###Address Address billingAddress = new Address(); billingAddress.city = "Johnstown"; billingAddress.country_code = "US"; billingAddress.line1 = "52 N Main ST"; billingAddress.postal_code = "43210"; billingAddress.state = "OH"; // ###CreditCard CreditCard crdtCard = new CreditCard(); crdtCard.billing_address = billingAddress; crdtCard.cvv2 = "874"; crdtCard.expire_month = 11; crdtCard.expire_year = 2018; crdtCard.first_name = "Joe"; crdtCard.last_name = "Shopper"; crdtCard.number = "4417119669820331"; crdtCard.type = "visa"; // ###Details Details details = new Details(); details.shipping = "1"; details.subtotal = "5"; details.tax = "1"; // ###Amount Amount amnt = new Amount(); amnt.currency = "USD"; // Total must be equal to sum of shipping, tax and subtotal. amnt.total = "7"; amnt.details = details; // ###Transaction Transaction tran = new Transaction(); tran.amount = amnt; tran.description = "This is the payment transaction description."; List<Transaction> transactions = new List<Transaction>(); transactions.Add(tran); // ###FundingInstrument FundingInstrument fundInstrument = new FundingInstrument(); fundInstrument.credit_card = crdtCard; List<FundingInstrument> fundingInstrumentList = new List<FundingInstrument>(); fundingInstrumentList.Add(fundInstrument); // ###Payer Payer payr = new Payer(); payr.funding_instruments = fundingInstrumentList; payr.payment_method = "credit_card"; // ###Payment Payment pymnt = new Payment(); pymnt.intent = "sale"; pymnt.payer = payr; pymnt.transactions = transactions; // ###AccessToken string accessToken = new OAuthTokenCredential(ConfigManager.Instance.GetProperties()["ClientID"], ConfigManager.Instance.GetProperties()["ClientSecret"]).GetAccessToken(); // ### Api Context APIContext apiContext = new APIContext(accessToken); Payment createdPayment = pymnt.Create(apiContext); return View(); }
退款
public ActionResult RestRefund() { // ###AccessToken string accessToken = new OAuthTokenCredential(ConfigManager.Instance.GetProperties()["ClientID"], ConfigManager.Instance.GetProperties()["ClientSecret"]).GetAccessToken(); Sale sale = Sale.Get(accessToken, "5UB84317A9854725P"); Amount amount = new Amount(); amount.total = "10"; amount.currency = "USD"; Refund refund = new Refund(); refund.amount = amount;
Refund newRefund = sale.Refund(accessToken, refund); return View(); }
這里需要一個transactionId和退款金額,在信用卡付款和PayPal賬戶付款執行完的那個對象可以找到,要存下來,具體地方是executedPayment.transactions[0].related_resources[0].sale.id;