SpringBoot整合銀聯支付
1.首先在銀聯開發者平台注冊銀聯賬號:https://open.unionpay.com/tjweb/index
2.在業務合作點擊在線網關支付

3.下載官方SDK&Demo

4.解壓開發包(密碼:我已閱讀上述聲明,充分知曉風險)打開Java Version SDK (通用版)
5.在src文件中找到acp_sdk.properties文件復制到工程resources下

6.在項目pom.xml文件中添加如下依賴
<!-- 網銀支付 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>
7.把官方Demo里面的sdk文件夾里面的全部復制到自己的工程中來還要把demo文件夾里面的DemoBase類也要復制進來(有報錯的自己導包即可)

8.在官方網站在線網關支付中點擊我要測試進入商戶入網測試中心,點擊測試參數下載測試證書5.1.0(四個證書全部都要下載)

9.在自己電腦的D盤中創建文件certs把下載的證書復制進去(有壓縮包解壓出來)

這里為什么要在自己的電腦的D盤中創建這個文件呢?因為在官方的配置文件中,明確的標明了要在這個盤符中找證書,如果不想在D盤也可以自己更改,更改的位置就在acp_sdk.properties這個文件中

11.現在我們要在工程中讀取這個配置文件,只需要調用SDKConfig類中的loadPropertiesFromSrc()方法並加入到spring容器里面(具體代碼如下)
package com.yinlian.constants;
import com.yinlian.sdk.SDKConfig;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @author 鑫
* @Date 2021/3/27 0027 16:48
*/
@Component
public class InitPay implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
SDKConfig.getConfig().loadPropertiesFromSrc();
}
}
12.編寫service層
package com.yinlian.service;
/**
* @author 鑫
* @Date 2021/3/27 0027 16:58
*/
public interface PayService {
String pay();
}
13.現在寫業務層,詳情可以參考官方Form_6_2_FrontConsume類(我已經給你們整理了,如其他業務需求,可以在此基礎上添加你的業務需求)
package com.yinlian.service.impl;
import com.yinlian.sdk.AcpService;
import com.yinlian.sdk.DemoBase;
import com.yinlian.sdk.SDKConfig;
import com.yinlian.service.PayService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author 鑫
* @Date 2021/3/27 0027 16:58
*/
@Service
public class PayServiceImpl implements PayService {
@Override
public String pay() {
Map<String, String> requestData = new HashMap<String, String>();
/***銀聯全渠道系統,產品參數,除了encoding自行選擇外其他不需修改***/
requestData.put("version", DemoBase.version); //版本號,全渠道默認值
requestData.put("encoding", DemoBase.encoding); //字符集編碼,可以使用UTF-8,GBK兩種方式
requestData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //簽名方法
requestData.put("txnType", "01"); //交易類型 ,01:消費
requestData.put("txnSubType", "01"); //交易子類型, 01:自助消費
requestData.put("bizType", "000201"); //業務類型,B2C網關支付,手機wap支付
requestData.put("channelType", "07"); //渠道類型,這個字段區分B2C網關支付和手機wap支付;07:PC,平板 08:手機
/***商戶接入參數***/
requestData.put("merId", "777290058190039"); //商戶號碼,請改成自己申請的正式商戶號或者open上注冊得來的777測試商戶號
requestData.put("accessType", "0"); //接入類型,0:直連商戶
requestData.put("orderId", getUUID()); //商戶訂單號,8-40位數字字母,不能含“-”或“_”,可以自行定制規則
requestData.put("txnTime", DemoBase.getCurrentTime()); //訂單發送時間,取系統時間,格式為yyyyMMddHHmmss,必須取當前時間,否則會報txnTime無效
requestData.put("currencyCode", "156"); //交易幣種(境內商戶一般是156 人民幣)
requestData.put("txnAmt", "10000"); //交易金額,單位分,不要帶小數點
requestData.put("riskRateInfo", "{commodityName=測試商品名稱}");
//前台通知地址 (需設置為外網能訪問 http https均可),支付成功后的頁面 點擊“返回商戶”按鈕的時候將異步通知報文post到該地址
//如果想要實現過幾秒中自動跳轉回商戶頁面權限,需聯系銀聯業務申請開通自動返回商戶權限
//異步通知參數詳見open.unionpay.com幫助中心 下載 產品接口規范 網關支付產品接口規范 消費交易 商戶通知
requestData.put("frontUrl", DemoBase.frontUrl);
//后台通知地址(需設置為【外網】能訪問 http https均可),支付成功后銀聯會自動將異步通知報文post到商戶上送的該地址,失敗的交易銀聯不會發送后台通知
//后台通知參數詳見open.unionpay.com幫助中心 下載 產品接口規范 網關支付產品接口規范 消費交易 商戶通知
//注意:1.需設置為外網能訪問,否則收不到通知 2.http https均可 3.收單后台通知后需要10秒內返回http200或302狀態碼
// 4.如果銀聯通知服務器發送通知后10秒內未收到返回狀態碼或者應答碼非http200,那么銀聯會間隔一段時間再次發送。總共發送5次,每次的間隔時間為0,1,2,4分鍾。
// 5.后台通知地址如果上送了帶有?的參數,例如:http://abc/web?a=b&c=d 在后台通知處理程序驗證簽名之前需要編寫邏輯將這些字段去掉再驗簽,否則將會驗簽失敗
requestData.put("backUrl", DemoBase.backUrl);
/**請求參數設置完畢,以下對請求參數進行簽名並生成html表單,將表單寫入瀏覽器跳轉打開銀聯頁面**/
Map<String, String> submitFromData = AcpService.sign(requestData,DemoBase.encoding); //報文中certId,signature的值是在signData方法中獲取並自動賦值的,只要證書配置正確即可。
String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl(); //獲取請求銀聯的前台地址:對應屬性文件acp_sdk.properties文件中的acpsdk.frontTransUrl
String html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding); //生成自動跳轉的Html表單
return html;
}
public static String getUUID(){
//隨機生成一位整數
int random = (int) (Math.random()*9+1);
String valueOf = String.valueOf(random);
//生成uuid的hashCode值
int hashCode = UUID.randomUUID().toString().hashCode();
//可能為負數
if(hashCode<0){
hashCode = -hashCode;
}
String value = valueOf + String.format("%015d", hashCode);
System.out.println(value);
return value;
}
}
14.編寫controller層,啟動項目
package com.yinlian.controller;
import com.yinlian.service.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 鑫
* @Date 2021/3/27 0027 16:56
*/
@RestController
public class PayController {
@Autowired
private PayService payService;
@RequestMapping("/pay")
public String pay(){
String pay = payService.pay();
return pay;
}
}
注意:這里需要使用到外網才可以,所以小編在這里使用了內網穿透:https://www.ngrok.cc/(具體教程官網里面有)
注意:如果啟動報權限不足的錯誤可能是因為你的測試環境沒有啟動在產品列表開啟測試


注意這里卡號在你的商戶入網測試中心的測試參數里面有,短信驗證碼什么的參數都有自己去復制即可


這里支付完成之后返回商戶可以是自己定義的頁面,只需要在配置文件中加入自己要跳轉的頁面即可(必須外網可以訪問才行,要不然不能跳轉到自己定義的頁面)


