セブンアフィリエイトAPI使おうと思って、とりあえず認証コードPerlで書いた。
とりあえずうまくいってそう。
AmazonのAPI署名と似た感じだが、若干違うからちとハマる。
###
use Digest::SHA;
###共通パラメータ
$ApiUserId='APIユーザーID';
$SecretKey='秘密鍵';
$ResponseFormat='XML';
$RequestUrl='http://api.7netshopping.jp/ws/affiliate/rest/';
$Version='2010-08-01';
###
sub Get7net{
my($url,@list,$gmt,@t,$str,$sig,$url);
$url=$RequestUrl.shift;
@list=@_;
@t=gmtime;
$t[5]+=1900;
$t[4]++;
for(0..4){
$t[$_]='0'.$t[$_] if(length($t[$_])==1);
}
$gmt="$t[5]-$t[4]-$t[3]T$t[2]:$t[1]:$t[0]Z";
push(@list,"ApiUserId=$ApiUserId");
push(@list,"Timestamp=$gmt");
push(@list,"ResponseFormat=$ResponseFormat");
push(@list,"Version=$Version");
@list=sort(@list);
$str="GET|$url|".join('|',@list);
$str=~s/([^A-Za-z0-9\-\_\.\~])/'%'.uc(unpack('H2',$1))/eg;
$sig=Digest::SHA::hmac_sha256_base64($str,$SecretKey);
while(length($sig)%4){
$sig.='=';
}
push(@list,"Signature=$sig");
for(0..$#list){
@t=split(/=/,$list[$_],2);
$t[1]=~s/([^A-Za-z0-9\-\_\.\~])/'%'.uc(unpack('H2',$1))/eg;
$list[$_]="$t[0]=$t[1]";
}
$url=$url.'?'.join('&',@list);
return($url);
}
###
&Get7net('リクエストメッセージ名','key1=value1','key2=value');
↑こんな感じで引数渡すとリクエストURL返す。
注意点としては、
HMAC-SHA256計算用文字列にAPIのパラメータを連結した文字列を使うが、
Amazonの場合はURLエンコード済みのパラメータを連結して、連結後に再エンコード(2重エンコード)するが、
セブンアフィリエイトはURLエンコードしていない生文字列を連結し、連結後に1回だけまとめてエンコードする模様。
これでハマった・・・
連結文字列は、Amazonは「&」だが、「|」で連結する。(これは説明書に書いてある)
サンプルのリクエストURLにはバージョンが含まれていないが、必須の模様。
今のところ全部「2010-08-01」しかないが、
コマンド別にバージョンバラバラになる仕組みのようで、将来的にめんどくなるかも・・・
「ResponseFormat」は省略すると多分XML。