奇门ISV测试方案说明文档0706.docx
- 文档编号:30367862
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:16
- 大小:563.22KB
奇门ISV测试方案说明文档0706.docx
《奇门ISV测试方案说明文档0706.docx》由会员分享,可在线阅读,更多相关《奇门ISV测试方案说明文档0706.docx(16页珍藏版)》请在冰豆网上搜索。
奇门ISV测试方案说明文档0706
奇门对接方案说明文档
前言
奇门对接流程:
接口开发
阅读白皮书和测试说明文档,完成所需接口的开发,不仅是接口开发,还包括对应的业务功能。
挡板自测
也称二方联调,首先配置自测的参数,然后完成和奇门挡板的自测。
三方联调
自测通过之后开始三方联调,首先配置联调的参数,然后进行ERP-奇门-WMS联调。
商家验收
联调通过后,在奇门预发环境配置真实的参数,商家发布真实商品进行验收。
系统上线
经奇门确认商家验收通过后,可切换到奇门的正式环境,上线完成。
整个奇门ERP与WMS互相调用的时序图如下所示,分正向和反向。
所谓的正向,我们约定为ERP发起,调用WMS的接口,接口实现方是WMS(如:
商品同步接口,出库单创建和入库单创建接口等);同理,反向即WMS发起,调用ERP的接口,接口实现方是ERP(如:
出库、入库确认接口,缺货通知接口等)。
在挡板自测环节:
(1)ERP测试正向:
ERP发起接口调用,奇门挡板会模拟WMS向ERP返回响应;
(2)ERP测试反向,需要ERP模拟WMS向自己发起调用请求,测试自己的ERP系统是否能接收到请求并正确响应。
WMS挡板自测同理。
如果代码还没有实现调用的方法,可以利用chrome浏览器或者火狐浏览器的插件RestClient来测试。
关于RestClient安装,可以在浏览器应用中心里搜索restclient关键字,随便安装一个即可,chrome浏览器下载应用有时候网络不畅,换个时间段多试几次,火狐相对好一些。
下载界面如下:
测试的方法如下:
1.关于配置参数
首先解释一下奇门的环境和ISV的环境。
奇门总共有三个环境,分别是日常环境(即沙箱环境),预发环境和线上环境,其中日常环境配置的都是测试数据,预发和线上配置的都是真实数据。
对接过程中,参数配置遵循的原则如下。
其中,商家验收通过之后,奇门确认没有问题,可以切换到线上环境:
在奇门的参数配置中主要涉及到下面几个重要参数:
1)ERP_APPKEY
2)ERP_URL
3)WMS_APPKEY
4)WMS_URL
5)CUSTOMER_ID
奇门的作用是针对不同的应用(比如一个ERP)发起的请求,正确的路由给其对应的另一方(比如对应的WMS),如下图。
那么奇门路由的策略是怎样的呢?
下面是一段标准的调用URL的例子:
20:
00:
07&format=xml&app_key=****&v=2.0&sign=abc&sign_method=md5&customerId=****
其中,各个字段的含义,请见下表:
字段名
含义
域名
是奇门测试环境的域名地址,自测和联调的时候都是使用这个域名,注意,千万不要直接写成对方ISV应用的服务地址
Method
调用的方法
timestamp
使用当前调用接口的时间,做encode编码
format
暂时只支持xml
appkey
调用方自己的appkey,即来源appkey
sign
MD5加密,加密策略参看附录1
customerId
是仓储为这个用户分配的唯一的用户帐号,自测和联调的时候由奇门统一分配,等到切到预发和正式环境的时候,使用仓储自己分配真实的值,注意,对于一个WMS,这个customerId一定要保证唯一
言归正传,奇门如何根据这一段URL来做路由的呢?
奇门首先会根据调用url中的customerId来找这个用户配置的ERP信息和对应的WMS信息,因此customerId一定要唯一。
需要配置参数的地方有三个,这里分别介绍一下:
注:
Q:
什么是沙箱appkey,怎么获取?
A:
登陆开放平台,进入控制台,找到对接奇门要使用的应用,应用设置里有沙箱环境的参数。
2.关于挡板自测
2.1ERP端:
2.1.1ERP自测正向调用
ERP端做正向接口调用,奇门测试挡板会模仿WMS返回信息,挡板自测调用地址如下(只需修改红色标示的method方法字段):
20:
00:
07&format=xml&app_key=****&v=2.0&sign=abc&sign_method=md5&customerId=****
注:
app_key是ERP的appkey;
sign签名:
采用md5不可逆加密方法,具体操作见附录2;
v字段:
我们是通过v来区分1.0版本(白皮书v1.5)和2.0版本(白皮书v2.0),不同的v,调用的奇门测试挡板是不一样的,请注意!
暂时只有1.0和2.0两种。
以后进行三方联调之后,v的值如何定义由双方自行协商了。
2.1.2ERP自测反向调用
ERP需模拟WMS发起请求,访问url和WMS调用奇门的url一致,奇门测试环境调用地址如下,其中,需要修改红色标示的method方法字段:
00:
00:
07&format=xml&app_key=*****&v=2.0&sign=abc&sign_method=md5&customerId=****
注:
app_key是wms的appkey;
2.2.WMS端:
2.2.1WMS自测正向调用
WMS需模拟ERP发起请求,访问url和ERP调用奇门的url一致,奇门测试环境调用地址如下,其中,需要修改红色标示的method方法字段:
taobao.qimen.entryorder.query×tamp=2015-04-2600:
00:
07&format=xml&app_key=*****&v=2.0&sign=abc&sign_method=md5&customerId=****
注:
app_key是ERP的appkey。
2.2.2WMS自测反向流程
奇门挡板会模仿ERP返回信息,奇门测试环境调用地址如下(只需修改红色标示的method方法字段):
注:
app_key是WMS的appkey;
附录1sign签名算法:
我们用ERP调用奇门URL演示加密算法:
00:
00:
07&format=xml&app_key=testerp_appkey&v=2.0&sign=abc&sign_method=md5&customerId=stub-cust-code
1、输入参数为
method=taobao.qimen.entryorder.query
timestamp=2015-04-2600:
00:
07
format=xml
app_key=testerp_appkey
v=2.0
sign_method=md5
customerId=test
2、按首字母升序排列
app_key=testerp_appkey
customerId=stub-cust-code
format=xml
method=taobao.qimen.entryorder.query
sign_method=md5
timestamp=2015-04-2600:
00:
07
v=2.0
3、连接字符串
连接参数名与参数值,并在首尾加上secret,此处假设secret=test,如下:
testapp_keytesterp_appkeycustomerIdstub-cust-codeformatxmlmethodtaobao.qimen.entryorder.querysign_methodmd5timestamp2015-04-2600:
00:
07v2.0bodytest
其中:
body用请求中的body内容代替
4、生成签名sign
32位大写MD5值->D06D88CB34B2EC0E5C9BAB396C9542B6
5、拼装URL请求
将所有参数值转换为UTF-8编码,然后拼装,通过浏览器访问该地址,即成功调用一次接口,如下:
00:
00:
07&format=xml&app_key=testerp_appkey&v=2.0&sign=D06D88CB34B2EC0E5C9BAB396C9542B6&sign_method=md5&customerId=stub-cust-code
奇门对于sign签名的校验逻辑:
ERP通过自己的secret做了sign签名,奇门在收到请求的时候,同时也用这个ERP的secret去做签名校验,校验通过之后,再去拿即将路由到的WMS的secret进行重新加密,然后将新的sign发给WMS,由于WMS只知道自己的secret签名,所以奇门在sign上做了一次转换,这样WMS在收到的请求中就可以用自己的secret做一次签名校验。
签名算法示例:
packagemd5;
importjava.io.UnsupportedEncodingException;
import.URLDecoder;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.Map;
/**
*Createdbyjiqian.zzpon2015/7/6.
*/
publicclassQimenSign{
publicstaticvoidmain(String[]args){
Stringurl="
+"method=your_method&"
+"timestamp=2015-04-26%2000:
00:
07&"
+"format=xml&"
+"app_key=your_appkey&"
+"v=your_version&"
+"sign=your_sign&"
+"sign_method=md5&"
+"customerId=your_customerId";
Stringbody="your_body";
StringsecretKey="your_secretKey";
QimenSignsign=newQimenSign();
Stringmd5=sign.sign(url,body,secretKey);
System.out.println(md5);//6A4B6FCFAFE80280565406E110C27DC8
}
publicStringsign(Stringurl,Stringbody,StringsecretKey){
Map
//1.第一步,确保参数已经排序
String[]keys=params.keySet().toArray(newString[0]);
Arrays.sort(keys);
//2.第二步,把所有参数名和参数值拼接在一起(包含body体)
StringjoinedParams=joinRequestParams(params,body,secretKey,keys);
//your_secretKeyapp_keyyour_appkeycustomerIdyour_customerIdformatxmlmethodyour_methodsign_methodmd5timestamp2015-04-2600:
00:
07vyour_versionyour_bodyyour_secretKey
System.out.println(joinedParams);
//3.第三步,使用加密算法进行加密(目前仅支持md5算法)
StringsignMethod=params.get("sign_method");
if(!
"md5".equalsIgnoreCase(signMethod)){
//TODO
returnnull;
}
byte[]abstractMesaage=digest(joinedParams);
//4.把二进制转换成大写的十六进制
Stringsign=byte2Hex(abstractMesaage);
returnsign;
}
privateMap
Map
try{
StringfullUrl=URLDecoder.decode(url,"UTF-8");
String[]urls=fullUrl.split("\\?
");
if(urls.length==2){
String[]paramArray=urls[1].split("&");
for(Stringparam:
paramArray){
String[]params=param.split("=");
if(params.length==2){
requestParams.put(params[0],params[1]);
}
}
}
}catch(UnsupportedEncodingExceptione){
//TODO
}
returnrequestParams;
}
privateStringbyte2Hex(byte[]bytes){
charhexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
intj=bytes.length;
charstr[]=newchar[j*2];
intk=0;
for(bytebyte0:
bytes){
str[k++]=hexDigits[byte0>>>4&0xf];
str[k++]=hexDigits[byte0&0xf];
}
returnnewString(str);
}
privatebyte[]digest(Stringmessage){
try{
MessageDigestmd5Instance=MessageDigest.getInstance("MD5");
md5Instance.update(message.getBytes("UTF-8"));
returnmd5Instance.digest();
}catch(UnsupportedEncodingExceptione){
//TODO
returnnull;
}catch(NoSuchAlgorithmExceptione){
//TODO
returnnull;
}
}
privateStringjoinRequestParams(Map
StringBuildersb=newStringBuilder(secretKey);//前面加上secretKey
for(Stringkey:
sortedKes){
if("sign".equals(key)){
continue;//签名时不计算sign本身
}else{
Stringvalue=params.get(key);
if(isNotEmpty(key)&&isNotEmpty(value)){
sb.append(key).append(value);
}
}
}
sb.append(body);//拼接body体
sb.append(secretKey);//最后加上secretKey
returnsb.toString();
}
privatebooleanisNotEmpty(Strings){
returnnull!
=s&&!
"".equals(s);
}
}
POST发送请求示例:
public static String send(String url, String body) throws Exception {
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
HttpEntity entity = new StringEntity(body, "utf-8");
post.setEntity(entity);
HttpResponse response = client.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
String resEntityStr = EntityUtils.toString(response.getEntity());
return resEntityStr;
//return new String(resEntityStr.getBytes("charset1"), "charset2");//如果出现乱码,需要手动转码
} else {
//TODO
}
return null;
}
附录2联调测试用例
附件中是联调测试用例,ISV在三方联调中,可以参考excel中的场景和顺序进行联调。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 奇门 ISV 测试 方案 说明 文档 0706