前回までの状況はこちら
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/hotel-mng
さて、まずはユーザー登録時にクレジット情報を登録するようにしましょうか。
本来ならば、SSL通信によって、暗号化した状態でデータを送信しなくちゃいけないのですが、今はローカル環境でテスト用に動かしているので、そこら辺は考慮しないことにします。
考慮する場合は、NginxなどのWebサーバの設定が必要になります。
こちら、自前のクラウドサーバをHTTPSに対応した記事が参考になると思います。
それではコーディングしていきます。
やっていることは、以前にも書いた、usersテーブルにカラムを追加していく、ということです。
まずはマイグレーションの記述。
class AddCreditInfoUsers extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('credit_number')->after('phone');
$table->string('mm')->after('credit_number');
$table->string('yy')->after('mm');
$table->string('credit_name')->after('yy');
$table->string('code')->after('credit_name');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('credit_number');
$table->dropColumn('mm');
$table->dropColumn('yy');
$table->dropColumn('credit_name');
$table->dropColumn('code');
});
}
}
ビューの記述。
<div class="form-group{{ $errors->has('credit') ? ' has-error' : '' }}">
<label for="credit" class="col-md-4 control-label">credit number</label>
<div class="col-md-6">
<input id="credit" type="credit" class="form-control" name="credit" required>
@if ($errors->has('credit'))
<span class="help-block">
<strong>{{ $errors->first('credit') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<label for="mmyy" class="col-md-4 control-label">MM / YY</label>
<div class="col-md-6">
<select name="mm">
<option value="1">01</option>
<option value="2">02</option>
<option value="3">03</option>
<option value="4">04</option>
<option value="5">05</option>
<option value="6">06</option>
<option value="7">07</option>
<option value="8">08</option>
<option value="9">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
/
{{Form::selectYear('yy', 2020, 2030)}}
</div>
</div>
<div class="form-group{{ $errors->has('credit_name') ? ' has-error' : '' }}">
<label for="credit_name" class="col-md-4 control-label">credit name</label>
<div class="col-md-6">
<input id="credit_name" type="credit_name" class="form-control" name="credit_name" required>
@if ($errors->has('credit_name'))
<span class="help-block">
<strong>{{ $errors->first('credit_name') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('code') ? ' has-error' : '' }}">
<label for="code" class="col-md-4 control-label">security code</label>
<div class="col-md-6">
<input id="code" type="code" class="form-control" name="code" required>
@if ($errors->has('code'))
<span class="help-block">
<strong>{{ $errors->first('code') }}</strong>
</span>
@endif
</div>
</div>
入力項目に、クレジット番号、有効期限(MM/YY)、名義、セキュリティコードを追加しました。
バリデーション処理です。
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'fullname' => 'required|string|max:255',
'address' => 'required|string|max:255',
'phone' => 'required|digits:11',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'credit' => 'required|digits:16',
'mm' => 'required|numeric',
'yy' => 'required|numeric',
'credit_name' => 'required|string|max:255',
'code' => 'required|digits:3',
]);
}
登録処理です。
protected $fillable = [
'name', 'fullname', 'address', 'phone', 'email', 'password', 'credit_number', 'mm', 'yy', 'credit_name', 'code'
];
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'fullname' => $data['fullname'],
'address' => $data['address'],
'phone' => $data['phone'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'credit_number' => encrypt($data['credit']),
'mm' => $data['mm'],
'yy' => $data['yy'],
'credit_name' => encrypt($data['credit_name']),
'code' => encrypt($data['code'])
]);
}
クレジット番号、名義、セキュリティコードは機密性が高いため、encrypt()(※2020/2/5訂正)で暗号化してわからない形でデータベースに保存します。
※bcrypt()では、復号化できないようです。後ほどこの情報を使って自動決済する必要がありますので、復号化できないと困ります。
うまくできました。