ノラプログラマーの技術メモ

ネットで調べても出てこなかった情報を載せていきたい技術系ブログ。

Apple WatchでPayPay(ペイペイ)がスキャンできない問題を解決した

paypayスキャンできない問題

Apple WatchにPayPay(ペイペイ)アプリを入れて、コンビニやドラッグストアでバーコード(もしくはQRコード)を提示するも、スキャンできず読み取れないことがあって困る。

50%くらいの確率でたまにうまくスキャンできるのだが、不便で悩みのタネだった。

原因は画面の明るさだった!

Apple Watchの充電を減らしたくないあまり、画面を一番暗く設定していたのだが、これがダメだった。

Apple Watchの画面を標準(もしくは一番明るい)に変更したら、PayPayがスムーズにスキャンできた。

Apple Watchの[設定]から[画面表示と明るさ]を選択する。

f:id:kawai_norimitsu:20201006151343p:plain

続いて[明るさ]を標準か、一番明るく設定すれば完了!

f:id:kawai_norimitsu:20201006151434p:plain

これでレジでの支払い時に、Apple Watchをスッと出して、PayPay(ペイペイ)が100%スムーズに読み取れるようになった。

f:id:kawai_norimitsu:20201006151656p:plain

ちなみにコンビニのバーコードリーダーではバーコード形式で、ドラッグストアや郵便局などの端末ではQRコード形式でスキャンできるようになる。すごい快適!

PayPayの開発者向けAPIをPHPで実装してみた(サンプルあり)

PayPayのAPIを実装

PayPay for DevelopersにてPaypayのオープンAPIが提供された。なのでPHPAPIサンプルコードを書いてみた。

事前にPayPay for Developersに登録して「APIキー」と「シークレットキー」を取得しておくこと。

あとサーバーにコンソールでログインし、composerコマンド「composer require paypayopa/php-sdk」でSDKをインストールしておくこと。

開発環境

・Xserver
・PHP7 以上(PHP5は不可)
・Paypay SDK 0.7.2 以上 ← 重要!

PHPサンプルソース

	//-------------------------------------
	// SDK環境設定
	//-------------------------------------
	require __DIR__ . '/vendor/autoload.php';
	use PayPay\OpenPaymentAPI\Client;
	use PayPay\OpenPaymentAPI\Models\OrderItem;
	use PayPay\OpenPaymentAPI\Models\CreateQrCodePayload;

	//-------------------------------------
	// クライアントをビルドする(テスト環境)
	//-------------------------------------
	$client = new Client([
		'API_KEY' => '「APIキー」',
		'API_SECRET'=>'「シークレットキー」',
		'MERCHANT_ID'=>'「マーチャントID」'
	], false);
	var_dump($client);

	//-------------------------------------
	// 商品情報を生成する
	//-------------------------------------
	$items = (new OrderItem())
        ->setName('item name A')
        ->setQuantity(1)
        ->setUnitPrice(['amount' => 500, 'currency' => 'JPY']);

	//-------------------------------------
	// QRコードを生成する
	//-------------------------------------
	$payload = new CreateQrCodePayload();
	$payload->setOrderItems($items);
	$payload->setMerchantPaymentId("mpid_".rand());	// 同じidを使いまわさないこと!
	$payload->setCodeType("ORDER_QR");
	$payload->setAmount(["amount" => 500, "currency" => "JPY"]);
	$payload->setRedirectType('WEB_LINK');
	$payload->setIsAuthorization(false);
	$payload->setRedirectUrl('https://paypay.ne.jp/');
	$payload->setUserAgent($_SERVER['HTTP_USER_AGENT']);
	$QRCodeResponse = $client->code->createQRCode($payload);
	if($QRCodeResponse['resultInfo']['code'] !== 'SUCCESS') {
		echo("QRコード生成エラー");
		return;
	}
	$merchantPaymentId = $QRCodeResponse['data']['merchantPaymentId'];
	var_dump($QRCodeResponse);

	//-------------------------------------
	// 決済情報を取得する
	//-------------------------------------
	$QRCodeDetails = $client->payment->getPaymentDetails($merchantPaymentId);
	if($QRCodeDetails['resultInfo']['code'] !== 'SUCCESS') {
		echo("決済情報取得エラー");
		return;
	}
	var_dump($QRCodeDetails);

実行結果

f:id:kawai_norimitsu:20200906171145j:plain

