您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Paypal 支付功能的 C# .NET / JS 如何實(shí)現(xiàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
說明
最近用到了 Paypal 支付功能,英語一般般的我也不得不硬著頭皮踩一踩這樣的坑。經(jīng)過近乎半個(gè)月的作,終于實(shí)現(xiàn)了簡單的支付功能,那么首先就說說使用 Paypal 必定要知道的幾點(diǎn)(當(dāng)前日期 2018年08月07日):
1. 你應(yīng)該知道 Paypal 支付功能是支持銀聯(lián)卡的,但是不支持中國買家賬號(hào)支付給中國賣家賬號(hào)
2. Paypal 接口有兩套,切記,產(chǎn)品環(huán)境和 sandbox 測試環(huán)境不同
3. 測試賬號(hào)同樣不能使用中國賬號(hào)給中國賬號(hào)付款
4. 如果你僅僅想具有固定金額的支付按鈕,用你的 Paypal 商家賬號(hào)登錄官網(wǎng),配置頁里面完全可以配置出固定的支付按鈕,然后 Copy 對(duì)應(yīng)的 Html 到你的頁面就 OK 了,也就沒有必要通過更復(fù)雜的方式去支付了
5. 如果你必須動(dòng)態(tài)價(jià)格和商品信息、或者你要學(xué)習(xí)基本的 Paypal 接口的話,那么就請(qǐng)靜靜的往下看吧
6. 真實(shí)環(huán)境支付 Paypal 每一筆都需要收取商家賬號(hào)手續(xù)費(fèi)的,并且手續(xù)費(fèi)不低,如果你用真實(shí)環(huán)境測試,那么一定要記得每一筆都申請(qǐng)退款吧,退款很方便,商家后臺(tái)就能直接發(fā)起,退款幾乎是實(shí)時(shí)的。
Paypal 費(fèi)用說明:https://www.paypal.com/businesswallet/fees/paypal-fees
相關(guān)資料
Paypal 官方地址:https://www.paypal.com/
Paypal 官方測試地址:https://www.sandbox.paypal.com
Paypal 開發(fā)者中心:https://developer.paypal.com/
Paypal API: https://api.paypal.com
Paypal sandbox API: https://api.sandbox.paypal.com
模式圖片:
模式說明:
Checkout JS 模式是一種前端實(shí)現(xiàn),使用官方提供的 Checkout.js SDK 實(shí)現(xiàn)支付,不需要自己寫直接調(diào)用接口的代碼,相對(duì)而言也挺簡單,但是如果你想檢測支付是否成功,你應(yīng)當(dāng)通過調(diào)用接口的方式驗(yàn)證了。
支付部分代碼:
<p id="paypal-button"></p>
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script type="text/javascript"> paypal.Button.render({ env: 'production', // production or sandbox 表示產(chǎn)品環(huán)境還是測試環(huán)境 client: { production: '', // 產(chǎn)品環(huán)境,值為字符串,配置實(shí)際商家號(hào)的 ClientId // sandbox: '', // 測試環(huán)境,值為字符串,配置商家測試號(hào)的 ClientId }, style: { size: 'medium', color: 'black', shape: 'pill', label: 'paypal', tagline: 'false', fundingicons: 'true' }, commit: true, payment: function (data, actions) { return actions.payment.create({ transactions: [ { amount: { total: "0.01", currency: "USD" }, description: "測試商品描述", custom: "X00002" } ], redirect_urls: { return_url: 'http://localhost:4478/Success.aspx?type=js', cancel_url: 'http://localhost:4478/Cancel.aspx' } }); }, onAuthorize: function (data, actions) { return actions.payment.execute() .then(function () { actions.redirect(); }); }, onCancel: function (data, actions) { actions.redirect(); } }, '#paypal-button'); </script>
如果你需要在支付跳轉(zhuǎn)的成功頁再次驗(yàn)證一下是否支付成功,你需要自己調(diào)用官方提供的 RESTful API,參見下文的 RESTful API 支付模式
說明
接口的方式很常見,和支付寶的接口類似,只是使用了 RESTful API 的模式,采用了 Basic Auth 的加密方式。使用接口的模式很常規(guī),我們?cè)陧撁纥c(diǎn)擊按鈕調(diào)用支付接口,彈出支付頁,支付成功跳轉(zhuǎn)到成功頁面,成功頁面再調(diào)用確認(rèn)支付接口確認(rèn)結(jié)果。
支付接口調(diào)用:
using System; using System.Text; using System.Web.Script.Serialization; using cn.lovelong.Paypal.Config; using cn.lovelong.Paypal.Enums; using cn.lovelong.Paypal.Model; namespace cn.lovelong.Paypal.Paypal { /// <summary> /// CreatePayment 的摘要說明 /// </summary> public class CreatePayment { public CreatePayment() { } public PaymentResult Pay(string json) { var jsonResult = HttpHelper.PostJson( UrlConfig.CreatePaymentUrl, AccountConfig.ClientId, AccountConfig.Secret, json, Encoding.UTF8); var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult); return result; } public PaymentResult Pay(PaymentParam param) { var json = GetPayParams(param); return Pay(json); } public string GetPayParams(PaymentParam param) { var total = param.Total.ToString("N"); var currency = Enum.GetName(typeof (PaypalCurrency), param.Currency); var payParams = new { intent = "sale", redirect_urls = new { return_url = param.ReturnUrl, cancel_url = param.CancelUrl, }, payer = new { payment_method = "paypal" }, transactions = new dynamic[] { new { amount = new { total = total, currency = currency }, description = param.Description, custom = param.Code, item_list = new { items = new dynamic[] { new { name = param.Name, //description = param.Name, quantity = "1", price = total, //tax = "0.01", //sku = "1", currency = currency } } } } } }; var json = new JavaScriptSerializer().Serialize(payParams); return json; } public string GetFullPayParams(decimal total, PaypalCurrency currency, string returnUrl, string cancelUrl) { var payParams = new { intent = "sale", redirect_urls = new { return_url = returnUrl, cancel_url = cancelUrl, }, payer = new { payment_method = "paypal" }, transactions = new dynamic[] { new { amount = new { total = total.ToString("N"), currency = Enum.GetName(typeof(PaypalCurrency),currency), details = new { subtotal = "30.00", tax = "0.07", shipping = "0.03", handling_fee = "1.00", shipping_discount = "-1.00", insurance = "0.01" } }, description = "", custom = "EBAY_EMS_90048630024435", invoice_number = "48787589673", payment_options = new { allowed_payment_method = "INSTANT_FUNDING_SOURCE" }, soft_descriptor = "ECHI5786786", item_list = new { items = new dynamic[] { new { name = "hat", description = "Brown hat.", quantity = "5", price = "3", tax = "0.01", sku = "1", currency = "USD" } }, shipping_address = new { recipient_name = "Brian Robinson", line1 = "4th Floor", line2 = "Unit #34", city = "San Jose", country_code = "US", postal_code = "95131", phone = "011862212345678", state = "CA" }, } } } }; var json = new JavaScriptSerializer().Serialize(payParams); return json; } } }
確認(rèn)支付接口:
using System.Text; using System.Web.Script.Serialization; using cn.lovelong.Paypal.Config; using cn.lovelong.Paypal.Model; namespace cn.lovelong.Paypal.Paypal { /// <summary> /// Approved 的摘要說明 /// </summary> public class Approved { public PaymentResult DoJson(string paymentId, dynamic json) { var jsonResult = HttpHelper.PostJson(string.Format(UrlConfig.ApprovedUrl, paymentId), AccountConfig.ClientId, AccountConfig.Secret, json, Encoding.UTF8); var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult); return result; } public PaymentResult Do(string paymentId, string payerId) { var json = GetPayParams(payerId); return DoJson(paymentId, json); } public string GetPayParams(string payerId) { var payParams = new { payer_id = payerId }; var json = new JavaScriptSerializer().Serialize(payParams); return json; } } }
查詢支付結(jié)果接口調(diào)用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Script.Serialization; using cn.lovelong.Paypal.Config; using cn.lovelong.Paypal.Model; namespace cn.lovelong.Paypal.Paypal { public class ShowPaymentDetails { public PaymentResult Do(string paymentId) { var json = HttpHelper.Get( string.Format(UrlConfig.ShowPaymentDetailsUrl, paymentId), AccountConfig.ClientId, AccountConfig.Secret, Encoding.UTF8); var result = new JavaScriptSerializer().Deserialize<PaymentResult>(json); return result; } } }
最容易出問題的反而是通用類 HttpHelper:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Policy; using System.Text; using System.Threading.Tasks; namespace cn.lovelong.Paypal { public class HttpHelper { public static string PostForm(string url, string userName, string password, Dictionary<string,object> dic, Encoding encoding) { var param = string.Empty; foreach (var o in dic) { if (string.IsNullOrEmpty(param)) param += o.Key + "=" + o.Value; else param += "&" + o.Key + "=" + o.Value; } byte[] byteArray = encoding.GetBytes(param); //處理HttpWebRequest訪問https有安全證書的問題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。) ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password))); request.PreAuthenticate = true; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; //寫入?yún)?shù) Stream newStream = request.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length); newStream.Close(); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { if(stream != null) using (StreamReader sr = new StreamReader(stream, Encoding.UTF8)) { return sr.ReadToEnd(); } } } return string.Empty; } public static string PostJson(string url, string userName, string password, string json, Encoding encoding) { byte[] byteArray = encoding.GetBytes(json); //處理HttpWebRequest訪問https有安全證書的問題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。) ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password))); request.PreAuthenticate = true; request.Method = "POST"; request.Headers.Add("Cache-Control", "no-cache"); request.ContentType = "application/json"; request.ContentLength = byteArray.Length; //寫入?yún)?shù) Stream newStream = request.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length); newStream.Close(); using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) { using (var stream = response.GetResponseStream()) { if (stream != null) using (StreamReader sr = new StreamReader(stream, Encoding.UTF8)) { return sr.ReadToEnd(); } } } return string.Empty; } public static string Get(string url, string userName, string password, Encoding encoding) { //處理HttpWebRequest訪問https有安全證書的問題( 請(qǐng)求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。) ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password))); request.PreAuthenticate = true; request.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { if (stream != null) using (StreamReader sr = new StreamReader(stream, Encoding.UTF8)) { return sr.ReadToEnd(); } } } return string.Empty; } } }
主要的功能都已經(jīng)實(shí)現(xiàn)了!看看演示 Demo 吧!
1. 支付頁面
2. Checkout JS 方式(如果你的頁面點(diǎn)擊登錄之后一直在第二個(gè)頁面轉(zhuǎn)圈的話,那只能說明你的登錄賬號(hào)不能支付你的商家賬號(hào),或者你的賬號(hào)如果登錄之后顯示添加銀行卡的提示,說明你的商家賬號(hào)和你的賬號(hào)都是中國賬號(hào),那你只能添加多幣種卡支付,不能用銀聯(lián)支付了):
付款就好了!
3. 接口方式我就沒有使用彈出頁面了,最簡單的方式(接口會(huì)直接在調(diào)用接口的頁面觸發(fā)支付跳轉(zhuǎn)),點(diǎn)擊接口支付
我就不支付了,我用的商家賬號(hào)是自己的新加坡的賬號(hào), 按照今天的匯率 $0.01 = ¥0.068,你至少需要支付 0.07 元才能完成支付,而文章開頭也說了,商家需要付稅,也就是說你支付的 0.07 都會(huì)變成給 Paypal 的稅,商家一分錢也拿不到,也就是說,你至少支付 3.5元人民幣($0.51 = ¥3.481)商家才能得到微額的款項(xiàng)。
下面給出 Demo 源碼,源碼中配置的商家號(hào)是我自己的,請(qǐng)自行修改,為了方便大家沒有商家賬號(hào)的朋友做測試我就不刪除了,朋友們也不要真的支付測試,你的測試只會(huì)讓 Paypal 賺錢而已!
我的開發(fā)環(huán)境是 VS2015 + C# 6.0 + JS ,代碼僅供參考,請(qǐng)自行修改擴(kuò)展學(xué)習(xí)使用!
看完上述內(nèi)容,你們對(duì)Paypal 支付功能的 C# .NET / JS 如何實(shí)現(xiàn)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。