[vue]自分のサイト内にpayjpを使用してカード決済を実装したい。
前提・実現したいこと
現在自分で作っているWEBサービス内にカード決済を導入したく進めているのですが、
独学のため基礎的な知識不足を感じています。
vueを使用して、一通りのサービスは作成できたのですが、
今回のpayjjp側のサーバサイドに記述するようにいう意味がよくわからず困っております。
目的:
payjpを利用してカード決済を実装したい。
現在payjp内のガイドに沿ってカードトークンの取得まではできており、
APIリファレンスに沿って進めているのですが、支払いを作成のところで躓いています。
お分かりになる方いらっしゃればアドバイスいただければ助かります。
[リファレンス]
(https://pay.jp/docs/api/#%E6%94%AF%E6%89%95%E3%81%84%E3%82%92%E4%BD%9C%E6%88%90)
payjp-nodeをインストール後、
このリファレンスにある支払いを作成の内容をvue内のmethodで実行したところ
エラーが発生します。
発生している問題・エラーメッセージ
Access to XMLHttpRequest at 'https://api.pay.jp/v1/charges' from origin 'https://※※※.firebaseapp.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
https://api.pay.jp/v1/chargeにアクセスしたところ、
{
"error": {
"message": "You did not provide an API key. You need to provide your API key in the Authorization header, using Basic auth (e.g. 'Authorization: YOUR_SECRET_KEY').",
"status": 401,
"type": "auth_error"
}
}
が、返ってきています。
秘密鍵がうまくapi側へ渡せていないことが原因だと思うのですが、そもそもリファレンス内のコード(以下)をvueのmethodsから実行することがあっているのかわかりません。
const payjp = require('payjp')('sk_test_c62fade9d045b54cd76d7036');
payjp.charges.create({
card: 'tok_76e202b409f3da51a0706605ac81',
amount: 3500,
currency: 'jpy',
// tenant: "ten_xxx" // PAY.JP Platformでは必須
});
該当のソースコード
<template>
<v-app>
<v-form ref="form" v-model="valid">
<v-card>
<v-row>
<v-col cols="10" class="mx-auto">
<v-text-field
label="カード番号"
required
v-model="card.number"
></v-text-field>
<v-text-field
label="cvc"
required
v-model="card.cvc"
></v-text-field>
<v-text-field
label="月"
required
v-model="card.exp_month"
></v-text-field>
<v-text-field
label="年"
required
v-model="card.exp_year"
></v-text-field>
<v-card-actions>
<v-btn @click="createToken">createToken</v-btn>
<v-btn @click="order">注文</v-btn>
</v-card-actions>
</v-col>
</v-row>
</v-card>
</v-form>
</v-app>
</template>
<script>
var token = "";
var sKey = "sk_test_***";
export default {
data: () => ({
valid: true,
token: token,
price: "",
temp: "",
card: {
number: "4242424242424242",
cvc: "123",
exp_month: "12",
exp_year: "2020",
},
}),
methods: {
order() {
const payjp = require("payjp")(sKey);
payjp.charges
.create({
amount: 1000,
currency: "jpy",
card: token,
})
.then(console.log)
.catch(console.error);
},
createToken() {
/* eslint-disable*/
Payjp.createToken(this.card, function(status, response) {
/* eslint-enable*/
if (status === 200) {
token = response.id;
} else {
console.log(status);
console.log(response);
}
});
},
},
mounted() {
Payjp.setPublicKey("pk_test_***"); //
},
};
</script>
});
試したこと
サポートセンター問い合わせ
=>秘密鍵が設定できていないことが原因なので、設定してください。
=>支払い処理はサーバーサイドで行う必要があります。
との返答でした。
僕の知識が足りていないので理解できていないのですが、
今回の決済用のプロジェクトとは別に処理用のnodeプロジェクトを準備して決済時には処理用のプロジェクトへ投げるということなのでしょうか?
最初ローカルサーバー内でテストしていたのですが、httpsでなければNGということだったので、
firebase hostingを使用してみたが、同様のエラーが発生する。
予算
一度ご提案いただけると助かります。
チラ見しただけですが、CORSによるものです。
フロントエンドではなくサーバーサイドでApiをcallしてください
M2@世界一のカルネジスト/3年目個人事業主さん
返信ありがとうございます。
私が詳しくないので自信はないのですが別の際にGOOGLE APPS SCRIPTをapi化してスプレッドシート内の値を返すというプログラムを作成した時に、Access-Control-Allow-Originのエラーが出たのですが、結局は値を返す際にエラーが発生しているとこのようなエラーが出るようでした。
どこの記事が失念したのですが、同様のケースがありました。
今回はご指摘いただいたCOREではなく、apiからの返答でauth errが返ってきているので、秘密鍵が渡せていないことが原因だろうと思うのですがいかがでしょうか?
※しかしながら、秘密鍵+コードをどこに記述したら良いものか変わらないので確認できていない状態です。。
フロントエンドではなくサーバーサイドでApiをcallしてください
https://github.com/ngs/vue-payjp-checkout
もしくはこういったライブラリを使うかです。
ありがとうございます。
これは、カード情報をトークン化するもので、今回はscriptで読むこむタイプでトークンの生成対応しております。
少々理解が進みましてfirebaseの場合、functionsを使用すればnodeが動くようなので、
vue → functionへfetchでtoken情報を渡す ここまではできるようになりました。
PAY.JP for Node.js
https://github.com/payjp/payjp-node
※こちらをインストールしfunctionsを作成しています。
が、そのtokenを元に、サンプルコードを叩いても反応がありません。
payjpのリファレンスではサンプルコード以外の記載がなく、また行き詰まっております。
M2@世界一のカルネジスト/3年目個人事業主さん、可能でしたら有償でメンターをお願いしたいのですが
いかがでしょうか?
よろしくお願いします。
こんばんは。実行環境が手元にないので、提供いただいたソースコードとログを見ながら予想と想像になりますが、それで宜しけれればメンタリングいたします。
サンプルコードで何も出ないのはコードが抜けているためだと思います
お受けいただきありがとうございます。
menta初めてのため勝手がわからないのですが、この場合は、M2@世界一のカルネジスト/3年目個人事業主さんの方でプランを作っていただくのでしょうか?
リファレンスには、nodeアプリでこのコードのみしか記述がないので、どうしたいいものか。
トークン取得後の支払いを作成する箇所です↓
https://pay.jp/docs/api/#%E6%94%AF%E6%89%95%E3%81%84%E3%82%92%E4%BD%9C%E6%88%90
payjpのnodeモジュールです
https://github.com/payjp/payjp-node
承知しました。メンタリングプランを作成しますので、ご確認お願いします。