$QRCodeResponse['data']['url'] から得られるアドレスにアクセスしてみると、paypayの決済画面が表示されます。

以上お疲れ様でしたー

追記

PaypaySDKのバージョンが0.7.0以下のものはバグがあり、安定して接続できない。最新のバージョンを使おう。

またMerchant Payment Idは使いまわさないこと。同じIDで2度目の取引をしようとするとエラーが表示されるため。

なお本番環境では、Client関数の引数をtrueに設定し、APIキーとシークレットキー、マーチャントIDを本番環境のものに置き換える。

更にpaypay事務局に連絡して、IPアドレスホワイトリストを登録してもらう必要がある。(これで本番環境でもQRコードが払い出された)

上記に漏れがあると、{"resultInfo":{"code":"UNAUTHORIZED","message":"Unauthorized request","codeId":"08100016"}のようなエラーが表示されるので注意。

給与計算における税金と保険の基礎知識

源泉所得税(国)

所得税と復興特別所得税からなり、個人の所得に対して課税される。
国税庁のホームページに掲載されている源泉徴収税額表から計算し、支給月の給与から反映する。
※給与の総支給額から社会保険料(健康保険、厚生年金)を差し引いた額で計算する

社会保険(国)

健康保険と厚生年金保険からなり、一定の要件を満たす労働者は加入する義務がある。
保険料は事業主と労働者で折半する。
6月中に算定基礎届が送られてくるので、4~6月に支払った給与を記入し届け出ると、標準報酬月額が決定する。
全国健康保険協会協会けんぽ)のホームページに掲載されている保険料額表と標準報酬月額から計算し、9月から翌年8月までの給与に反映する。

住民税(地方)

1月1日に現住所がある市町村において、前年度の所得に対して課税される。
市町村にて税額が計算され、5月中旬に税額通知書が送られてくる。
6月から翌年5月までの給与に反映する。

労働保険(国)

労災保険雇用保険からなり、労働者を一人でも雇用していれば、加入する義務がある。
労災保険料は全額事業主負担、雇用保険料は事業主と労働者で負担する。
厚生労働省のホームページに掲載されている雇用保険料率から計算し、支給月の給与から反映する。
6月上旬に申告書が送られてくるので、7月10日までに申告・納付する。

ピアス隠しファンデーションテープを使ってみた【写真あり】

f:id:kawai_norimitsu:20200327135831j:plain

ファンデーションテープを使って、ピアス穴を隠してみた

ピアスの隠し方にはいろいろあるけど、なかでもファンデーションテープを使った方法をご紹介します。

ちなみにピアス穴は完成しているけど、開けたばかり(ファーストピアス)でもこの方法が使えるかなと思います。

用意するもの

1.透明ピアス

f:id:kawai_norimitsu:20200327140332j:plain

写真は「シークレットピアス リメイン 医療用樹脂製」という商品で890円。透ピなら何でもOKです。

2.ニッパー

f:id:kawai_norimitsu:20200327140416j:plain

100均で買ったニッパー。なければ爪切りでも大丈夫。ただし雑菌がついているかも知れないので、しっかり除菌すること!

3.ファンデーションテープ

f:id:kawai_norimitsu:20200327140508j:plain

ログインマイライフのファンデーションテープ。傷跡用の丸型。5色入った色合わせセット590円がオススメ。

透明ピアスをニッパーで切る

f:id:kawai_norimitsu:20200327140753j:plain

耳たぶの厚さにあわせて、透ピをニッパーで切ります。あとでシールで固定するので、後ろの留め具は使いません。

透明ピアスをピアスホールに入れる

f:id:kawai_norimitsu:20200327141158j:plain

棒の部分を切った透明ピアスを穴に入れてみます。ちゃんと手を洗って清潔な状態にしましょう。この状態だと、まだまだ不自然で目立ちます。

ピアスの上からファンデーションテープを貼る

f:id:kawai_norimitsu:20200327141636j:plain

透明ピアスの上からファンデーションテープを貼ります。するとめちゃくちゃ目立ちません!実際にアルバイトの面接でもバレませんでした。

以上、「ピアス隠しファンデーションテープを使ってみた」でした!

最後までお読みいただき、ありがとうございました。

アドラー心理学のメモ書き

