最近剛加入了一家跨境物聯網公司,剛來接到的需求就是微信支付和paypal支付,微信支付做的人很多了,沒什么大的難點,之前的隨筆提到過,今天主要來談談paypal支付。
首先應該申請一個沙箱環境的支付賬號和收款賬號,方便后面設置賬號信息測試支付用。
剛開始准備工作就遇到一個坑就是文檔,因為paypal只要是針對跨境支付的,所以他的文檔也都是英文的,這樣對於一個英文底子差的人真的是硬傷(最頭痛的是電腦一翻譯就卡),沒辦法只能硬着頭皮一點點的看,實在是看不懂的就百度一段段翻譯。看完了文檔就下載了paypal的sdk,sdk版本很多選擇適合自己的就行,由於我用的是.net core直接在nuget里面引用paypal的dll就行了。直接貼一下核心代碼僅供參考:
由於我們是寫的wabapi接口供APP端調用,所以調起paypal支付主要是APP端完成的,但是剛開始沒弄清楚流程,自己也研究了下pc端的調起方式,引用了sdk后用里面的東西是很簡單的
我這邊調起主要用的public static Payment Create(APIContext apiContext, Payment payment);參數根據實體類填充就好。
我們api主要是做支付后的后台處理操作,所以拿到APP支付的ID就能通過sdk獲取到支付的詳細信息Payment.Get(apiContext, paypalId),接口就可以對信息入庫了。
調用SDK獲取支付方法的核心代碼如下:
Dictionary<string, string> config = new Dictionary<string, string>();
config.Add("mode", Config.Mode);
config.Add("clientId", Config.ClientID);
config.Add("clientSecret", Config.ClientSecret);
var accessToken = new OAuthTokenCredential(Config.ClientID, Config.ClientSecret, config).GetAccessToken();
var apiContext = new APIContext(accessToken);
apiContext.Config = config;//這個在沙箱環境不寫也能通過,但是上了生產環境就通不過了,掉這個坑了
以為這樣就完了的,后來為了保險,又加上了paypal的異步回調IPN
var body = string.Empty;
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
body = await reader.ReadToEndAsync();
}
body = "cmd=_notify-validate&" + body;
var paras = body.Slice("&").ToDictionary(x => x.Slice("=", 2)[0], x => WebUtility.UrlDecode(x.Slice("=", 2)[1]));
例如orderID=paras.Peek("txn_id")
var content = new FormUrlEncodedContent(paras);
//_paypalConfig.ValidateUrl配置的沙箱地址:https://www.sandbox.paypal.com/cgi-bin/webscr
var response = await client.PostAsync(_paypalConfig.ValidateUrl, content);
var message = await response.Content.ReadAsStringAsync();
拿到回調的信息后判斷message.Equals("VERIFIED")&¶s.Peek("payment_status").Equals("Completed")同時都滿足后台再給用戶完成充值。
OK,基本流程就是這樣了,當然這個只是個人做法,僅供參考!!!