最近测试了一个带 sha1 签名算法参数的 php 登录接口,本来是用 JAVA 测试接口的,可是后来发现用 JAVA 写的生成 sha1 码和 php 生成的 sha1 码有差别,网上去搜了下,发现好多人说了这个,试了各种方法也无果,因为公司有 C 端,c++ 写出来的算法是 OK 的,便想到 Loadrunner 也是可以测试接口,可以写个方法打包成 dll 给 LR 调用,后来就请同事写了个 dll,里面写了两个方法 SortAndMergerArray 和 StrHas1
Action()
{
int t1;
char a[100]={0};
char *appid="fzmev52qll";
char b[1000]={0};
char c[1000]={0};
char noncestr[100]={0};
char *netid="3290";
char *netcard="123456";
char *scop1="api_cardlogin";
int n=0;
char field[6][100]={
"netbar_id=3290",
"netbar_card=123456",
"noncestr",
"oauth_appid=fzmev52qll",
"scop=api_cardlogin",
"timestamp"
};
//生成一个随机字符串给接口参数noncestr使用
int itera_num1,rand_num1,i1;
char ran[24];
char StrTable1[]="abcdefghijklmnopqrstuvwxyz0123456789";
for (i1=0;i1<=30;i1++){
rand_num1=rand()%62;
strncat(ran,StrTable1+rand_num1,1);
//lr_output_message("当前是%s",ran);
}
lr_save_string(ran,"ran1");
lr_eval_string("{ran1}");
//把生成的随机数替换数组第三个参数值
sprintf(noncestr, "%s%s", "noncestr=",ran);
sprintf(&field[2][0], "%s", noncestr);
//参数化字符串给登录接口参数使用
lr_save_string(appid,"oauth_appid");
lr_eval_string("{oauth_appid}");
lr_save_string(netid,"netbar_id");
lr_eval_string("{netbar_id}");
lr_save_string(netcard,"netbar_card");
lr_eval_string("{netbar_card}");
lr_save_string(scop1,"scop");
lr_eval_string("{scop}");
/*
获取当前时间戳给参数timestamp使用
*/
t1=time();//获取当前系统时间
lr_save_int(t1,"time1");//将t1存成整形参数time1
sprintf(a,"timestamp=%d",t1);//将t1存进数组a
lr_output_message("当前时间是%s",lr_eval_string("{time1}"));
sprintf(&field[5][0], "%s", a);
//调用dll
lr_load_dll("E:\\VuGen Scripts\\SortAndMerger.dll");
for (n=0; n<6; n++)
{
lr_output_message("lsw Field[%d]=%s", n+1, &field[n][0]);
}
//调用dll方法对接口除签名参数进行ascii码排序排接后返回一个字符串
SortAndMergerArray(field,6,b,1000);
lr_output_message("b = %s",b);
//对排序后的生成的字符串加上私钥
strcat(b,"&oauth_secret=!@$#%");
lr_output_message("b = %s",b);
//调用dll中的方法对加上私钥的字符串进行sha1加密
StrHas1(b, c, sizeof(c));
lr_output_message("c = %s",c);
//sha1加密后保存为一个参数给接口参数sign使用
lr_save_string(c,"sign");
lr_eval_string("{sign}");
web_reg_save_param("res1",
"LB=",
"RB=",
"Search=Body",
LAST);
web_reg_find("Search=Body",
"SaveCount=count",
"Text=user_id\":\"21390",
LAST);
web_submit_data("login",
"Action=*****************",
"Method=POST",
"RecContentType=application/json",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTTP",
ITEMDATA,
"Name=netbar_id","Value={netbar_id}", ENDITEM,
"Name=netbar_card","Value={netbar_card}", ENDITEM,
"Name=noncestr", "Value={ran1}", ENDITEM,
"Name=oauth_appid","Value={oauth_appid}", ENDITEM,
"Name=scop","Value={scop}", ENDITEM,
"Name=sign", "Value={sign}", ENDITEM,
"Name=timestamp", "Value={time1}", ENDITEM,
LAST);
lr_convert_string_encoding(lr_eval_string("{res1}"),"utf-8",NULL,"Res1");
if (atoi(lr_eval_string("{count}")) > 0){ //判断如果Welcome字符串出现次数大于0
lr_output_message("测试------返回结果正确"); }//在日志中输出 测试------返回结果正确
else{ //如果出现次数小于等于
lr_error_message("测试------返回结果错误"); //在日志中输出测试------返回结果错误
return(0);
}
return 0;
}