java服務器端接入paypal移動支付

前段時間app要推廣到香港,那邊人微信支付寶用的少,所以就接入了paypal支付,paypal支付比支付寶支付要簡單,前提是你有一個網(wǎng)速不錯的辦公環(huán)境(翻墻看youtube不卡就行)和良好的英文閱讀水平(開發(fā)文檔全英文)
首先訪問開發(fā)者中心,選擇【Braintree SDK】開發(fā)的方式,首先是將SDK導入到自己的項目,具體可以看https://developer.paypal.com/docs/accept-payments/express-checkout/ec-braintree-sdk/server-side/java/ ,之后獲取自己的access_token,這個可以在https://developer.paypal.com/developer/applications/editbtcredLive 中看到。做好了準備工作就要開始和前端對接了。
首先前端要喚起paypal支付需要一個token,它的獲取方式如下

com.braintreegateway.BraintreeGateway gateway = new BraintreeGateway("access_token$production$cky62c7dfgrt2sn你的token");
String token = gateway.clientToken().generate();

之后把token傳給前端,建議做這一步的時候生成一個本地訂單標記為【未支付】狀態(tài),并把訂單id一并給前端,以便前端支付成功后通過訂單id定位唯一訂單做后續(xù)操作。
之后麻煩前端同事去接paypal,在支付完成(不一定支付成功)的回調函數(shù)中可以獲取到一個nonce字符串,獲取到這個之后再把nonce和剛剛生成的訂單id回傳給后端,后端需要做的就是驗證它是不是支付成功了,驗證方法如下

BraintreeGateway gateway = new BraintreeGateway("access_token$production$cky你的access_token");
        TransactionRequest request = new TransactionRequest().paymentMethodNonce(nonce)
                .amount(pp.getMoney())
                .merchantAccountId("HKD")     //貨幣類型
                .orderId(pp.getId())
                .descriptor().name("商戶姓*名").done();
        //商戶名(好像是商戶名,記不清了)有限制的,姓名之間不要用空格而要用*,而且是一定要有*號
        //不然可能會報Company name/DBA section must be either 3,7 or 12 characters and the produce descriptor can be up to 18,14, or 9 character between for a total descriptor nam of 22 characters錯誤
        request.shippingAddress().firstName("Jen")
        .lastName("Smith").company("公司名").streetAddress("1 E 1st St")//company中的內(nèi)容不能有*號,最好是3、7或12位
        .extendedAddress("Suite 403")
        .locality("Bartlett")
        .region("IL")
        .postalCode("60103")
        .countryCodeAlpha2("US").done();     //一些支付的相關參數(shù)
        request.options().paypal().customField("PayPalcustom field").description("cmp wonderful product").done();
        request.options().storeInVaultOnSuccess(true).
        done();
        Result<Transaction> saleResult = gateway.transaction().sale(request);
        if (saleResult.isSuccess()) {
            Transaction transaction = saleResult.getTarget();
            System.out.println("Success ID: " + transaction.getId());
            System.out.println("transaction");
            Gson gson = new Gson();
            System.out.println(gson.toJson(transaction));
            //訂單號,可以通過它在paypal商戶管理的->交易記錄中使用交易號查詢到,方便后期退款方便,可以存在本地
            String txn_id = transaction.getPayPalDetails().getCaptureId();     
            String name = transaction.getPayPalDetails().getPayerFirstName() + " " + transaction.getPayPalDetails().getPayerLastName();
            String email = transaction.getPayPalDetails().getPayerEmail();
                        //支付成功,進行更多操作
        } else {
            //支付失敗的情況
            System.out.println("Message: " + saleResult.getMessage());
            System.out.println("Error:"+saleResult.getErrors().toString());
            Gson gson = new Gson();
            System.out.println("Error-JSON:" + gson.toJson(saleResult.getErrors()));
            msg.setCode(CodeTool.ERR);
            msg.setMessage("支付失敗:" + saleResult.getMessage());
        }

如此就可以即時的對用戶的支付進行一些處理了

其實還有一種更簡單的方法

連paypal的sdk都不需要,直接通過支付成功之后paypal服務器發(fā)給我們服務器的信息進行支付處理的,那就是通過【異步回調IPN】的方式進行,這是設置地址,設置之后用戶支付成功了paypal服務器就會向設置的服務器發(fā)送一個請求,里面就包含這訂單號等信息,這種方式前端也比較簡單,不需要向后臺請求token,但是這種方式有個很明顯的缺點就是【不及時】,遇到同時支付的人比較多的時候會有通知被排隊

被排隊的樣子

造成支付成功之后用戶不能馬上看到效果(大約延時10秒),所以不建議大家用這種方式

還有就是paypal商戶最好別注冊為中國大陸,如果你想明白自己的產(chǎn)品是面向大陸以外的地方的話,不然在國外支付的時候可能會出現(xiàn)【W(wǎng)e're sorry. We can't complete your purchase at this time】錯誤

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 支付 1.支付寶和銀聯(lián)的支付流程 常用的支付方式有: 1、支付寶支付 https://openhome.alipa...
    丶逐漸閱讀 1,723評論 3 11
  • 8 管理支付和訂單 在上一章中,你創(chuàng)建了一個包括商品目錄和訂單系統(tǒng)的在線商店。你還學習了如何用Celery啟動異步...
    lakerszhy閱讀 2,450評論 1 4
  • 一、背景介紹 作為一名Android開發(fā),從最初的跌跌撞撞到現(xiàn)在小有所悟,這其中經(jīng)歷過的辛酸苦辣也是一種痛并快樂著...
    freecats08閱讀 5,158評論 7 54
  • 佛陀告訴我們?nèi)松强嗟?,生,老,病,死,愛別離,怨憎會,求不得,五陰熾盛,每個人都無法逃脫??墒强慈碎g,那些美好,...
    讓春閱讀 289評論 0 0
  • 第一個字,嘴巴張開,有大氣往外輸送的輕松感,不巧碰到第二字,舌頭抵住,短促收起。 有戛然而止的美妙。 2012年,...
    cloriszow閱讀 417評論 10 2

友情鏈接更多精彩內(nèi)容