WEBサイトの製作、管理、とかの日記ブログです。

<<   2023年05月   >>
SunMonTueWedThuFriSat
 123456
78910111213
14151617181920
21222324252627
28293031   
新着記事
カテゴリ
過去ログ
コメント
検索
セブンアフィリエイトAPIの認証コード書いてみた
セブンアフィリエイト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。

この記事へのコメント
名前:
URL
コメント:
この記事へのトラックバック :
whblog 1.7