PAY.JPでクレジット決済機能を実装する【Java】

#概要#
PAY.JPという決済代行をしてくれるサービスが提供しているWebAPIを使ってクレジットカード決済機能を実装してみました。
このAPIを使うと、入力したカード情報をトークン化してPAY.JPに送り、その送られてきたトークンをもとにPAY.JPが決済代行をしてくれるそうです。

開発環境はJava/Mavenです。

#PAY.JPのアカウント作成#
[公式サイト](https://pay.jp/)にアクセスして「申し込む」をクリックし、アカウントを作成します。
![pic1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521820/99bb70fa-d2db-e97f-9ad9-60103ed91c6d.jpeg)

登録後、ログインして左の「API」よりAPIキーを確認します。

![pic3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521820/267c27da-cbc7-2a0e-8144-ff69dffaafa8.jpeg)

#pom.xmlに追加#
以下をpom.xmlに追加します。

```
<dependency>
　　<groupId>jp.pay</groupId>
  	<artifactId>payjp-java</artifactId>
 	<version>0.4.4</version>
</dependency>　　
```

#Viewの作成#
今回は入力した金額をカードで支払う機能を実装します。

```test.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>支払い</title>
</head>
<body>
<form th:action="@{/pay}" method="post">
支払金額(円)<br>
<input type="text" name="price"><br>
カード情報<br>
<script
	type="text/javascript"
	src="https://checkout.pay.jp/"
	class="payjp-button"
	data-key="pk_test_xxxxxxx"
	data-partial="true"
	data-token-name="card"   
></script>
<br>
<button>支払う</button>
</form>
</body>
</html>
```
![pic4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521820/95c7ab2b-acbe-3964-096a-60fa4fc127f3.jpeg)

scriptタブを挿入するとカード情報を入力するフォームを作成することができます。
data-keyに先ほど確認したAPIキーの公開鍵を入力します。今回はテストキーを使用しています。本番環境を利用するには申請がいるみたいです。

このscriptタブは```<input type="hidden" name="card">```と同じ役割をしており、入力されたカード情報はトークン化されて送られます。
また今回は、data-token-name="card"によって、name="card"に変更しています。デフォルトの状態は、name="payjp-token"です。
[こちらのガイド](https://pay.jp/docs/checkout)に入力フォームの詳しいカスタマイズ方法が載っているので、参考にしてみてください。

#Controllerの作成#
基本は公式で公開されているGitHubに載っているコードのコピペです。[pay-jp/GitHub](https://github.com/payjp/payjp-java)

Payjp.apiKeyに秘密鍵をセットし、chargeMapに支払金額、日本円、カード情報をセットしています。

```testController.java
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.pay.Payjp;
import jp.pay.model.Charge;
import jp.pay.net.RequestOptions;

@Controller
@RequestMapping("")
public class testController {
	
	@RequestMapping("/")
	public String index() {
		return "test";
	}
	
    /**pay.jpを通じてクレジット決済をするメソッド
	 * @param price　支払金額
	 * @param card　トークン化されたカード情報
	 */
	@RequestMapping("/pay")
	public String creditPay(int price, String card) {

		Payjp.apiKey = "sk_test_xxxxxxxxxxxxx";

        Map<String, Object> chargeMap = new HashMap<String, Object>();
        chargeMap.put("amount", price);//支払金額をセット
        chargeMap.put("currency", "jpy");//日本円をセット
        chargeMap.put("card", card);//カード情報をセット
        try {
            Charge charge = Charge.create(chargeMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return "complete";//決済完了画面
	}

}
```

#実行#
それでは、実際に動かしてみます。
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521820/20f26311-9cbe-a97b-d75d-608dcdfe43fa.gif)


無事に動かすことができました。

今回はテスト環境のため、カード番号はテスト用の番号です。テスト環境ではカード番号のみ有効性チェックを行っています。

また、先ほどの管理者ページを見てみると売上金が反映されています。
![pic5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521820/cde820df-1e2e-6305-037e-8e957162b99b.jpeg)


最後までご覧いただきありがとうございました。
初めての投稿ですので、間違いなどあったらご指摘いただけると幸いです！





#参考資料#
[pay-jp/checkout](https://pay.jp/docs/checkout)
[pay-jp/GitHub](https://github.com/payjp/payjp-java)