PayKassaアグリゲーターを使用して暗号通貨で支払いを行う

こんにちは、Habr! 前回の記事では、サードパーティのサービスを使用せずに暗号通貨の受信を自分の手で接続する方法について説明しました。 この記事では、完全なノードを上げることなく、関連する困難なしに、暗号通貨で支払いを受け入れる方法を説明します。







しかし、それが常に起こるように、あなたは便利のためにお金を払わなければなりません。 PayKassaはアグリゲーターと見なされます。これは、IDと会社情報を確認する必要なく、平均的な市場手数料で匿名で支払いを受け入れることができるためです。







登録とセットアップ



登録は非常に簡単で、セットアップはもう少し複雑です。







開発とテスト用のストアと、「戦闘」用のストアの2つを作成することをお勧めします。 ローカル開発では、 ngrokを使用して適切なドメインを指定するのが非常に便利です(事前に無料であることを確認した後)。







ストアの作成はできるだけ簡単です。









開いたフォームでは、ほとんどのフィールドで問題は発生しません。









テストストアの場合、無料のngrokドメインを指定するのが最も便利です。 「ハンドラーURL」は、注文ステータスが変更されたことを通知するためにPayKassaがノックするアドレスです。 「成功/失敗した支払いURL」-ユーザーが支払いを行った後に誘導されるアドレス。 支払いが成功または失敗した後にユーザーが何をする必要があるかを説明した簡単なページを配置できます。







作成後、ストアIDが必要です。













さらに、必要に応じて、コミッションを支払う人と接続する支払いシステムを設定で指定できます。







支払いの受け取りを開始するために必要なことはこれだけです。







支払い用のURLを取得する



この記事では、すべてのクエリのテストパラメーターにtrueを使用します。 戦闘モードに入るには、指定しないで十分です。







PayKassaには、 APIを操作するためのPHPの単純なラッパーがありますが、他の言語の場合、そのようなラッパーの作成も難しくありません。 また、プロセスをよりよく理解するために、すべての例にはcurlを使用したクエリ例が付属しています。







お支払い方法を選択できる既製のページを使用する可能性はありませんでしたが、これは必ずしも必要ではありません。 さらに、自分で作成するのは非常に簡単です。 開発者向けページでは、支払いシステムと内部IDの間に対応関係があります。













ビットコインはどこでも通貨として使用します(システム:11、通貨: "BTC")。







PayKassa支払いAPIはhttps://paykassa.pro/sci/0.3/index.php



(執筆時点)にあり、支払いURLをsci_confirm_order



と支払いステータスを確認するsci_create_order



2つのメソッドをサポートしています。







curlを使用して支払い用のURLを取得する例:







 curl https://paykassa.pro/sci/0.3/index.php -d 'func=sci_create_order&amount=0.1&currency=BTC&order_id=1&comment=test&system=4&sci_id=SCI_ID&sci_key=SCI_KEY&domain=DOMAIN&test=false' -H 'Content-type: application/x-www-form-urlencoded'
      
      





