前段時(shí)間app要推廣到香港汁雷,那邊人微信支付寶用的少侠讯,所以就接入了paypal支付暑刃,paypal支付比支付寶支付要簡單,前提是你有一個(gè)網(wǎng)速不錯(cuò)的辦公環(huán)境(翻墻看youtube不卡就行)和良好的英文閱讀水平(開發(fā)文檔全英文)
首先訪問開發(fā)者中心溜嗜,選擇【Braintree SDK】開發(fā)的方式架谎,首先是將SDK導(dǎo)入到自己的項(xiàng)目,具體可以看https://developer.paypal.com/docs/accept-payments/express-checkout/ec-braintree-sdk/server-side/java/ 焙压,之后獲取自己的access_token,這個(gè)可以在https://developer.paypal.com/developer/applications/editbtcredLive 中看到涯曲。做好了準(zhǔn)備工作就要開始和前端對接了。
首先前端要喚起paypal支付需要一個(gè)token拨黔,它的獲取方式如下
com.braintreegateway.BraintreeGateway gateway = new BraintreeGateway("access_token$production$cky62c7dfgrt2sn你的token");
String token = gateway.clientToken().generate();
之后把token傳給前端绰沥,建議做這一步的時(shí)候生成一個(gè)本地訂單標(biāo)記為【未支付】狀態(tài)徽曲,并把訂單id一并給前端,以便前端支付成功后通過訂單id定位唯一訂單做后續(xù)操作秃臣。
之后麻煩前端同事去接paypal,在支付完成(不一定支付成功)的回調(diào)函數(shù)中可以獲取到一個(gè)nonce字符串弧哎,獲取到這個(gè)之后再把nonce和剛剛生成的訂單id回傳給后端稚虎,后端需要做的就是驗(yàn)證它是不是支付成功了,驗(yàn)證方法如下
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();
//商戶名(好像是商戶名序攘,記不清了)有限制的寻拂,姓名之間不要用空格而要用*兜喻,而且是一定要有*號
//不然可能會報(bào)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錯(cuò)誤
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(); //一些支付的相關(guān)參數(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();
//支付成功,進(jìn)行更多操作
} 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());
}
如此就可以即時(shí)的對用戶的支付進(jìn)行一些處理了
其實(shí)還有一種更簡單的方法
連paypal的sdk都不需要愚臀,直接通過支付成功之后paypal服務(wù)器發(fā)給我們服務(wù)器的信息進(jìn)行支付處理的姑裂,那就是通過【異步回調(diào)IPN】的方式進(jìn)行男旗,這是設(shè)置地址,設(shè)置之后用戶支付成功了paypal服務(wù)器就會向設(shè)置的服務(wù)器發(fā)送一個(gè)請求察皇,里面就包含這訂單號等信息让网,這種方式前端也比較簡單,不需要向后臺請求token溃睹,但是這種方式有個(gè)很明顯的缺點(diǎn)就是【不及時(shí)】,遇到同時(shí)支付的人比較多的時(shí)候會有通知被排隊(duì)
造成支付成功之后用戶不能馬上看到效果(大約延時(shí)10秒)泞辐,所以不建議大家用這種方式
還有就是paypal商戶最好別注冊為中國大陸咐吼,如果你想明白自己的產(chǎn)品是面向大陸以外的地方的話商佑,不然在國外支付的時(shí)候可能會出現(xiàn)【W(wǎng)e're sorry. We can't complete your purchase at this time】錯(cuò)誤