私はしばらくの間試みてきましたが、magento 用の消費者向けアプリを作成するために、ゼロから一歩一歩見つける必要があります。
私は以下を見てきました:
他にもたくさんありますが、実際に何をすべきかは明確ではありません。私が必要とするのは、oAuthでmagentoの残りのAPIを使用する必要があるC#でwinformを作成することです。本当にここで私は少し迷っています。
本当に私が消費者として得た情報は
String callbackUrl = "liconnect://success";
String temporaryCredentialsRequestUrl = "http://domain.xxx/oauth/initiate?oauth_callback=" + HttpUtility.UrlEncode(callbackUrl);
String adminAuthorizationUrl = "http://domain.xxx/admin/oauth_authorize";
String accessTokenRequestUrl = "http://domain.xxx/oauth/token";
String apiUrl = "http://domain.xxx/api/rest";
String consumerKey = "KKKKKKKKKKKKKKK";
String consumerSecret = "SSSSSSSSSSSSSSSSSSS";
「liconnect://success」; どこかにたどり着くことですが、私もそこまで行っていません笑...
oauth_token と oauth_token_secret を保存する必要があるため、保存できるかどうかわかりません。ただし、magento パスがわからない場合は、ログインする必要もあります。ページマジェントは問題があると考えています。私はヘッダーに行うと思います..そのルートに行くことはうまくいきませんでした。
また、投稿を行って System.Security.Cryptography を使用しようとしましたが、うまくいきませんでした。
質問: *確固たる「ハウツー」に一線を画している狂ったプログラマー、または人のためにここにそれを入れることに挑戦したい狂ったプログラマーはいますか? ※同じ質問をしている方が多数いらっしゃいます。
アップデート
これを理解できない人には、回避策があります。そこで、認証を行い、これを非表示のファイルに保存する php スクリプトを作成しました。次に、C# の winform で取得できるログインを作成しました。簡単な例ですが、ここでセキュリティを強化するには、エージェントをチェックして投稿データをソルトする必要があるため、これは単なる例です。初めて、php ファイルに直接アクセスして、セッションを保持するファイルを取得する必要があります。
例:
<?php
/**
* Example of retrieving the products list using Admin account
* via Magento REST API. OAuth authorization is used
* Preconditions:
* 1. Install php oauth extension
* 2. If you were authorized as a Customer before this step, clear browser cookies for 'yourhost'
* 3. Create at least one product in Magento
* 4. Configure resource permissions for Admin REST user for retrieving all product data for Admin
* 5. Create a Consumer
**/
// $callbackUrl is a path to your file with OAuth authentication example for the Admin user
session_start();
//The user name and pass are md5 on the C# side of things and send over like this so it's more then just pass your username and pass
$u="461d544a174bcb5asf2a9fd14576251e169";
$p="c3762e47e025a2e0b6f77afca8da626a81";
if(isset($_POST['username']) && $p == $_POST['pass'] && $u == $_POST['username']){
$callbackUrl = "http://domain.xxx/quick_look.php";
$temporaryCredentialsRequestUrl = "http://domain.xxx/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
$adminAuthorizationUrl = 'http://domain.xxx/admin/oauth_authorize';
$accessTokenRequestUrl = 'http://domain.xxx/oauth/token';
$apiUrl = 'http://domain.xxx/api/rest';
$consumerKey = 'nar78rw5nlkssddksdflklvkezgdria';
$consumerSecret = 'mo0lnht5;sdf;lsdgjcfdpgad5';
//sodoSess is a folder that is hidden and protected via .htaccess
// note.. secure it or else!!
function write_session($name,$value){
$myFile = "sodoSess/".$name.".txt";
$fh = fopen($myFile, 'w') or die("can't open file sodoSess/".$name.".txt");
fwrite($fh, $value);
fclose($fh);
}
function read_session($name){
$myFile = "sodoSess/".$name.".txt";
$fh = fopen($myFile, 'r') or die("can't open file sodoSess/".$name.".txt");
$data = fgets($fh);
fclose($fh);
return $data;
}
if (!isset($_GET['oauth_token']) && read_session('state') == 1) {
write_session('state',0);
}
try {
$authType = (read_session('state') == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
$oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
$oauthClient->enableDebug();
if (!isset($_GET['oauth_token']) && read_session('state')=="") {
$requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
write_session('secret',$requestToken['oauth_token_secret']);
write_session('state',1);
header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);
exit;
} else if (read_session('state') == 1) {
$oauthClient->setToken($_GET['oauth_token'], read_session('secret'));
$accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
write_session('state',2);
write_session('token',$accessToken['oauth_token']);
write_session('secret',$accessToken['oauth_token_secret']);
header('Location: ' . $callbackUrl);
exit;
} else {
$oauthClient->setToken(read_session('token'), read_session('secret'));
//print_r($_POST);
if(isset($_POST["addCustomer"])){
require_once ( "/var/www/html/app/Mage.php" );
umask(0);
Mage::app('default');
$customer = Mage::getModel('customer/customer');
//$customer = new Mage_Customer_Model_Customer();
$password = "321456321456";
$email = $_POST["email"];
$firstname = $_POST["firstname"];
$lastname = $_POST["lastname"];
$street1 = $_POST["street1"];
$street2 = $_POST["street2"];
$city = $_POST["city"];
$postcode = $_POST["postcode"];
$telephone = $_POST["telephone"];
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($email);
//Zend_Debug::dump($customer->debug()); exit;
if(!$customer->getId()) {
$customer->setEmail($email);
$customer->setFirstname($firstname);
$customer->setLastname($lastname);
$customer->setPassword($password);
}
try {
$customer->save();
$customer->setConfirmation(null);
$customer->save();
//Make a "login" of new customer
//Mage::getSingleton('customer/session')->loginById($customer->getId());
echo "added user";
}
catch (Exception $ex) {
//Zend_Debug::dump($ex->getMessage());
}
//Build billing and shipping address for customer, for checkout
$_custom_address = array (
'firstname' => $firstname,
'lastname' => $lastname,
'street' => array (
'0' => $street1,
'1' => $street2,
),
'city' => $city,
'region_id' => '',
'region' => '',
'postcode' => $postcode,
'country_id' => 'US',
'telephone' => $telephone,
);
$customAddress = Mage::getModel('customer/address');
//$customAddress = new Mage_Customer_Model_Address();
$customAddress->setData($_custom_address)
->setCustomerId($customer->getId())
->setIsDefaultBilling('1')
->setIsDefaultShipping('1')
->setSaveInAddressBook('1');
try {
$customAddress->save();
}
catch (Exception $ex) {
//Zend_Debug::dump($ex->getMessage());
}
Mage::getSingleton('checkout/session')
->getQuote()
->setBillingAddress(Mage::getSingleton('sales/quote_address')->importCustomerAddress($customAddress));
//echo $_POST["firstname"]." ".$_POST["lastname"]." <br/>-- ".$_POST["email"]." <br/>MADE IT!";
}else{
/* call class to handle everything */
//for now what is the stock level here?
$resourceUrl = "$apiUrl/products?filter[1][attribute]=sku&filter[1][in]=".$_POST['sku'];
if(isset($_GET['p_id']))$resourceUrl .="/".$_GET['p_id'];
$oauthClient->fetch($resourceUrl, array(), 'GET', array('Content-Type' => 'application/json'));
$productsList = json_decode($oauthClient->getLastResponse());
//print_r($productsList);
foreach($productsList as $item){
$resourceUrl = "$apiUrl/stockitems/".$item->entity_id;
$oauthClient->fetch($resourceUrl, array(), 'GET', array('Content-Type' => 'application/json'));
}
$item = json_decode($oauthClient->getLastResponse());
echo "<h1>currently there is</h1>".round($item->qty);
}
}
} catch (OAuthException $e) {
print_r($e->getMessage());
echo "<br/>";
print_r($e->lastResponse);
}
}else{
echo "fail";
}
?>
今度は反対側に.. Form1.cs の C# (イベント メソッドがある場所)
private void button5_Click(object sender, EventArgs e)
{
var myValue = Microsoft.VisualBasic.Interaction.InputBox("What is the sku of the itme you wish to find", "Look product", "");
if (myValue != "") {
sendPost("&sku=" + myValue);
}
}
public void sendPost(String postData) {
//step 1 talk with site
WebRequest req = WebRequest.Create("http://domain.xxx/quick_look.php");
string MainPostData = "username=YOURUSERNAME_MD5&pass=YOURPASSWORD_MD5";
byte[] send = Encoding.Default.GetBytes(MainPostData + (!String.IsNullOrWhiteSpace(postData) ? "&" + postData.TrimStart('&') : ""));
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = send.Length;
//this is where you salt the data by adjusting the header
//then testing for that adjustment
Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();
WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();
HtmlAgilityPack.HtmlDocument hDoc = new HtmlAgilityPack.HtmlDocument();
webBrowser1.Navigate("about:blank");
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<html><body>" + returnvalue + "</body></html>");
webBrowser1.Stop();
}
そして、そこに行きます。C# winfrom から安全な方法で magento api に接続できるようになりました。これは、(ソルトとエージェントの調整を追加した場合) ハッキングに永遠にかかります。私はまだそれをうまくやる方法が欲しいのですが..これはうまくいきます。