★根本理論
・人は、さまざまの事情(内的にはライフスタイル、外的には人間関係)を勘案しながらではあるが、最終的には仮想的目標に向かって主体的に行為を選択する。結局、なにもかも自分で決めている(個人の主体性)。どんな事情があっても、個人が決断すれば変えられる。不適切な行動を続けるというのは、続けようと決心しているからであって、「変えられない」わけではまったくない。
・これだけだと、人間は幸福になれない。なぜなら「悪事」を主体的に決断して行為することもできて、そんなことをすると、周囲の人を不幸にし、それは跳ね返って自分を不幸にするからだ。
・幸福への道は、自分とは意見の違う他者とでも、どういう点でなら協力できるかを考え、それについて話し合って「目標の一致」を確保し、力を合わせて問題を解決することだ。

★公式
・勇気づけ
・ライフスタイル
・葛藤解決
・協力関係の構築(共同体感覚)/共同体にとって破壊的である場合は相容れない

★守備範囲
アドラー心理学が解決できる問題は、言語コミュニケーションによる直接的人間関係のみ。「人間の悩みは、すべて対人関係の悩みである」

★劣等感とその補償の原理(理論)
・環境の中に、なにであれ自分にとって不利な出来事を見つけだすと、人は劣等感を感じ、それを補償するために行為する。心の中に仮想的目標を想定して、それに向かって行為する。その仮想的目標は、私的感覚という価値観にもとづいて設定される。

★仮想的目標
・生命の維持、種族の保存(動物的、低次元)
・共同体への所属(人間的、高次元)

★健康なパーソナリティ
・自分の人生を自分で選べる(ただし破壊的な選択肢は選べない)
・怒り、悲しみ、恐れがない
・理想と現実をハッキリ区別できている
・共同体感覚を持っている(協力的である)

★ライフスタイル
・ライフスタイルはその人なりの問題解決パターン。子ども時代に、わずかな経験をもとに作られ、およそ10歳までに固定する。つまり人間はみな、怒ったり泣いたりすねたりして解決するなど、子どもっぽい。理性的に言葉で解決するなど、より便利な解決パターンがある。

★適切なライフスタイル
・私に何ができるか考える(人を変えようとしない)
・すべきことをし、すべきでないことをしない(人間的)
・言葉で解決しようとする

★不適切なライフスタイル
・悪いあの人、かわいそうな私(周りの人は私を保護すべき)
・したいことをし、したくないことをしない(動物的)
・感情で解決しようとする

★競合と協力の原理(思想)
・主観的な価値について、誰が上だ、誰が下だと争うことが、人類の不幸の根本原因だ。だから、競合的に争うことをやめて、協力的に暮らすことにすれば、人類の不幸は解決する。「いま起こっていることはみんなにとってどういうことだろう。みんなが幸福になるために私は何をすればいいだろう」と、みんなが考えるようになることだ。

★ピンポン効果
・ある事件があって、「所属できていない」と感じて行動すると、劣等の位置を過補償して、結果的に相手よりも上に立つことになってしまう。そうすると、相手が「所属できていない」と感じて劣等の位置に落ち、それを過補償して優越の位置に立とうとするので、こちらが劣等の位置に落とされてしまう。このゲームはずっと続く。

★縦の関係
・相手と自分とどちらが上であるかを争って、課題の解決を忘れること。

★横の関係
・相手と自分と両者が協力して、課題の解決にあたること。

★勇気づけ
・その人が、その人の日常生活における課題を解決するよう援助すること。

★勇気くじき
・相手の劣等性を指摘し、課題を解決しようとする自信を失わせること。

★パーソナル・ストレングス
・動物は本能的に環境の中のプラスの要素を放置して、マイナスの要素を探し出すように作られている。プラスの要素は放置しておいても問題は起こらないだろうけれど、マイナスの要素は対処しないと身に危険が及ぶかもしれないからだ。
・だから、相手の短所や欠点は本能的に見える。これは動物レベルの働きであり、「きたない心」だ。そこで意識して、相手の長所や貢献を見るようにする。そうすると人間レベルの「きれいな心」になる。

JPGやPNGのサムネイルを表示するPHPプログラムのサンプル(GDライブラリを使用)

JPGやPNG形式の画像をサムネイル表示するPHPプログラムを作ったのでその記録。

画像処理にはGDライブラリを使用するので、GDが使用可能かどうかを事前に調べておく。

適当なファイル(例:info.php)を作って、下記の内容を書き込む。

<?php
    phpinfo();
?>

適当なファイル(例:info.php)をサーバーにアップロードして、ブラウザからアクセスする。

するとPHPの設定が表示されるので、GDの項目が「enable」になっていることを確認する。

