アフィリエイト広告を利用しています

2018年10月30日

GMOペイメントカード決済Fトークン決済1

GMOペイメントのカード決済を使用中。

12月中旬よりトークン決済方式に切り替えられ、

カード番号をそのまま送信しても受け付けてもらえなくなるそうだ。

カード決済ページを作成できなくなると困るので、

トークン方式にチャレンジしてみた。


これまでのシステムをどう修正してよいのか分からないので、

トークン方式の説明書内のサンプルプログラムを見る。

Javascriptでカード番号、決済の種類、支払い回数などの情報を

セットにしてトークン化している。

そして、そのトークンをフォームに埋め込み、POSTしている。


<html>
<head>
<script src="https://pt01.mul-pay.jp/ext/js/token.js" ></script>
</head>
<body>
<!-- カード情報トークン化フォーム -->
<form id="getTokenForm">
<p>カード番号:<input type="text" value="" name="cardno" id="cardno" /></p>
<p>カード有効期限:<input type="text" value="" name="expire_year" id="expire_year" />
<input type="text" value="" name="expire_month" id="expire_month" />
</p>
<p>カード名義人:<input type="text" value="" name="holdername" id="holdername" /></p>
<p>セキュリティコード:<input type="text" value="" name="securitycode" id="securitycode" /></p>
<p>発行数:<input type="text" value="" name="tokennumber" id= "tokennumber" /></p>
<p><input type="button" value="購入する" onclick="doPurchase()" /></p>
</form>
<!-- 加盟店購入フォーム -->
<form id="purchaseForm" action="(加盟店様 URL)" method="post">
<p>
<input type="hidden" value="" name="kameitenn_chumon_bango" /> <!-- 加盟店での注文番号等、決済を特定できる情報 -->
<input type="hidden" value="" id="token" name="token" /> <!-- 取得したトークンを設定するプレースホルダ -->
</p>
</form>



<script type="text/javascript">
function execPurchase(response) {
if (response.resultCode != "000") {
window.alert("購入処理中にエラーが発生しました");
} else {
// カード情報は念のため値を除去
document.getElementById("cardno").value = "";
document.getElementById("expire_year").value = "";
document.getElementById("expire_month").value = "";
document.getElementById("securitycode").value = "";
document.getElementById("tokennumber").value = "";
// 予め購入フォームに用意した token フィールドに、値を設定
document.getElementById("token").value = response.tokenObject.token;

// スクリプトからフォームを submit
document.getElementById("purchaseForm").submit();

}
}

function doPurchase() {
var cardno, expire, securitycode, holdername;
var cardno = document.getElementById("cardno").value;
var expire = document.getElementById("expire_year").value + document.getElementById("expire_month").value;
var securitycode = document.getElementById("securitycode").value;
var holdername = document.getElementById("holdername").value;
var tokennumber = document.getElementById("tokennumber").value;
Multipayment.init("tshop00000001");
Multipayment.getToken({
cardno : cardno,
expire : expire,
securitycode : securitycode,
holdername : holdername,
tokennumber : tokennumber
}, execPurchase);
}
</script>
</body>
</html>


ポイント

formが二つある。
form id="purchaseForm"からサブミットしている。

流れ


cardno、expire、securitycode、holdername、holdername、tokennumberを
関数doPurchase()でトークン化し、その値を関数execPurchase()に渡す。

関数execPurchase()でトークン値をform id="purchaseForm"に書き込んだ後、
purchaseFormからサブミットしている。


こんなことしました。


支払い方法、支払い回数などはform id="purchaseForm"にhiddenで埋め込んだ。

ここに引っ掛かりました。


入力用テキストボックスのIDは CardNo、Expire、SecurityCode としていた。
サンプルプログラムはcardno、expire、securitycode なので変更の必要なしと早合点してしまった。
大文字と小文字は別物なので、どちらに揃えるか決めて最初に対応するべきだった。


とりかかってからカード決済に成功するまでに4時間。

何度もエラーになり、途中で投げ出そうかとも思った。

決済できたときはうれしかった。











この記事へのコメント
意味を取り違えていたらご免なさい。

フォームpurchaseFormの中に以下のhidden構文があります。

<input type="hidden" value="" id="Token" name="Token" />

Javascriptの関数 execPurchase()とdoPurchase()によって、構文中のvalueにトークンが埋め込まれますので、任意のコントローラー側にPOST値として引き渡せると思います。(言語がphpであれば、$_POST['Token']で確認できるはずです。)
Posted by ブログ管理者 at 2020年11月27日 09:10
すみません。
今、GMOのトークンを取得する実装をやっていて、教えていただきたいのですが、
action="(加盟店様 URL)     ←これを任意の コントローラーのメソッドを指定して、カード決済用のAPIに投げようと思うのですがトークンの取得方法がわかりません。どの様に記述しましたでしょうか。







Posted by sen at 2020年11月26日 21:00
> この実装の場合購入時に毎回カード番号入力して決済する感じですかね?
はい、そうです。イベントへの参加料金支払いに使用します。
同じ人が二度支払いを行うことは考慮していません。
Posted by at 2019年01月03日 18:17
正月からすみません。。
ここ自分もはまってしまっていて、
トークンを使ったカード登録はできたのですが
決済時にトークンはどうやって生成するかわからずでして

この実装の場合購入時に毎回カード番号入力して決済する感じですかね?
2回目はどうしてますか?
もしわかったら教えてくださいm
Posted by at 2019年01月01日 18:55
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

検索
最新記事
カテゴリーアーカイブ
プロフィール
db-engineerさんの画像
db-engineer
プロフィール
タグクラウド