PHPライブラリの使用( paykassa_sci.class.phpへのリンク ):







 <?php require_once('paykassa_sci.class.php'); $paykassa = new PayKassaSCI( $paykassa_shop_id, //   $paykassa_shop_password //   ); // : , ,  , ,   $res = $paykassa->sci_create_order(0.01, "BTC", 1, "Test Payment", 11); if ($res['error']) { echo $res['message']; // $res['message'] -     //    } else { //     $redirect_uri = $res['data']['url']; header("Refresh: 0; url=$redirect_uri"); } ?>
      
      





他の言語でAPIを使用するには、小さなラッパーを作成して使用すると便利です。







ルビーの場合:







 # paykassa.rb require 'net/http' class Paykassa BASE_SCI_URI = URI('https://paykassa.pro/sci/0.3/index.php') #   Ruby On Rails   #  secrets.yml    : # paykassa: # sci_id: SCI_ID # sci_key: SCI_SECRET_KEY # domain: SCI_DOMAIN #     RoR -       : # def initialize(auth) #        auth    sci_id, sci_key  domain def initialize(auth = Rails.application.secrets[:paykassa]) @_auth = auth end #    ,       JSON    def create_order(amount:, currency:, order_id:, comment:, system:) make_request( func: :sci_create_order, amount: amount, currency: currency, order_id: order_id, comment: comment, system: system ) end #    def confirm_order(private_hash) make_request(func: :sci_confirm_order, private_hash: private_hash) end private def make_request(data) res = Net::HTTP.post_form(BASE_SCI_URI, data.merge(@_auth)) JSON.parse(res.body).deep_symbolize_keys end end
      
      





支払いの受け取りURL:







  paykassa = Paykassa.new #   secrets.yml      : # paykassa = Paykassa.new(sci_id: 0, sci_key: '123', domain: 'habrashop.ngrok.io') result = paykassa.create_order( amount: 0.01, currency: 'BTC', order_id: 1, comment: "Payment №1", system: 11 ) #    raise StandardError.new(result[:message]) if result[:error] url = result[:data][:url] #       url: redirect_to url
      
      





node.jsの場合:







 var https = require('https'); var querystring = require('querystring'); function mergeArray(array1,array2) { for(item in array1) { array2[item] = array1[item]; } return array2; } function PayKassaApi(sci_id, sci_key, domain, test) { this.sci_id = sci_id; this.sci_key = sci_key; this.domain = domain; this.test = test || false; }; PayKassaApi.methods = [ 'sci_create_order', 'sci_confirm_order' ] PayKassaApi.prototype.sendRequest = function(method, params, callback) { if (PayKassaApi.methods.indexOf(method) === -1) { throw new Error('wrong method name ' + method) }; if (callback == null) { callback = params; }; var data = { method: method, sci_id: this.sci_id, sci_key: this.sci_key, domain: this.domain, test: this.test } data = mergeArray(params, data) var body = querystring.stringify(data); var options = { host: 'paykassa.pro', port: 443, path: '/sci/0.3/index.php', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, }; var request = https.request(options, function (response) { var result = ''; response.setEncoding('utf8'); response.on('data', function (chunk) { result += chunk; }); // Listener for intializing callback after receiving complete response response.on('end', function () { try { callback(JSON.parse(result)); } catch (e) { console.error(e); callback(result); } }); }); request.write(body) request.end() }; for (var i = 0; i < PayKassaApi.methods.length; i++) { PayKassaApi.prototype[PayKassaApi.methods[i]] = function (method) { return function (params, callback) { this.sendRequest(method, params, callback) } }(PayKassaApi.methods[i]) } module.exports = PayKassaApi
      
      





使用法:







 var PayKassa = require("./paykassa") var paykassa = new Api({ sci_id: 0, sci_key: '123', domain: 'habratest.ngrok.io', test: true }) paykassa.sci_create_order({ amount: 0.01, currency: 'BTC', order_id: 1, comment: 'test order №1', system: 1 }, function (res) { if (res.error) { //   -  Exception throw new Error(res.message) } else { //       /   console.log(res.data.url) } })
      
      





Pythonの場合:







 import httplib import urllib import json class PayKassa: sci_domain = 'paykassa.pro' sci_path = '/sci/0.3/index.php' def __init__(self, sci_id, sci_key, domain, test): self.sci_id = sci_id self.sci_key = sci_key self.domain = domain self.test = test and 'true' or 'false' def sci_create_order(self, amount, currency, order_id, comment, system): return self.make_request({ 'func': 'sci_create_order', 'amount': amount, 'currency': currency, 'order_id': order_id, 'comment': comment, 'system': system }) def sci_confirm_order(self, private_hash): return self.make_request({ 'func': 'sci_confirm_order', 'private_hash': private_hash }) def make_request(self, params): fields = {'sci_id': self.sci_id, 'sci_key': self.sci_key, 'domain': self.domain, 'test': self.test}.copy() fields.update(params) encoded_fields = urllib.urlencode(fields) headers = {'Content-Type': 'application/x-www-form-urlencoded'} conn = httplib.HTTPSConnection(self.sci_domain) conn.request('POST', self.sci_path, encoded_fields, headers) response = conn.getresponse() return json.loads(response.read())
      
      





使用法:







 paykassa = PayKassa(0, '123', 'habratest.ngrok.io', False) result = paykassa.sci_create_order(0.001, 'BTC', 1, 'Order number 1', 11) if result['error']: print(result['message']) else: print(result['data']['url'])
      
      





リクエスト自体は、通常のマルチパートフォーム/データPOSTリクエストです。







パラメーターの説明:









応答で同様のJSONを取得します。







 { "error": false, "message": "  ", "data": { "url": "https://paykassa.pro/sci/redir.php?hash=HASH", "method": "GET", "params": { "hash": "HASH" } } }
      
      





それから、 error



キーとdata.url



興味がありerror



error



false



場合、 data.url



指定されたアドレスにユーザーをリダイレクトできます。







非テストモードでこのアドレスにアクセスすると、支払いページが表示されます。







支払いページ







支払い確認



支払いを行った後、PayKassaはストアの作成時に「ハンドラーURL」フィールドで指定されたアドレスのサーバーに連絡します。 このリクエストには注文識別子のみが含まれ、ステータスは含まれません。 注文のステータス(正常に処理されたかどうか)を取得するには、受信した識別子を示すリクエストを行う必要があります。







 curl https://paykassa.pro/sci/0.3/index.php -d 'func=sci_confirm_order&private_hash=PRIVATE_HASH&sci_id=SCI_ID&sci_key=SCI_KEY&domain=DOMAIN&test=true' -H 'Content-type: application/x-www-form-urlencoded'
      
      





ルビーの例:







  paykassa = Paykassa.new private_hash = params[:private_hash] #  RoR / sinatra result = paykassa.confirm_order(private_hash) #    raise StandardError.new(result[:message]) if result[:error] order_id = res[:data][:order_id] # ID  amount = res[:data][:amount] #  
      
      





Pythonの例:







 paykassa = PayKassa(0, '123', 'habratest.ngrok.io', False) result = paykassa.confirm_order(request.POST['private_hash']) #   Django if result['error']: print(result['message']) else: print(result['data']['order_id']) print(result['data']['amount'])
      
      





さて、node.jsの例:







 var PayKassa = require("./paykassa") var paykassa = new Api({ sci_id: 0, sci_key: '123', domain: 'habratest.ngrok.io', test: true }) paykassa.sci_confirm_order({ private_hash: req.body.private_hash //   express }, function (res) { if (res.error) { //   -  Exception throw new Error(res.message) } else { //       console.log(res.data.order_id) console.log(res.data.amount) } })
      
      





同様のJSONが応答します。







 {"error":false,"message":"  ","data":{"transaction":"XXX","shop_id":"XXX","order_id":"1","amount":"0.01","currency":"BTC","system":"bitcoin","hash":"HASH"}}
      
      





ここではすべてが標準です。 error



false



の場合、 data.amount



の量での注文data.order_id



支払いは成功しています。 data.amount



には実際に受け取った支払い額が含まれます。 注文の処理と支払いのロジックに応じて、時々確認する必要があります(たとえば、ユーザー自身が金額を示す資金をクレジットする)手数料を除く)。







また、ユーザーが支払いの成功/失敗のURLにリダイレクトされるのとほぼ同時に注意する価値があります。







これについては、基本的な統合のプロセスは正常に完了したと見なすことができます。 ご覧のとおり、アグリゲーターの統合は、自分で支払いを受け取る実装よりもはるかに簡単であることがわかりました。 ボリュームが1か月あたり100〜1000ドル未満の場合、この方法のほうが収益性が高くなります。








All Articles