DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

PayPal決済をsandboxからliveにしたらエラーが出て決済出来なくなった -envリクエストを無くして解決-

前回、Paypalを使った決済システムを導入して「これは良いです!使えます!」と豪語していたのですが・・・

<前回記事>

dreamerdream.hateblo.jp

 

sandboxのテストを終えて実際にliveで本アカウントのIDを使って決済をテストしてみましたところ、下記のようなエラーが出て決済へ進めなくなってしまいました。

checkout.js:2844 ppxo_unhandled_error Object {stack: "Error: Invalid env: live↵ at Object.props.env.v…://www.paypalobjects.com/api/checkout.js:4929:37)",

 

どうやら今までのテストで、{env:'sandbox'}としていたリクエストが{env:'live'}と変更されたものに対して「そんなん知らん!」とお叱りを受けている様子です。

 

PayPalAPI許可設定の間違いなのか?コードに問題があるのか?はたまたAPIの許可に時間がかかっているだけなのか?

色々調べて半ば諦めかけていたのですが、丸一日かけて解決策を発見しました。

 

なんと!「envリクエストそのものを無くす」という手段で解決しました。

 

Djangoテンプレートだとこうなります。

<テンプレートの問題の一部分だけ抜粋>

paypal.Button.render({
{% if paypal_mode == 'sandbox' %}env: '{{ paypal_mode }}',{% endif %}
payment: function (resolve, reject) {

 

要するに、paypal_modeが'sandbox'じゃ無い場合はenv:自体を消す。

というコードです。

 

実際に自分のPayPal口座から決済をしてみましたが何事も無かったかのようにスムーズに決済完了しました。

 

丸一日悩んでなんじゃそりゃ!という話です。

しかし、「live」とすればOKなはずで、しかも何処を調べてもそのような記載は無いので若干気持ち悪いのですが、同じように悩んでいる方もあるんじゃないかと思い、備忘録として残しておきます。

 

また、「その解決策は絶対ちがうぞ!!」という方がおられましたら正しい情報のご一報をお待ちしています。

f:id:DreamerDream:20201112103600p:plain

ちゃんと動けば、Paypal決済はすごく良いですよー! 

DjangoサイトにPayPal決済を導入する 備忘録

個人で開発しているWebサービスにこの度PayPal決済サービスを付加することにしました。

 

PayPalは以前にAmazonのレビュー依頼で作っておいたのでそれをビジネスアカウントにグレードアップして使用することにしました。

dreamerdream.hateblo.jp

 

PayPalの魅力は何と言っても「会費無料」「世界でトップシェアの決済サービス」というところではないでしょうか?

手数料は決済の都度発生しますが、クレジットカードに銀行口座振り込み、おまけに仮想通貨にまで対応していて、尚かつ利用者がサイト上にカード情報を入力しなくて良いという安心感があります。

PayPalは開設費用は年会費も不要なので僕のような弱小サイトには強い見方です。口座が動かなければ完全無料運用可能なんですから、とりあえず試しに組み込むだけというのもアリ。

 

ビジネス用アカウントを作って本人確認が取れていればPayPal決済用のボタンをPayPalサービス上で作れるのですが、そのままだとこちらが支払確認をしてから顧客にサービスを提供する。という手作業が必用になってしまいます。

 

それらを自動化するためにはPayPalAPIを利用する必用があります。

 

とはいっても殆どこちらの先輩の書かれている記事の通りです。

akiyoko.hatenablog.jp

こちらの記事内容をこのまま参考資料として、僕自身が再構築する時に迷わないために以下に記すことにしました。

 

 

APIを利用するためのSDKgithubサイトで公開されているのでPython用のものをcloneするだけです。

github.com

 

SDKをダウンロードしたいディレクトリで

sudo git clone https://github.com/paypal/PayPal-Python-SDK

を実行するとその場にSDKディレクトリが展開されるので、

 

利用するpythonコードファイル(Djangoのview.pyなど)から「paypalrestsdk」ディレクトリが見えるようにインポートするだけ。

例)ソースコードファイルと同じディレクトリ内にSDKディレクトリをダウンロードした場合

import sys

sys.path.append(os.path.join(os.path.dirname(__file__), './PayPal-Python-SDK'))
import paypalrestsdk

 

とすることでpaypalrestsdkが利用出来るようになります。

paypalrestsdkには辞書形式で設定値を渡すだけだから設定が面倒であれば直書きでも動作可能。

 

実際に運用開始する前にデベロッパーページにて「sandbox」用のアカウントを売り手、買い手の2つ作って実際のお金を動かさずに動作試験することが出来ます。

developer.paypal.com

 

 

<sandboxで生成された試験用アカウント>

f:id:DreamerDream:20201105135903p:plain

下のコードのpaypalrestsdkに入力する[PAYPAL_CLIENT_ID],[ PAYPAL_CLIENT_SECRET]はここで作った売り手のアカウントのIDとシークレットキーを入力します。(実運用時には自分のアカウントのものに置き換えます。)

参考ページから転用(views.py)

paypalrestsdk.configure({
  'mode': [試験運用には'sandbox'、実際の動作には'live'を入力],
  'client_id': [PAYPAL_CLIENT_ID],
  'client_secret':[ PAYPAL_CLIENT_SECRET],
})


payment = paypalrestsdk.Payment({
  'intent': 'sale',

  # Payer
  'payer': {
    'payment_method': 'paypal',
  },

  # Redirect URLs
  'redirect_urls': {
    'return_url': '/execute-payment', #決済完了時のアドレス
    'cancel_url': '/pay', #キャンセル時のアドレス
  },

  'transactions': [{ 
    # Item List
    'item_list': {
    'items': [{
      'name': [商品の名前],
      'sku': [支払の内訳],
      'price': '100', #価格
      'currency': 'JPY', #日本円はJPY アメリカドルならUSD
      'quantity': 1, #量
    }]
  },
  # Amount
  'amount': {
    'total': '100', #合計金額
    'currency': 'JPY',
  },
  'description': [説明書き],
  }]
})

 

 

 

上のコードは参考ページのhtmlファイルに置かれているjavascryptコードの

paypal.request.post('/create-payment', {csrfmiddlewaretoken: '{{ csrf_token }}'})

この部分、例の場合であれば「/create-payment」に対してPOSTリクエストが送られ、Djangoからjson形式で決まった型でデータが返信されます。

この形式はカッチリと決まっているようで、任意のキーを付加したり削除したらエラーになります。

 

決済が完了したら

/execute-payment

が呼ばれて完了します。

 

非常にザックリした図ですけれど、

f:id:DreamerDream:20201105134501p:plain

PayPal決済ボタンでcreate情報取得するアクセスポイントを自サイトに設置して、

決済ボタンが押されたら自サイトにcreate情報アドレスへPOSTして、自サーバーからはjsonで支払情報を返す。

その後スクリプトがそのままPayPalサーバーと支払情報等をやりとりして(ブラックボックス)、決済完了後に完了画面へ推移する。

という流れのようです。

 

 

参考サイトではpaymentの情報をそのままDjangoのテンプレートで出力していますが、決済結果をjsonで保存する場合は一度str形式に変換してから辞書形式に直してjson形式で保存するという方法になるようです。

paymentはpaypalrestsdkの独自クラスのようでそのままでは辞書変換出来ませんでした。

文字列→辞書形式変換には演算可能なevelよりastクラスを使のが安全です。

note.nkmk.me

paypal形式を辞書形式に変換

import ast

 

str_payment = str( payment )
dic_payment = ast.literal_eval( str_payment )

 

あとは完了画面で有料サービスのURLやコンテンツのダウンロードを提供することができる他、取引毎に生成される固有のIDが「payment.id」で取得できるので、自サーバーにIDを保管しておけば決済完了時にユーザー毎の決済を確認することも出来ます。

これでユーザー毎にサービスを提供するなど自動的に任意のサービスをDjango側から提供することが出来ます。

 

ちなみに、コードのどこかが間違っていたり、POST出来なかったりすると以下の画像が一瞬だけ表示されて消えてしまいます。

f:id:DreamerDream:20201105140005p:plain

 

 

非常にザックリした内容でしたが、あくまで自分用の備忘録ですのでご了承ください。

 

 続↓ 実際の決済でエラーが出たので対処しました。

dreamerdream.hateblo.jp

 

「HelloThinkPHP」って何? サーバーのセキュリティー対策を怠らないようにしましょう

先日、僕が公開しているVPSサーバーのログを眺めていましたらこのような攻撃を受けていました。

 

GET /index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=HelloThinkPHP HTTP/1.1" 301 362 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

 

HelloThinkPHPって何?とググってみましたらズバリな記事を発見しました。

www.orangeitems.com

中国では有名なローカルフレームワークの1つ「ThinkPHP」を使ったサーバーに直にこのリクエストを送りつければ乗っ取れるという非常に簡単な脆弱性を狙ったものだそうです。

2018年の記事なので既に対処済みのサーバーも多いと思うのですが未だにbotが古いサーバーを探し回っているのですね。

 

以前の記事にもこのようなフレームワークを狙った攻撃について書いた事がありますが、一様に同じ構造を持ち尚かつ有名なフレームワークは一度脆弱性が発見されるとこのようなbotが巡回して芋づる式に被害を受けてしまいます。

 

日本ではワードプレスを使ったブログ運営が主流になっていますがワードプレスも定期的にアップデートしておかないと古いプラグイン等で乗っ取り被害が出ている事もありますので人ごとではありません。

dreamerdream.hateblo.jp

dreamerdream.hateblo.jp

 

今回は注意喚起ということで簡単に纏めさせていただきました。

f:id:DreamerDream:20201019125400p:plain

 

格安のLEDテープライトを自分で切って線を半田で取り付ける方法

LEDテープライト、いろいろな種類がありますが、こちらはなんと5mで500円以下という破格の商品です。

Lepro LEDテープライト 電球色 無段階調光 間接照明 5m 12v 高演色タイプ ストリップライト 切断可能 2835SMD 300LED高輝度 ストリングライト 寝室/お部屋/店舗/コレクション/看板照明

色も色々ありますが、単色タイプで12Vの電圧をかけるとすぐ点灯するというシンプルなものです。

 

今回は車のフットライトとして使いたいので5m全部じゃなくて少しだけ切って複数に分けて使いたいんですよね。

届いたまんまの状態では端の端子はこのように結線されています。

f:id:DreamerDream:20200923094022p:plain

 

このテープライトは光源3つごとにカット部分が用意されていて好きな所で切って使う事が出来ます。

f:id:DreamerDream:20200923094031p:plain

格安商品ですので無駄な物が一切ありません。防滴用の樹脂もありませんから非常に作業しやすいものです。

そして、ご丁寧に+側には「12V」と書かれていますので失敗も少ないでしょう。

 

カットしたら結線用に適当な電線を用意します。

f:id:DreamerDream:20200923094042p:plain

 

電線の端っこに半田でボールを作っておきます。

f:id:DreamerDream:20200923094051p:plain

 

同じようにテープ部分にも同箔の丸い部分がありますので、半田を溶かせてボールを作っておきます。

f:id:DreamerDream:20200923094101p:plain

 

半田ボール同士を押し当てて半田ごてで熱してあげるとしっかりと溶着されます。

f:id:DreamerDream:20200923094110p:plain

以上です。

簡単ですね。

 

結線はこれで完了なのですが、万が一半田部分が外れて隣の線と接触してしまうと発火する可能性があります。

念のため、ボンドやシーラーで万が一の場合でも端子同士が触れることの無いように覆っておきましょう。

f:id:DreamerDream:20200923094121p:plain

ボンド等で線自体を固定しておくと半田が外れたときでも隣と接触しないので安心ですね。


あとは車のACC電源やイルミ電源から電源を確保するだけです。

取り出すには、このような分岐端子を使うと楽です。

エーモン 電源分岐ハーネス(ギボシ端子タイプ) AV1.25sq 3個入 3350

ヒューズから取り出す場合はコチラの分岐端子が便利です。

平型 ヒューズ 15A 電源取り出し ヒューズボックス #P01.

TwitterからAmazonの商品レビュー依頼が来たのでサクラレビューに該当しないかAmazonへ問い合わせてみました

TwitterのDMにて

「3Dプリンター用のフィラメントを購入して評価をいただけませんか?」

という旨のメッセージを頂きました。

f:id:DreamerDream:20200905082839j:plain

 

商品はSUNLUのPLAフィラメントです。

f:id:DreamerDream:20200905083104j:plain

2000円/1kg程度の格安商品ですが、「Amazon評価を投稿すると返金されるので実質無料で購入することができます」という内容です。

 

かなりお得な話ですが、こういったものは「クラレビュー」としてAmazonからペナルティーを食らうかもしれないという情報もあるのでサクラレビューに該当しないのか一度Amazonにお伺いを立てることにしました。

 

クラレビューとは、高評価を付ける代わりに対価を得るというものです。

<参考ブログ>

【失敗談】Amazonレビューの規約違反をしてしまった。|沖縄チビデブパパの雑記

商品を無料で手に入れることや報酬を目的に購入すると規約違反とされるようで、ペナルティーとして参考ブログのようにキャンペーンに参加出来なくなっったり、最悪アカウントが停止されてしまうようです。

中には、評価に応じて+報酬額というサクラレビュー依頼もあるそうです。

 

問合せはamazonの問合せチャットで行いました。

(※ブログへの掲載許可もいただいています。)

f:id:DreamerDream:20200905082813j:plain

 

チャットではどの商品でどのような内容なのか?という詳細をDMのスクショをメールで添付したりして依頼内容を正確に伝えて返信を頂きました。(長いので中盤は割愛します)

<返答>

f:id:DreamerDream:20200905082827j:plain

f:id:DreamerDream:20200905082801j:plain

 

結果、”今回は”(←大事!)この商品を購入して評価を行なってもペナルティーは受けない。

但し、Amazonからの購入以降のやりとりについてはAmazonは一切関係無いからトラブルが起きても責任を負いませんので気をつけて。

ということでした。

 

今回解ったことは、商品評価の対価として返金が行なわれるとしても全てがペナルティ対象にはならないということのようです。

高評価の強制や異常なレビュー数、他に何らかの規定や要因があるのか解りませんが全ての商品に対して言えることでは無いと思いますので、このような評価依頼を受けたらamazonに一度確認をしてみることをお勧めしておきます。

 

ちなみに、紹介された3Dプリンター用フィラメントの感想はこんな感じです。 

dreamerdream.hateblo.jp

本当に良いフィラメントだったので何の問題も無く☆5つです。

(仮に悪いフィラメントでレビューだけ高評価を強要されていたとしたら返金お断りしてボロクソにレビュー評価していました。)


ちなみに、こういった中国系のレビュー返金にはPaypalがよく使われているそうですので何らかの商品レビュー依頼を受けてみようと思う方はPaypalアカウントを作成しておくと良いでしょう。
www.paypal.com

 

レビュー依頼を受ける時の大事なポイントをもう一度おさらいします。

  • 「サクラレビュー」に該当しないのか注意しましょう。
  • 購入前にamazonにお伺いを立てましょう。
  • 必ず本音でレビュー評価を書くこと。
  • 「返金されたら良いな」程度であまり返金に期待しない。

SUNLUのPLAフィラメントを試してみました。

Amazonで入手できるSUNLUというメーカーのPLAフィラメント

 

1Kg 2,499円

 

今なら400円引きのクーポンを使えるので2,099円で入手できます(執筆時点)。

 

梱包は無難なダンボール梱包です。

f:id:DreamerDream:20200908115159p:plain

製品紹介パンフレットが一部付いています。

f:id:DreamerDream:20200908115209p:plain

パックもよくある真空パックで梱包されています。

f:id:DreamerDream:20200908115221p:plain

 

先端はこのように留めてあります。

f:id:DreamerDream:20200908115233p:plain

フィラメントに折れ目が付いているので外すときに折れないかドキドキしましたが折れませんでした。

 

 

以前に試したeSUNのPLA+フィラメントに比べると梱包は安っぽいですが「必要最低限の梱包」という評価も出来ます。 

dreamerdream.hateblo.jp

 

上記のフィラメント(右)と比べると色味はマット調というかフィラメント自体が物理的にザラザラしています。

f:id:DreamerDream:20200908115243p:plain

ザラザラが滑り止めのようになるのでエクストルーダーへのセットが楽です。

 

遠近で撮ってしまいましたが・・、リールの内径が今まで使ったフィラメントリールに比べると大きいので中心に軸を通すタイプのフィラメントホルダーを使っている方は注意が必用です。

f:id:DreamerDream:20200908115255p:plain

まあこれは3Dプリンターで内径を小さくするパーツを作れば済む話です。

 

 

僕が使ったのは黒色ですが色味が上記のフィラメントより若干薄く、薄物を作って日光に透かすと少し透過します。

とはいうものの、写真で撮ってもよく解らないレベル。

f:id:DreamerDream:20200908115308p:plain

 

電子工作で光センサー類に使おうと思うと注意が必用になるかもしれません。

 

全く同じものを作って比較していますが、(下がSUNLUのフィラメント)

f:id:DreamerDream:20200908115320p:plain

200℃で安定して出力出来ました。

f:id:DreamerDream:20200908115333p:plain

仕上がり具合も色味もほぼ一緒。

ベッドへの定着も良く使いやすいです。

 

荷重をかけると、上記のPLA+フィラメントに比べると若干軟らかいようですが、触って比べても違いが解らない程度です。

f:id:DreamerDream:20200908115345p:plain

 

このフィラメント、PLA+ではなく、PLAの中では現時点でお勧め1位です。

 

 

 

その他PLAフィラメントの比較はこちらを参考にどうぞ↓

dreamerdream.hateblo.jp

 

ミューズノータッチ泡ハンドソープを詰め替えボトルの再利用方法 穴開け加工一切無し!ドライバー一本で簡単に詰め替える方法

手を触れないでハンドソープが出る便利なアイテム「ミューズノータッチ泡ハンドソープ」がコロナの影響もありボトルの値段が以前より上がっています。 

【Amazon.co.jp 限定】【医薬部外品】ハンドソープ 泡 ミューズ ノータッチ 自動 ディスペンサー 本体+詰め替え キッチン 250ml + おまけ付き

 

こうなると人間いろいろと考えて何とか中身を詰め替えてやろうとするものです。

mainichi-rainbow.com

いろいろな方法が公開されていて皆さんすごい執念を感じます。

 

フリマアプリではこのボトルにペットボトルのキャップを付けたものが千円以上の価格で売り出されてめちゃ売れていたりします。

確かにキャップを付けると詰め替えやすいのですが・・・、加工しちゃうと「詰め替えています」というのがバレバレだとどこか貧乏臭く見えてしまいます(失礼)。

 

ということで、今回は余計な加工や複雑な道具無しでミューズノータッッチ泡ハンドソープを詰め替える方法をご提供します。

 

必用な道具はマイナスドライバー一本だけです。

f:id:DreamerDream:20200825122747p:plain

 

 

ボトルの蓋のこの辺に挿して、

f:id:DreamerDream:20200825122844p:plain

 

えいっと持ち上げれば蓋がパコッと外れます。

f:id:DreamerDream:20200825122853p:plain

 

完了!

f:id:DreamerDream:20200825122902p:plain

はい、口も広いのでこれで好きなハンドソープを入れて再利用できます。

 

後は入れ替えてからパチンと音が鳴るまでギュッっと蓋を閉めれば逆さに向けてもこぼれません。

 

ドライバーを挿した部分は使用時にはディスペンサーに隠れて見えませんから蓋を開けたことすら解りません。

何度もやっていると爪が折れて使えなくなるかもしれませんが、今回5回ぐらい空けたり閉めたりしてみましたが問題ありませんでした。

 

僕と同じ貧乏性の方は簡単ですので是非お試しください。

 

 

kampa.me