【PHP】twilioで電話をかける、SMSを送る

twilioを使って電話をかけたりSMSを送ったときの覚書。言語はPHP。

1.ライブラリのダウンロードと設置

電話をかけるにもSMSを送るにも準備として、twilioのライブラリを設置する必要がある。
TwilioのPHPソースコード(zip)

解凍すると Services というフォルダが入っているのでそれをそのまま自分のサーバーにアップロードする。

ライブラリのインストールとSMS送信サンプルはこちらにもある(公式)

これで下準備完了。

2-1.twilioで電話をかける

次の二つのサンプルコードをアップロードして読み込むとtwilioの番号から電話をかけられる

twilio_call.php
--------------------------------------------------
<?php
require("Services/Twilio.php"); // PHPライブラリ

$sid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Account Sid
$token = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; // Auth Token
$tel_to = "+8190xxxxxxxx"; // 発信先電話番号
$tel_from = "+81xxxxxxxxxx"; // twilioで取得した発信元電話番号
$twiml = "http://example.com/calling.xml"; // TwiML URL(absolute path)

$client = new Services_Twilio($sid, $token);
$call = $client->account->calls->create($tel_from, $tel_to, $twiml);
?>
--------------------------------------------------

calling.xml(この音声が読み上げられる)
--------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="ja-jp">Twilioへようこそ。</Say>
</Response>
--------------------------------------------------
このサンプルコードはこちらのまま

2-2.twilioでSMSを送る

次のサンプルコードをアップロードして読み込むとtwilioの番号からSMSが送れる

--------------------------------------------------
<?php

require "Services/Twilio.php"; // PHPライブラリ

//set our AccountSid and AuthToken from www.twilio.com/user/account
$AccountSid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$AuthToken = "xxxxxxxxxxxxxxxxxxxxxxxxxx";

//instantiate a new Twilio Rest Client
//新しいクライアント オブジェクトのインスタンスを生成
$client = new Services_Twilio($AccountSid, $AuthToken);

//送信先の配列をつくる
//送信先電話番号 => 相手の名前
$people = array(
"+8190xxxxxxxx => "tarou",
"+8190xxxxxxxx => "hanako",
);

//Loop over all our friends. $number is a phone number above, and
//$name is the name next to it
foreach ($people as $number => $name) {

$sms = $client->account->messages->sendMessage(

//twilioから購入したSMS送信可能な電話番号
"+160xxxxxxxx",

// the number we are sending to - Any phone number
$number,

// the sms body
"このメッセージちゃんと届いてるか?"
);

// PC画面に表示されるメッセージ
echo $name . "にメッセージを送ったよ";
}

?>
--------------------------------------------------
このサンプルコードは公式のまま

paypalのエクスプレスチェックアウトを利用した定期支払いの導入

paypalのエクスプレスチェックアウトを利用した定期支払いの導入にはこちらのページが大変参考になった。

上記ページのサンプル

請求金額や請求頻度は、CreateRecurringPaymentsProfile APIで設定する。paypalfunctions.php 内にある次のパラメーターで指定できる。

----------------------------------
//定期支払いの請求開始日
"&PROFILESTARTDATE=".date("Y-m-d",strtotime("now"))."T0:0:0";

//30日ごとに請求
"&BILLINGPERIOD=Day";
"&BILLINGFREQUENCY=30";

//これだと5ヶ月ごとに請求
"&BILLINGPERIOD=Month";
"&BILLINGFREQUENCY=5";

//日本円で1,500円
"&AMT=1,500";
"&CURRENCYCODE=JPY";
----------------------------------

paypalのStart Date should be greater than current dateエラーの対処法

エクスプレスチェックアウトで定期支払いを実装したときに以下のエラーが出た

エラー内容
----------------------------------------------
GetExpressCheckoutDetails API call failed. Detailed Error Message: Subscription start date should be greater than current dateShort Error Message: Start Date should be greater than current dateError Code: 11505Error Severity Code: Error
----------------------------------------------

