java服务器端接入paypal移动支付

前段时间app要推广到香港,那边人微信支付宝用的少,所以就接入了paypal支付,paypal支付比支付宝支付要简单,前提是你有一个网速不错的办公环境(翻墙看youtube不卡就行)和良好的英文阅读水平(开发文档全英文)
首先访问开发者中心,选择【Braintree SDK】开发的方式,首先是将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传给前端,建议做这一步的时候生成一个本地订单标记为【未支付】状态,并把订单id一并给前端,以便前端支付成功后通过订单id定位唯一订单做后续操作。
之后麻烦前端同事去接paypal,在支付完成(不一定支付成功)的回调函数中可以获取到一个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中的内容不能有*号,最好是3、7或12位
        .extendedAddress("Suite 403")
        .locality("Bartlett")
        .region("IL")
        .postalCode("60103")
        .countryCodeAlpha2("US").done();     //一些支付的相关参数
        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服务器发给我们服务器的信息进行支付处理的,那就是通过【异步回调IPN】的方式进行,这是设置地址,设置之后用户支付成功了paypal服务器就会向设置的服务器发送一个请求,里面就包含这订单号等信息,这种方式前端也比较简单,不需要向后台请求token,但是这种方式有个很明显的缺点就是【不及时】,遇到同时支付的人比较多的时候会有通知被排队

被排队的样子

造成支付成功之后用户不能马上看到效果(大约延时10秒),所以不建议大家用这种方式

还有就是paypal商户最好别注册为中国大陆,如果你想明白自己的产品是面向大陆以外的地方的话,不然在国外支付的时候可能会出现【We're sorry. We can't complete your purchase at this time】错误

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 支付 1.支付宝和银联的支付流程 常用的支付方式有: 1、支付宝支付 https://openhome.alipa...
    丶逐渐阅读 1,654评论 3 11
  • 8 管理支付和订单 在上一章中,你创建了一个包括商品目录和订单系统的在线商店。你还学习了如何用Celery启动异步...
    lakerszhy阅读 2,275评论 1 4
  • 一、背景介绍 作为一名Android开发,从最初的跌跌撞撞到现在小有所悟,这其中经历过的辛酸苦辣也是一种痛并快乐着...
    freecats08阅读 4,725评论 7 54
  • 佛陀告诉我们人生是苦的,生,老,病,死,爱别离,怨憎会,求不得,五阴炽盛,每个人都无法逃脱。可是看人间,那些美好,...
    讓春阅读 209评论 0 0
  • 第一个字,嘴巴张开,有大气往外输送的轻松感,不巧碰到第二字,舌头抵住,短促收起。 有戛然而止的美妙。 2012年,...
    cloriszow阅读 320评论 10 2