根據規格書的說明,每次呼叫api前都要先取得Nonce
要取得Nonce也滿簡單的,就是以POST方法傳送你的ShopNo(當初報名取得api後有另外寄信提供)
程式的部分我想要以OkHttp來進行連線
加dependcy
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
之前用的都是apache的Httpclient,這次來用用看OkHttp
建立一個HttpUtil的工具類別
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class HttpUtil {
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json,JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
}
先建一個post的方法,其他要用到什麼可以之後再補
參考來源okhttp的範例
接著在我的專案的Application.java
加入以下bean做個小測試
@Bean
CommandLineRunner runner(UserRepo userDao){
return args -> {
HttpUtil util = new HttpUtil();
Map<String,String> map = new HashMap<String,String>();
map.put("ShopNo", "BA0026_001");
String json =new ObjectMapper().writeValueAsString(map);
String res=util.post("https://sandbox.sinopac.com/QPay.WebAPI/api/Nonce", json);
System.out.println(res);
};
}
執行時遇到了PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
的錯誤,也是java開發者常常遇到的Exception
這是因為我們的jdk的憑證庫沒有匯入這個我們要連線的網址的憑證,導致連線失敗
解決方法也很簡單,用chrome連線,點鎖頭下載.der格式的憑證
只要把憑證匯入jdk中的憑證庫就行了
在測試環境我會直接以root憑證匯入,一來時效較長、二來只要是由同個機構簽發憑證的網站就也不用再重匯,比較方便
在你目前使用的jdk的bin會有個keytool,
以cmd下指令:
D:\java\jdk-11.0.11\bin>keytool -importcert -file C:\Users\user\Downloads\twca.cer -keystore D:\java\jdk-11.0.11\lib\security/cacerts -alias TWCA_ROOT
輸入密碼(預設是changeit)後按y確認
就完成了
再試一次就成功囉
程式實作的部分我合併寫在
[Day 15] - 初探永豐銀行線上收款API - 豐收款 - HASH ID計算(2) +IV計算