オンラインストアのFacebookクレジットを接続します

こんにちは、Habr。 少し前に、1C-Bitrix上のストアをソーシャルネットワークFacebookに接続するモジュールを作成しました。 自分の経験と、ストアでFacebook Creditsレセプションを設定する機能を共有したい-どのCMSが実装されているかは関係ありません。 急ぎました!





歴史的背景



Facebookクレジットは、Facebookソーシャルネットワークの内部通貨であり、2009年に初めて登場し、Facebookの規則によると、今年の6月1日から許可された唯一のものになりました。 長い間、ロシアの銀行を結んで稼いだ融資を撤回することは不可能でした-ロシアはFacebookクレジットを接続する国のリストに載っていませんでした。



稼いだローンを引き出す唯一の方法は、PayPalによる引き出し( 現在 、PayPalからロシアへの法的で白いふわふわした方法はありません )または外国銀行の口座開設です。 しかし、6月27日、ロシアは公式のリストには載っていませんが、支払いを結びつける形で登場しました。 しかし、私たちは本当に望んでおり、準備ができています:-)



支払いをアプリケーションに接続します



あなたはすでにFacebook用の実用的なアプリケーションを持っているという事実から進み、あなたの仕事はクレジットレセプションを接続することです。 そのため、アプリケーションの設定に移動します

[編集]をクリックします。 「Facebook」セクション->クレジットに移動します。 リンクに従って新しい会社登録してください。 組織のフィールドに慎重に入力します。 最も興味深いタブは3番目です。 これは銀行口座のセットアップです。





ほんのいくつかのヒント。 フォームはややバグがあり、間違って入力すると、フィールドの一部が消去されます。 したがって、「OK」ボタンをクリックするのではなく、「別のウィンドウで開く」をクリックすることをお勧めします。エラーが発生した場合でも、データを再度中断する必要はありません。 すべてのフィールドに英語で入力します。 スペースなしでSWIFTフィールドを入力します。





組織を登録した後、アプリケーションでローンを受け取るために組織を追加できます。



ご注意



Facebookのルールに従って、Facebookクレジットの仮想商品のみを販売できます。 個人的には、QRコードを販売することが仮想製品であるかどうかを知りたいと思います(このQRコードを使用して映画を見に行ったり、ピザを注文したりできます:-))。

Facebookの手数料は30%です(これはかなりの量ですが、たとえばOdnoklassnikiの場合よりも少ないです)。 一般に、ソーシャルネットワークでのビジネス販売戦略を計画する際に考慮する必要がある微妙な違いがあります。



Facebookクレジットの一般的な仕組み



それでは、ユーザーが何かを支払うことに決め、大切なボタンをクリックした瞬間にアプリケーションで何が起こるか見てみましょう。





JavaScript API呼び出しFacebook Apiを使用するアプリケーションは、商品の支払い用のダイアログボックスを作成します。

