作全球性的支付,選用paypal!爲何選擇paypal? 由於paypal是目前全球最大的在線支付工具,就像國內的支付寶同樣,是一個基於買賣雙方的第三方平臺。買家只需知道你的paypal帳號,便可在線直接把錢匯入你的帳戶,即時到帳,簡單方便快捷。
在集成paypal支付接口以前,首先要有一系列的準備,開發者帳號啊、sdk、測試環境等等先要有,而後再碼代碼。集成的步驟以下:
1、環境準備 html
2、代碼集成 api
(1)在瀏覽器輸入「https://www.paypal.com 」 跳轉到以下界面,點擊右上角的註冊
(2)選擇,」建立商家用戶」,根據要求填寫信息,一分鐘的事,註冊完得去郵箱激活
(1)登陸成功後,在左邊的導航欄中點擊 Sandbox 下的 Accounts
(2)進入Acccouts界面後,能夠看到系統有兩個已經生成好的測試帳號,可是咱們不要用系統給的測試帳號,很卡的,本身建立兩個
(3)點擊右上角的「Create Account」,建立測試用戶
<1> 先建立一個「 PERSONAL」類型的用戶,國家必定要選「China」,帳戶餘額本身填寫
<2> 接着建立一個「BUSINESS」類型的用戶,國家必定要選「China」,帳戶餘額本身填寫
<3>建立好以後能夠點擊測試帳號下的」Profile「,能夠查看信息,若是沒加載出來,刷新
<4>用測試帳號登陸測試網站查看,注意!這跟paypal官網不一樣!不是同一個地址,在瀏覽器輸入:https://www.sandbox.paypal.com 在這裏登錄測試帳戶
建立應用,生成用於測試的clientID 和 密鑰 (1)點擊左邊導航欄Dashboard下的My Apps & Credentials,建立一個Live帳號,下圖是我已經建立好的
(2)而後再到下邊建立App
這是我建立好的「Test」App
(3)點擊剛剛建立好的App「Test」,注意看到」ClientID「 和」Secret「(Secret若是沒顯示,點擊下面的show就會看到,點擊後show變爲hide)
springboot環境搭建 (1)新建幾個包,和目錄,項目結構以下
pom引進paypal-sdk的jar包 (1)pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion > 4.0.0
</modelVersion >
<groupId > com.masasdani
</groupId >
<artifactId > paypal-springboot
</artifactId >
<version > 0.0.1-SNAPSHOT
</version >
<name > paypal-springboot
</name >
<repositories >
<repository >
<id > spring-milestones
</id >
<name > Spring Milestones
</name >
<url > http://repo.spring.io/libs-milestone
</url >
</repository >
<repository >
<id > jcenter-snapshots
</id >
<name > jcenter
</name >
<url > https://jcenter.bintray.com/
</url >
</repository >
</repositories >
<pluginRepositories >
<pluginRepository >
<id > spring-milestones
</id >
<name > Spring Milestones
</name >
<url > http://repo.spring.io/libs-milestone
</url >
</pluginRepository >
</pluginRepositories >
<parent >
<groupId > org.springframework.boot
</groupId >
<artifactId > spring-boot-starter-parent
</artifactId >
<version > 1.3.0.RELEASE
</version >
</parent >
<properties >
<project.build.sourceEncoding > UTF-8
</project.build.sourceEncoding >
<java.version > 1.7
</java.version >
</properties >
<dependencies >
<dependency >
<groupId > org.springframework.boot
</groupId >
<artifactId > spring-boot-starter-web
</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot
</groupId >
<artifactId > spring-boot-starter-thymeleaf
</artifactId >
</dependency >
<dependency >
<groupId > com.paypal.sdk
</groupId >
<artifactId > rest-api-sdk
</artifactId >
<version > 1.4.2
</version >
</dependency >
</dependencies >
<build >
<plugins >
<plugin >
<groupId > org.apache.maven.plugins
</groupId >
<artifactId > maven-compiler-plugin
</artifactId >
<configuration >
<source > ${java.version}
</source >
<target > ${java.version}
</target >
</configuration >
</plugin >
</plugins >
</build >
</project >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package
com .masasdani .paypal
import org
.springframework .boot .SpringApplication
import org
.springframework .boot .autoconfigure .EnableAutoConfiguration
import org
.springframework .context .annotation .ComponentScan
import org
.springframework .context .annotation .Configuration
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication
.run (Application
.class , args)
}
}
(2)PaypalConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.masasdani.paypal.config;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.paypal.base.rest.APIContext;
import com.paypal.base.rest.OAuthTokenCredential;
import com.paypal.base.rest.PayPalRESTException;
@Configuration
public class PaypalConfig {
@Value (
"${paypal.client.app}" )
private String clientId;
@Value (
"${paypal.client.secret}" )
private String clientSecret;
@Value (
"${paypal.mode}" )
private String mode;
@Bean
public Map<String, String>
paypalSdkConfig (){
Map<String, String> sdkConfig =
new HashMap<>();
sdkConfig.put(
"mode" , mode);
return sdkConfig;
}
@Bean
public OAuthTokenCredential
authTokenCredential (){
return new OAuthTokenCredential(clientId, clientSecret, paypalSdkConfig());
}
@Bean
public APIContext
apiContext ()
throws PayPalRESTException{
APIContext apiContext =
new APIContext(authTokenCredential().getAccessToken());
apiContext.setConfigurationMap(paypalSdkConfig());
return apiContext;
}
}
(3)PaypalPaymentIntent.java
package com.masasdani.paypal.config;
public enum PaypalPaymentIntent {
sale, authorize, order
}
(4)PaypalPaymentMethod.java
package com.masasdani.paypal.config;
public enum PaypalPaymentMethod {
credit_card, paypal
}
(5)PaymentController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package
com .masasdani .paypal .controller
import javax
.servlet .http .HttpServletRequest
import org
.slf 4j
.Logger
import org
.slf 4j
.LoggerFactory
import org
.springframework .beans .factory .annotation .Autowired
import org
.springframework .stereotype .Controller
import org
.springframework .web .bind .annotation .RequestMapping
import org
.springframework .web .bind .annotation .RequestMethod
import org
.springframework .web .bind .annotation .RequestParam
import
com .masasdani .paypal .config .PaypalPaymentIntent
import
com .masasdani .paypal .config .PaypalPaymentMethod
import
com .masasdani .paypal .service .PaypalService
import
com .masasdani .paypal .util .URLUtils
import
com .paypal .api .payments .Links
import
com .paypal .api .payments .Payment
import
com .paypal .base .rest .PayPalRESTException
@Controller
@RequestMapping(
"/" )
public class PaymentController {
public static final String PAYPAL_SUCCESS_URL =
"pay/success"
public static final String PAYPAL_CANCEL_URL =
"pay/cancel"
private Logger log = LoggerFactory
.getLogger (getClass())
@Autowired
private PaypalService paypalService
@RequestMapping(method = RequestMethod
.GET )
public String index(){
return
"index"
}
@RequestMapping(method = RequestMethod
.POST , value =
"pay" )
public String pay(HttpServletRequest request){
String cancelUrl = URLUtils
.getBaseURl (request) +
"/" + PAYPAL_CANCEL_URL
String successUrl = URLUtils
.getBaseURl (request) +
"/" + PAYPAL_SUCCESS_URL
try {
Payment payment = paypalService
.createPayment (
500.00 ,
"USD" ,
PaypalPaymentMethod
.paypal ,
PaypalPaymentIntent
.sale ,
"payment description" ,
cancelUrl,
successUrl)
for(Links links : payment
.getLinks ()){
if(links
.getRel ()
.equals (
"approval_url" )){
return
"redirect:" + links
.getHref ()
}
}
} catch (PayPalRESTException e) {
log
.error (e
.getMessage ())
}
return
"redirect:/"
}
@RequestMapping(method = RequestMethod
.GET , value = PAYPAL_CANCEL_URL)
public String cancelPay(){
return
"cancel"
}
@RequestMapping(method = RequestMethod
.GET , value = PAYPAL_SUCCESS_URL)
public String successPay(@RequestParam(
"paymentId" ) String paymentId, @RequestParam(
"PayerID" ) String payerId){
try {
Payment payment = paypalService
.executePayment (paymentId, payerId)
if(payment
.getState ()
.equals (
"approved" )){
return
"success"
}
} catch (PayPalRESTException e) {
log
.error (e
.getMessage ())
}
return
"redirect:/"
}
}
(6)PaypalService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package
com .masasdani .paypal .service
import java
.util .ArrayList
import java
.util .List
import org
.springframework .beans .factory .annotation .Autowired
import org
.springframework .stereotype .Service
import
com .masasdani .paypal .config .PaypalPaymentIntent
import
com .masasdani .paypal .config .PaypalPaymentMethod
import
com .paypal .api .payments .Amount
import
com .paypal .api .payments .Payer
import
com .paypal .api .payments .Payment
import
com .paypal .api .payments .PaymentExecution
import
com .paypal .api .payments .RedirectUrls
import
com .paypal .api .payments .Transaction
import
com .paypal .base .rest .APIContext
import
com .paypal .base .rest .PayPalRESTException
@Service
public class PaypalService {
@Autowired
private APIContext apiContext
public Payment createPayment(
Double total,
String currency,
PaypalPaymentMethod method,
PaypalPaymentIntent intent,
String description,
String cancelUrl,
String successUrl) throws PayPalRESTException{
Amount amount = new Amount()
amount
.setCurrency (currency)
amount
.setTotal (String
.format (
"%.2f" , total))
Transaction transaction = new Transaction()
transaction
.setDescription (description)
transaction
.setAmount (amount)
List<Transaction> transactions = new ArrayList<>()
transactions
.add (transaction)
Payer payer = new Payer()
payer
.setPaymentMethod (method
.toString ())
Payment payment = new Payment()
payment
.setIntent (intent
.toString ())
payment
.setPayer (payer)
payment
.setTransactions (transactions)
RedirectUrls redirectUrls = new RedirectUrls()
redirectUrls
.setCancelUrl (cancelUrl)
redirectUrls
.setReturnUrl (successUrl)
payment
.setRedirectUrls (redirectUrls)
return payment
.create (apiContext)
}
public Payment executePayment(String paymentId, String payerId) throws PayPalRESTException{
Payment payment = new Payment()
payment
.setId (paymentId)
PaymentExecution paymentExecute = new PaymentExecution()
paymentExecute
.setPayerId (payerId)
return payment
.execute (apiContext, paymentExecute)
}
}
(7)URLUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package
com .masasdani .paypal .util
import javax
.servlet .http .HttpServletRequest
public class URLUtils {
public static String getBaseURl(HttpServletRequest request) {
String scheme = request
.getScheme ()
String serverName = request
.getServerName ()
int serverPort = request
.getServerPort ()
String contextPath = request
.getContextPath ()
StringBuffer url = new StringBuffer()
url
.append (scheme)
.append (
"://" )
.append (serverName)
if ((serverPort !=
80 ) && (serverPort !=
443 )) {
url
.append (
":" )
.append (serverPort)
}
url
.append (contextPath)
if(url
.toString ()
.endsWith (
"/" )){
url
.append (
"/" )
}
return url
.toString ()
}
}
(8)cancel.html
<!DOCTYPE html>
<html >
<head >
<meta charset ="UTF-8" />
<title > Insert title here
</title >
</head >
<body >
<h1 > Canceled by user
</h1 >
</body >
</html >
(9)index.html
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html >
<head >
<meta charset ="UTF-8" />
<title > Insert title here
</title >
</head >
<body >
<form method ="post" th:action ="@{/pay}" >
<button type ="submit" > <img src ="images/paypal.jpg" width ="100px;" height ="30px;" /> </button >
</form >
</body >
</html >
(10)success.html
<!DOCTYPE html>
<html >
<head >
<meta charset ="UTF-8" />
<title > Insert title here
</title >
</head >
<body >
<h1 > Payment Success
</h1 >
</body >
</html >
(11)最重要的!application.properties,paypal.client.app是App的CilentID, paypal.client.secret是Secret
server.port: 8088
spring
.thymeleaf .cache =false
paypal
.mode =sandbox
paypal
.client .app =AeVqmY_pxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKYniPwzfL1jGR
paypal
.client .secret =ELibZhExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUsWOA_-
(2)在瀏覽器輸入localhost:8088
(3)點擊paypal後,會跳到paypal的登陸界面,登陸測試帳號(PRESONAL)後點擊繼續便可扣費,扣500$(具體數額可在controller中自定義)
Payment payment = paypalService
.createPayment (
500.00 ,
"USD" ,
PaypalPaymentMethod
.paypal ,
PaypalPaymentIntent
.sale ,
"payment description" ,
cancelUrl,
successUrl)
(4)到https://www.sandbox.paypal.com 登陸測試帳號看看餘額有沒有變化