最近由於公司業務的調整,需要對接國外paypal支付,paypal的接口文檔全是英文,看起來很不舒服和流暢,主要還是怪自己的英文太菜,後來去github找了一個大佬寫的支付集成的sdk包,非常的厲害,幾行代碼即可對接成功,啪的一下,很快啊,一下子就對接好了。
paypal有v1、v2兩個版本,但是那位大佬寫的sdk是對接的paypal v1版本,我已經提了issues讓作者趕緊把v2給寫出來了,希望各位也多去提issues讓作者趕緊把v2版本的給搞出來,咱們大家一起push他!
接下來,我簡單的介紹一下使用的集成支付sdk,pay-java-parent是一個集成了第三方支付的sdk,包括微信支付、支付寶支付、銀聯、paypal等等,使用起來非常的簡潔高效,基本都是幾行代碼即可對接成功,本文講解的是如何對接paypal支付,github倉庫地址:
https://github.com/egzosn/pay-java-parent
如果你有需要對接其他的支付api,我在這十分的推薦使用這個sdk,也希望讀者們也能去貢獻一份自己的代碼,把這個sdk更好的去完善它!
由於pay-java-parent的作者只集成了paypal的v1版本,所以,本文只介紹如何對接paypal的v1版本,也希望讀者們能去倉庫地址多提issues讓作者把v2版本儘快更新出來。
首先,要對接paypal支付就得開通paypal的企業帳號,如何開通的本文就不做介紹,本人只介紹如何用沙箱帳號成功的對接paypal的支付。
現在還未創建沙箱環境中的帳號,所以,我們先去把帳號創建好,再來編寫代碼。創建環境的過程中記得把梯子給掛上,不然會404。https://developer.paypal.com/developer/applications/在瀏覽器輸入上方連結,選擇左邊的SANDBOX下的Accounts。進入後,會看到paypal已經為我們自動生成了幾個帳號,但是我們不用paypal創建的測試帳號,因為用著會很卡,所以我們自己再創建兩個,一個的類型是Business(商家),一個是Personal(用戶),國家那一項一定要選中國,帳戶餘額都可以自己隨便填。
生成測試帳號後,我們登陸沙箱環境的paypal網站,這裡一定要注意,沙箱環境的連結和paypal的官網是不同的!一定是要下方的連結!!
沙盒帳號登陸網址:https://sandbox.paypal.com
如果用的是商家類型的測試帳號登陸該網站,就可以看到收款的記錄等,如果使用的是用戶類型的測試帳號登陸該網站,就可以看到自己的付款記錄等。
下面一步就是創建應用了,創建應用登陸下面網址,選擇左邊導航欄下的Dashboard再選擇My Apps & Credentials,即可看到創建應用的頁面,默認的情況下paypal會為我們創建兩個默認應用,但我們還是自己創建一個,請記住,創建應用使用原本的企業帳號登陸,而不是沙盒的商家帳號!
創建應用網址:https://developer.paypal.com/developer/applications/
創建成功後,把生成的clientId和secret複製好,接下來就是咱們編碼的時候了!
首先,添加pay-java-parent的maven依賴:
<!--集成paypal支付-->
<dependency>
<groupId>com.egzosn</groupId>
<artifactId>pay-java-paypal</artifactId>
<version>2.13.3</version>
</dependency>然後,我們再編寫paypal的配置類:
package com.test.paypal.config;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.paypal.api.PayPalPayService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PayPalConfig {
@Value("${paypal.isTest}")
private Boolean isTest;
@Value("${paypal.client.id}")
private String clientId;
@Value("${paypal.client.secret}")
private String clientSecret;
@Value("${paypal.success-url}")
private String successUrl;
@Value("${paypal.cancel-url}")
private String cancelUrl;
@Bean
public PayService getPayPalService(){
PayService payService=new PayPalPayService(getPayPalConfigStorage());
payService.setRequestTemplateConfigStorage(getHttpConfigStorage());
return payService;
}
@Bean
public PayPalConfigStorage getPayPalConfigStorage(){
PayPalConfigStorage configStorage=new PayPalConfigStorage();
configStorage.setClientID(clientId);
configStorage.setClientSecret(clientSecret);
configStorage.setTest(isTest);
configStorage.setReturnUrl(successUrl);
configStorage.setNotifyUrl(cancelUrl);
return configStorage;
}
@Bean
public HttpConfigStorage getHttpConfigStorage(){
HttpConfigStorage httpConfigStorage=new HttpConfigStorage();
httpConfigStorage.setMaxTotal(300);
httpConfigStorage.setDefaultMaxPerRoute(30);
return httpConfigStorage;
}
}可以看到,我把所有的配置都寫在了yml文件上,然後通過讀取yml進行配置,這樣可以比較方便進行更換咱們的配置信息。
接下來就是controller層的配置了:
com.test.paypal.controller;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.DefaultCurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.paypal.bean.PayPalTransactionType;
import com.test.paypal.util.StringUnits;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/paypal")
@Slf4j
@RestController
public class PaypalController {
@Autowired
private PayService service;
@RequestMapping("/pay")
public String pay() {
log.info("調用付款接口");
PayOrder payOrder = new PayOrder("付款的subject", "訂單內容", new BigDecimal(4),
StringUnits.getUUID(),
PayPalTransactionType.sale);
payOrder.setCurType(DefaultCurType.USD);
Map orderInfo = service.orderInfo(payOrder);
String result=service.buildRequest(orderInfo, MethodType.POST);
log.info("result:{}",result);
return result;
}
@RequestMapping("/cancel")
public Object cancel(){
return "你取消了付款";
}
@RequestMapping("/success")
public Object success(HttpServletRequest request) throws IOException {
Map<String,Object> params=service.getParameter2Map(request.getParameterMap(),request.getInputStream());
if(service.verify(params)){
log.info("恭喜你付款成功");
//做邏輯處理
return "恭喜你付款成功";
}
return "付款失敗";
}
}我再把yml文件的配置給貼一下吧:
paypal:
isTest: true #是否開啟沙盒環境測試
success-url: http://localhost:8080/paypal/success #成功後返回的url(使用的是異步通知地址的兼容做法)
cancel-url: http://localhost:8080/paypal/cancel #取消付款的回調url
client:
id: 你的clientId
secret: 你的secret該注釋的參數也都注釋了,希望朋友們能夠測試成功!
如果對底層代碼比較感興趣的,建議各位朋友去看看該sdk的源碼,多學習一下源碼的設計思想,我稍微看了下,源碼寫的非常整潔,觀看感非常的不錯!
---END-
往期熱門文章:
☞【設計模式】飛機太大Egan拉不動
☞【設計模式-原型】Egan好不容易來的加薪機會
關注我哦
小編不易,如果你喜歡這篇文章,點點【在看】,點點分享,感謝