これは paypalfunctions.php 内の profilestartdate(定期支払いの請求開始日) に過去の日付が入っている場合に出る。現在か未来の時間に書き換えてやればok。

現在の時間を取得して入れる
----------------------------------------------
PROFILESTARTDATE=".date("Y-m-d",strtotime("now"))."T0:0:0";
----------------------------------------------

【paypal】エクスプレスチェックアウトの支払いページの社名を変更する

支払いページの社名をサービス名に変更したときの覚書。

支払いページの社名を変更する方法のひとつとしてlogo画像に置き換えるという手段がある。

[ツール]-[ビジネス設定]-(買い手の手続きを)[カスタマイズする]-会社のロゴの追加の[作成]から、logo画像を指定したページスタイルをメインにするだけ。

しかしこの方法だと、スマホから見た場合にlogo画像は表示されず、以前の社名のまま。スマホにはlogo画像は表示しない仕様ということかな。

他の方法を探してみると、SetExpressCheckout API のパラメーターに情報を追加することで可能らしい。

関連パラメーター
-----------------------------------------------
//logo画像を指定
$nvpstr = $nvpstr . "&LOGOIMG=" . urlencode('http://example.com/paypal_logo_img.gif');

//header画像を指定
$nvpstr = $nvpstr . "&HDRIMG=" . urlencode('http://example.com/header_img.gif');

//ページスタイルを指定
//上の二つはページスタイルを指定して変更される点と同じ。だからページスタイルが設定してあればこの一行でもいいし、設定画面でメインスタイルに指定していればなくてもいい。
//$nvpstr = $nvpstr . "&PAGESTYLE=mystyle";

//これがスマホ支払いページの社名を書き換えるパラメーター
$nvpstr = $nvpstr . "&BRANDNAME=サービス名";
-----------------------------------------------
青文字の部分は環境に合わせる

パラメーターを追記する場所は、paypalfunctions.php 内にある。