f:id:kawai_norimitsu:20190827092009p:plain

「enable」になっていない場合は、自力でぐぐってGDライブラリをインストールしておくこと。

さて、サムネイルを表示するPHPのサンプル(例:thumbnail.php)は次の通り。

<?php
ini_set("gd.jpeg_ignore_warning", 1);

$width = 150; // 画像横幅を指定
$url = "https://s.yimg.jp/images/top/sp2/cmn/logo-170307.png"; // 画像URLを指定

list($image_w, $image_h) = getimagesize($url);
$proportion = $image_w / $image_h;
$height = $width / $proportion;
if($proportion < 1){
	$height = $width;
	$width = $width * $proportion;
}

if(strpos($url, '.png') !== false) {
	$image = imagecreatefrompng($url);
	header('Content-type: image/png');
}
else {
	$image = imagecreatefromjpeg($url);
	header('Content-type: image/jpeg');
}

$canvas = imagecreatetruecolor($width, $height);
imagecopyresampled($canvas, $image, 0, 0, 0, 0, $width, $height, $image_w, $image_h);
imagejpeg($canvas, NULL, 100);
imagedestroy($canvas);

ポイントは1行目の「gd.jpeg_ignore_warning」だろう。

これを指定しておくことで、ファイルサイズが大きなJPGでも警告を無視して表示できるようになる。

あとは画像ヘッダーの指定かな。

「Content-type: image/png」もしくは「Content-type: image/jpeg」を適宜指定するようにしておく。

画像形式によらず、imagejpeg関数でOKなのはちょっと驚き。

さて、このサムネイル表示プログラム(例:thumbnail.php)をHTMLから呼び出すには、次のように記述する。

<img src="thumbnail.php">

以上、お疲れ様でした。

iPhoneにSuicaを追加すると「カードが追加されませんでした。詳しくはカード会社にお問合せください。」エラーの解決方法

f:id:kawai_norimitsu:20190613085056p:plain

症状

iPhone7に、登録済みのSuicaを読み込もうとした。なおこのSuicaは、Suicaアプリで作成され、iCloudに紐づけられている。

設定にある「WalletとApple Pay」からカードを追加すると、「カードが追加されませんでした。詳しくはカード会社にお問合せください。」とのエラーが表示。

時間帯を変えて、再度試してみてもダメだった。

24時間あけて試してみる

調べてみると、Apple Pay+Suicaのよくあるご質問のページにエラー発生から24時間以上あけて、再度お試しくださいと書かれていた。

どうやら処理未完了が複数回発生すると、一時的なロックが掛かるとのことだ。

appsuica.okbiz.okwave.jp

24時間以上あけてSuicaを追加しようとするが、やはりダメだった。

Apple Careに電話した

仕方ないので、Apple Careに電話した。

電話ではiPhoneのIMEIをプッシュホンで入力する必要がある。IMEIは、iPhoneの「設定 - 一般 - 情報」に表示されていて、13桁の数字だ。

Apple Careサービス&サポートライン】
電話番号:0120-277-535
受付時間:9時~21時(年中無休)
※お問合せの際には、必ず「Apple PayのSuicaに関すること」とお申し出ください

appsuica.okbiz.okwave.jp

電話で分かったことは、JR東日本に問い合わせてくれとのことだった。

もし「定期券のSuicaである」または「Suicaの残高が2万円以上ある」場合は、Apple側の対応になるとのこと。

JR東日本に電話した

電話では、メニューをプッシュホンで選ぶ。最初は「Suicaカードの取り込み」についてなので(2)を、続いて「iPhoneApple Watchを使用」なので(2)を押す。

なおオペレーターにつながると、本人確認のため、氏名・性別・生年月日・携帯番号など聞かれる。

Suicaアプリケーション・サポートデスク】
電話番号:050-2016-5005
受付時間:8時~22時(年中無休)

appsuica.okbiz.okwave.jp

エラーが解決

調べてもらったところ、SuicaApple Watchに取り込む際に、アクティベーション中にカードを削除したため、削除処理が途中で止まっていたとのことだった。

なので、JR東日本側で一度Suicaを退会させるので、新規登録して欲しいと言われた。そして以前のSuicaの残高は、専用のフォームから返金申請して欲しいと伝えられた。

ここ数日、とても面倒な思いをしたが、なんとかiPhoneSuicaアプリから新規登録してApple Watchに移せた。めでたしめでたし。