前提・実現したいこと
pay.jpで定期課金させたいです。
ajax部分でエラーが出ており、自分でも調べているのですがなかなか解決できなく悩んでおります。
お力をお貸しいただけると幸いです。
PHPでpay.jpという定期課金の組み込みをしているのですが、カード番号などを登録してボタンを押すと
Unexpected token < in JSON at position 0
と出ます。
下記のサイトにあったデモを参考にして、秘密鍵、公開鍵、DBの登録などを変更しております。
デモではエラーも無く、決済完了画面に遷移するのですが、デモ通り上手く行きません。
https://base91.net/payjp/
該当のソースコード
html
1<!--エラーがあった時はこちらに表示--> 2<div class="missArea cardmiss"></div> 3 4<!--以下、クレジットカード入力フォーム--> 5<dl> 6 <dt>カード番号</dt> 7 <dd><input type="text" name="card_number" placeholder="カード番号)4242424242424242"></dd> 8 <dt>有効期限</dt> 9 <dd><input type="number" name="card_exp_month" placeholder="月)12">/<input type="number" name="card_exp_year" placeholder="年)21"></dd> 10 <dt>カード確認コード(CVC)</dt> 11 <dd><input type="text" name="card_cvc" placeholder="CVC)123"></dd> 12 <dt>お名前</dt> 13 <dd><input type="text" name="card_name" placeholder="名前)TARO SASAKI"></dd> 14</dl> 15<button class="publishBtn" >登録する</button> 16<div style="padding-top:40px;"> 17<div>テスト用カード番号は<a href="https://pay.jp/docs/testcard" target="_blank">こちら</a>から<br> 18カード番号以外の情報は、グレーの文字通りご入力ください。<br> 19実際に決済はされません。</div> 20</div>
JavaScript
1//公開鍵を設定 2Payjp.setPublicKey("pk_test_○○○○○○○○○"); 3 4//publishBtn(buttonを押した時に以下の処理スタート) 5$(".publishBtn").click(function(){ 6 7 //一旦エラーエリアの内容をリセット(何も無い場合は変化なし)。 8 $(".missArea").empty(); 9 10 //有効期限の年を取得 11 //年を4桁すべて入力してもらうと手間がかります。 12 //よって、2019の場合、19だけ入力してもらい、20はここで付け足す。 13 var cvcdata = "20" + document.querySelector('input[name="card_exp_year"]').value; 14 15 //他の項目もすべて取得 16 var card = { 17 number: document.querySelector('input[name="card_number"]').value, 18 cvc: document.querySelector('input[name="card_cvc"]').value, 19 exp_month: document.querySelector('input[name="card_exp_month"]').value, 20 exp_year: cvcdata, 21 name: document.querySelector('input[name="card_name"]').value 22 }; 23 24 //pay.jpに送るため情報を暗号化(トークン化) 25 Payjp.createToken(card, function(status, response) { 26 27 //statusが200の場合はトークン化に問題無し。決済へ進む 28 if (status == 200) { 29 30 //トークンを取得 31 var card_token = response.id; 32 33 //ajaxで決済処理用のphpにトークンを送信 34 $.ajax({ 35 type: 'POST', 36 dataType:'json', 37 url:'functions/pay.php', 38 data:{ 39 card_token:card_token, 40 }, 41 success:function(data) { 42 if(data){ 43 //決済処理に問題があった場合、エラーを表示。 44 $(".cardmiss").append(""+data+""); 45 }else{ 46 //決済処理が成功した場合、決済顔料画面へ。 47 location.href = "success.php"; 48 }; 49 }, 50 error:function(XMLHttpRequest, textStatus, errorThrown) { 51 alert(errorThrown); 52 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 53 console.log("textStatus : " + textStatus); 54 console.log("errorThrown : " + errorThrown.message); 55 } 56 }); 57 58 } else { 59 60 //フォームの時点で入力内容にエラーがあった場合。 61 var error_messege = response.error.message; 62 $(".cardmiss").append("入力内容にエラーがあるようです。再度、ご確認の上、ご登録をお願い致します。"); 63 64 }; 65 }); 66}); 67
php
1 require_once "db.php"; 2 3 //公開鍵を設定するファイルを読み込みます。 4 require_once 'secret.php'; 5 6 //アップロードしたpay.jpのライブラリから必要なファイルを読み込みます。 7 require_once 'payjp-php-master/init.php'; 8 9 //JavaScriptからポストされたトークンを受け取ります。 10 $card_token = htmlspecialchars($_POST['card_token'], ENT_QUOTES); 11 12 //管理画面で決めた、今回課金するプランのidを指定します。 13 $plan_data = "plan001"; 14 15 //ユーザーのメールアドレスを取得します。 16 //今回はユーザーのメールアドレスをセッションで保持、セッションから取得。 17 $mail = $_SESSION['mail']; 18 19 try { 20 21 //pay.jpの管理画面に顧客データを作成します。 22 Payjp\Payjp::setApiKey($secret); 23 $result = Payjp\Customer::create( 24 array( 25 "email" => $mail, 26 "card" => $card_token, 27 ) 28 ); 29 30 //作成された顧客idを取得します。 31 $resultid = $result['id']; 32 33 //ユーザーをプランに加入する処理を実行。 34 Payjp\Payjp::setApiKey($secret); 35 $resultsub = Payjp\Subscription::create( 36 array( 37 "customer" => $resultid, 38 "plan" => $plan_data 39 ) 40 ); 41 42 //プランとユーザーを紐付けるidを取得 43 $resultsubid = $resultsub['id']; 44 45 //データベースにあるユーザーデータに、決済関連のidをまとめて保存 46 $userplandata = mysqli_select_db($mysqli,'userdata'); 47 //今回はplanrank=プランのランク(s0001) planid=プラン決済id payid=顧客id registrationtime=決済時間を登録しています。 48 //データベースにも予めカラムを作っておいてください。 49 $userplandata = mysqli_query($mysqli,"UPDATE userdata SET planrank='$plan_data',planid='$resultsubid',payid='$resultid',registrationtime='$today' where mail = '$mail'"); 50 51 } catch (Exception $e) { 52 53 //もしエラーがあった場合はエラーメッセージを返します。 54 $miss = $getmessage = $e->getMessage(); 55 56 }; 57 58 //最後にjsonでエラーがあった場合のエラーメッセージを返します。 59 header('Content-type: application/json'); 60 echo json_encode( $miss ); 61
試したこと
ajaxのerror:functionのalert(errorThrown)付近を
console.logでステータスを見ると下記のように返ってきました。
JavaScript
1XMLHttpRequest : 200 2textStatus : parsererror 3errorThrown : Unexpected token < in JSON at position 0
回答3件
あなたの回答
tips
プレビュー