FB.init({appId: <?=$facebookAppID?>, status: true, cookie: true}); function placeOrder() { //    var obj = { method: 'pay', order_info: {"order_id": "<?=$orderId?>"}, purchase_type: 'item' }; FB.ui(obj, callback); } var callback = function(data) { if (data['order_id']) { $("#payment").hide(); $("#result-success").show(); } else if ((data['error_code']) && (data['error_message'].indexOf("User canceled", 0) == -1)) { $("#payment").hide(); $("#result-failure").show(); } else if ((data['error_code']) && (data['error_message'].indexOf("User canceled", 0) != -1)) { $("#result-cancel").show(); } else { $("#result-failure").show(); } };
      
      









Facebookは、注文の詳細を受け取るために、アプリケーションのサーバー側にリクエストを送信します。



お気づきのとおり、Facebookはユーザーがトランザクションごとに1つの製品しか購入できないと想定しています。 しかし、バスケットの中身全体を商品の形で作成することを妨げるものは何もありません。



クライアントのコールバックは、支払いウィンドウを閉じた直後に呼び出されます。 その中で、エラー/キャンセルコードがある場合は処理するか、購入が成功したことをユーザーに祝福する必要があります。



注文を受け入れる



ユーザーが支払いを確認するとすぐに、注文ステータスを変更するためにサーバーに繰り返しリクエストが送信されます。 すべてが問題なければ、あなたの仕事は注文プロセッサを実装することです。 たとえば、ストアの所有者に注文通知を送信したり、データベースにステータス「支払い済み」を表示したりします。



 <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); if (!CModule::IncludeModule("sale") || !CModule::IncludeModule("iblock")) { echo(" -  !"); require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php"); die(); } //    $frontendPath = COption::GetOptionString("sibirix.freshshop", "frontend"); $catalogIblockId = COption::GetOptionString("sibirix.freshshop", "catalogIblockId"); $fbcExchange = COption::GetOptionString("sibirix.freshshop", "exchange"); $api_key = COption::GetOptionString("sibirix.freshshop", "facebook_appid"); $secret = COption::GetOptionString("sibirix.freshshop", "facebook_appsecret"); require_once('facebook.php'); // prepare the return data array $data = array('content' => array()); $request = parse_signed_request($_REQUEST['signed_request'], $secret); if ($request == null) { // handle an unauthenticated request here die("empty request\n"); } //    order_id     float         (      ,    FB).    $payloadData = explode('.', $_REQUEST['signed_request'], 2); $payloadData = base64_url_decode($payloadData[1]); preg_match('/\"order_id\"\:([0-9]*)/', $payloadData, $matches); $stringOrderId = $matches[1]; $payload = $request['credits']; // retrieve all params passed in $func = $_REQUEST['method']; $order_info = json_decode($payload['order_info']); if (!empty($order_info) && isset($order_info->order_id)) { $orderId = (int)$order_info->order_id; } if (empty($orderId)) { //   ( ),     order_id  .      order_id $orderRes = CSaleOrder::GetList(array(), array("COMMENTS" => $stringOrderId, "PAYED" => "N"), false, false, array("*")); $orderData = $orderRes->GetNext(); $orderId = $orderData['ID']; } else { //       $orderData = CSaleOrder::GetByID($orderId); } $basketRes = CSaleBasket::GetList(array(), array( "LID" => SITE_ID, "ORDER_ID" => $orderId), false, false, array("*")); $basket = array(); $description = array(); $itemIds = array(); while ($item = $basketRes->GetNext()) { $basket[] = $item; $description[] = iconv(SITE_CHARSET, "UTF-8", $item['~NAME']) . " - " . number_format($item['QUANTITY'], 0) . "."; if (!empty($item['PRODUCT_ID'])) $itemIds[] = $item['PRODUCT_ID']; } if (count($itemIds)) { $res = CIBlockElement::GetList(array(), array("IBLOCK_ID" => $catalogIblockId, "ID" => $itemIds), false, false, array("DETAIL_PICTURE", "PREVIEW_PICTURE")); while ($item = $res->GetNext()) { if (!empty($item['DETAIL_PICTURE'])) { $pictureId = $item['DETAIL_PICTURE']; break; } if (!empty($item['PREVIEW_PICTURE'])) { $pictureId = $item['PREVIEW_PICTURE']; break; } } } if (isset($pictureId)) { $uploadDir = "/" . COption::GetOptionString("main", "upload_dir", "upload") . "/"; $resFile = CFile::GetList(array(), array("ID" => $pictureId)); $ifile = $resFile->Fetch(); $picture = $ifile; $picture['SRC'] = $uploadDir . $ifile["SUBDIR"] . "/" . $ifile['FILE_NAME']; } $picture = CFacebookShop::getThumbImage($picture, CFacebookShop::PRODUCT_PREVIEW_IMG, SITE_TEMPLATE_PATH.'/images'); if ($orderData['PAYED'] == "Y") { //     $data['content']['status'] = 'settled'; } elseif ($func == 'payments_status_update') { // FB  ,     $status = $payload['status']; // write your logic here, determine the state you wanna move to if ($status == 'placed') { $next_state = 'settled'; $data['content']['status'] = $next_state; //   $ret = CSaleOrder::PayOrder($orderId, "Y"); } // compose returning data array_change_key_case $data['content']['order_id'] = $orderId; } else if ($func == 'payments_get_items') { // FB      $item['title'] = ' №' . $orderId . "    " . COption::GetOptionString("main", "site_name"); $item['price'] = ceil($orderData['PRICE'] / $fbcExchange); $item['description'] = implode(", ", $description); $item['image_url'] = "http://" . COption::GetOptionString("main", "server_name") . $picture; $item['product_url'] = "http://" . COption::GetOptionString("main", "server_name") . $picture; $item['order_id'] = $orderId; CSaleOrder::Update($orderId, array("COMMENTS" => $stringOrderId)); $data['content'] = array($item); } // required by api_fetch_response() $data['method'] = $func; // send data back echo json_encode($data); // you can find the following functions and more details // on http://developers.facebook.com/docs/authentication/canvas function parse_signed_request($signed_request, $secret) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); $sig = base64_url_decode($encoded_sig); $data = json_decode(base64_url_decode($payload), true); if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { error_log('Unknown algorithm. Expected HMAC-SHA256'); return null; } // check signature $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); if ($sig !== $expected_sig) { error_log('Bad Signed JSON signature!'); return null; } return $data; } function base64_url_decode($input) { return base64_decode(strtr($input, '-_', '+/')); } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?>
      
      







支払いシステムを登録する







1C-Bitrixを介した注文専用の支払いを作成したため、簡単です。モジュールをインストールするときに、1C-Bitrix支払いシステムのリストに支払いシステムを登録します。



 //    Facebook Credits function InstallPaysystem() { if (!CModule::IncludeModule("sale") || !CModule::IncludeModule("catalog")) { throw new Exception("Can't include sale and catalog modules"); } $paysystemRes = CSalePaySystem::GetList(array(), array("NAME" => "Facebook Credits")); $paysystem = $paysystemRes->GetNext(); if (!empty($paysystem)) { //  ,   ID COption::SetOptionString($this->MODULE_ID, "paysystemId", $paysystem['ID']); return true; } else { $paysystemId = CSalePaySystem::Add(array( "LID" => SITE_ID, "CURRENCY" => CCurrency::GetBaseCurrency(), "NAME" => "Facebook Credits", "ACTIVE" => "N", "DESCRIPTION" => GetMessage("SHOPBOOK_INSTALL_FBC_DESCR") )); COption::SetOptionString($this->MODULE_ID, "paysystemId", $paysystem['ID']); } return true; }
      
      







出来上がり! 私たちのストアは、Facebookクレジットなどから仮想マネーを受け取る準備ができています。



All Articles