paypalfunctions.php の中を抜粋
-----------------------------------------------
function CallShortcutExpressCheckout( $paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL)
{
//------------------------------------------------------------------------------------------------------------------------------------
// Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation

$nvpstr="&PAYMENTREQUEST_0_AMT=". $paymentAmount;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_PAYMENTACTION=" . $paymentType;
$nvpstr = $nvpstr . "&RETURNURL=" . $returnURL;
$nvpstr = $nvpstr . "&CANCELURL=" . $cancelURL;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_CURRENCYCODE=" . $currencyCodeType;

//ここら辺に追記すれば SetExpressCheckout API にパラメーターが渡る。

-----------------------------------------------

SetExpressCheckout API で使用できるパラメーター(公式)

パラーメータについて全部でないけど日本語でまとめてあるページ

【paypal】本番環境でだけAPIのエラーが出る

sandbox環境では問題ないのに本番環境だとエラーが出る。

エラー内容
--------------------------------------------
SetExpressCheckout API call failed. Detailed Error Message: Security header is not validShort Error Message: Security errorError Code: 10002Error Severity Code: Error
--------------------------------------------

APIの認証がうまくいっていないらしい。

対処法
paypalfunctions.phpを開いてSandboxFlag を false に書き換える。

書き換え内容
--------------------------------------------
//$SandboxFlag = true; //sandbox用
$SandboxFlag = false; //本番用
--------------------------------------------

paypal での支払い実装いろいろ

paypal での支払い実装方法いろいろ

1.定期購読

定期購読するだけならボタンを作成のみでok。sandbox でも可。

ボタン作成の過程はこちらが分かりやすい。

2.API でエクスプレスチェックアウト

PayPal Integration Wizardから順番に行えばいい。修正すべき点もあるが、こちらを参考にした。
ためしにやるなら参考ページと同じファイル名にすること。ファイル名変えて少しはまった。
IPN についても上記ページを参考に実装できる。

paypalのテスト環境(sandbox)の作り方

paypalでテスト環境を作るには、sandboxと呼ばれる開発用テストツールを利用する

sandboxとは
--------------------------------------
サンドボックスとは、保護された領域内でプログラムを動作させることで、その外へ悪影響が及ぶのを防止するセキュリティモデル。「子供を砂場(サンドボックス)の外で遊ばせない」という言葉が語源だと言われている。
--------------------------------------
引用元 e-Words

1.ビジネスアカウントで Developer ページにログインして、Dashborard(2016年4月現在、画面下部)の Sandbox accounts からテスト用アカウントを作る。
テスト用アカウントの造り方はこちら(公式)

このとき作るアカウントはテスト用のビジネスアカウント(売り手)とテスト用のパーソナルアカウント(買い手)それぞれひとつずつ。計ふたつ。

ここで登録するメールアドレスは存在しないものでいいし、金額(持ち金)も適当に多く設定しておけばいい。あくまでシミュレーションなので実際にお金が動くわけでない。

2.sandboxのトップページからビジネスアカウントでログインして、本番と同じようにページに paypal を仕込んで、パーソナルアカウントで買い物をする。

ログインするアドレスはこちら https://www.sandbox.paypal.com/jp/
sandbox(テスト環境)のトップページからログインする。テストアカウントで通常のログインできないので注意!

【javascript】スマホで縦スクロール禁止

javascript の記述
---------------------------------------
//touchmove の縦スクロールを禁止
document.body.addEventListener( 'touchmove', function(e){
e.preventDefault();
});
---------------------------------------

jQuery の場合
---------------------------------------
// スクロール禁止
$(window).on('touchmove.noScroll', function(e) {
e.preventDefault();
});

// スクロール禁止 解除
$(window).off('.noScroll');
---------------------------------------
※.noScroll は解除するためにつけた名前

参考ページ

http://qiita.com/kokushin/items/ef96194bd0fa7c145d7b

PHPの配列をjavascriptに渡す

PHPの配列をjavascriptに渡す場合は、いったんjson形式に変換するといい。

スクリプト例 ここから
--------------------------------------------------------
<?php

$hairetu = array('りんご', 'もも', 'なし');

//配列をJavaScriptに渡すために一度jsonに変換
$jsonTest=json_encode($hairetu);

?>

<html>
<head>
<title>タイトル</title>
</head>

<body>
<script type="text/javascript">

//JSON.parseを使って配列を受け取る
var test=JSON.parse('<?php echo $jsonTest; ?>');

for (var i = 0; i < test.length; i++) {

alert(test[i]);

}

</script>

</body>
</html>

--------------------------------------------------------
ここまで

参考サイト

http://future-software-labo.anyagent.net/php%E3%81%8B%E3%82%89javascript%E3%81%AB%E9%85%8D%E5%88%97%E3%82%92%E6%B8%A1%E3%81%99/

javascriptファイルが外部ファイルの場合

PHPファイル
--------------------------------------------------------
//カスタムデータ属性にjson形式の配列をセット
<script id="script" src="js/script.js" data-json-test ='<?php echo json_encode($hairetu)?>'></script>
--------------------------------------------------------

javascriptファイル

script.js(外部ファイル)
--------------------------------------------------------
//jQueryを利用してカスタムデータ属性にアクセス
var $script = $('#script');
var test = JSON.parse($script.attr('data-json-test'));
--------------------------------------------------------

参考サイト

http://qiita.com/cither/items/b98cc4e237dcc8f7e51f

http://dresscording.com/blog/html5/custom_data_attribute.html

【PHP】ディレクトリ内のファイル名だけの一覧を取得

<??php
// ディレクトリのパスを記述
$dir = "dragon_ball1";

// ディレクトリの存在を確認し、ハンドルを取得
if(is_dir($dir) && $handle = opendir($dir)) {

// ループ処理
while(($file = readdir($handle)) !== false) {
//$path = $dir . $file;
// ファイルのみ取得
if(filetype($dir . "/" . $file) == "file") {
/********************

各ファイルへの処理

$file ファイル名
$path ファイルのパス

********************/

// ファイル名を出力する
echo $file . "
";

}
}

} else {

echo "ディレクトリがない";

}
?>

参考サイト(このサイトのをほぼそのままコピーした)

http://webkaru.net/php/function-filetype/