2014-04-15 59 views
1

我们正在构建一个使用Yodlee数据的聚合应用程序,虽然我们所使用的大多数机构都有登录表单,其中有一系列需要信息的字段,有一个机构(节俭储蓄计划,内容服务ID 4479)具有“FieldInfoChoice”元素,其中提供了2个字段可供选择。在试图测试和处理这个问题时,我们使用了Java示例应用程序“Aggregation12”(这是我们迄今用作所有其他Yodlee SOAP交互的实现示例,我们发现其中的here)。Yodlee Aggregation API中具有“FieldInfoChoice”元素的登录表单的正确XML格式

当试图使用控制台应用程序“yconsole.sh”向用户添加“Thrift Savings Plan”帐户时,初始登录永远无法向我们提供输出,而是在它可以生成提示登录信息。从我们的访问日志的XML看起来是这样的:

======================================================= 
= Elapsed: 515 milliseconds 
= In message: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><getLoginFormForContentService xmlns="http://itemmanagement.accountmanagement.core.soap.yodlee.com"><cobrandContext xsi:type="ns1:UserContext" xmlns="" xmlns:ns1="http://common.soap.yodlee.com"><cobrandId xsi:type="xsd:long">10008392</cobrandId><channelId xsi:type="xsd:long">-1</channelId><locale xsi:type="ns2:Locale" xmlns:ns2="http://collections.soap.yodlee.com"><country xsi:type="xsd:string">US</country><language xsi:type="xsd:string">en</language><variant xsi:type="xsd:string"></variant></locale><tncVersion xsi:type="xsd:long">2</tncVersion><applicationId xsi:type="xsd:string">7A318B9CD555B6A3FF82D22CBF3C9F00</applicationId><cobrandConversationCredentials xsi:type="ns3:SessionCredentials" xmlns:ns3="http://login.ext.soap.yodlee.com"><sessionToken xsi:type="xsd:string">10122012_0:90da6f12012f755cfe402d5c72a39086e476df0913209ad6e021120fcf0434c132888648c296a3521f0f6eab3bf76b39018be8bb89278e897ad905e0c10d6288</sessionToken></cobrandConversationCredentials><preferenceInfo xsi:type="ns1:PreferenceInfo"><currencyCode xsi:type="xsd:string">USD</currencyCode><timeZone xsi:type="xsd:string">PST</timeZone><dateFormat xsi:type="xsd:string">MM/dd/yyyy</dateFormat><currencyNotationType xsi:type="ns1:CurrencyNotation">SYMBOL_NOTATION</currencyNotationType><numberFormat xsi:type="ns1:NumberFormat"><decimalSeparator xsi:type="xsd:string">.</decimalSeparator><groupingSeparator xsi:type="xsd:string">,</groupingSeparator><groupPattern xsi:type="xsd:string">###,##0.##</groupPattern></numberFormat></preferenceInfo><fetchAllLocaleData xsi:type="xsd:boolean">false</fetchAllLocaleData><conversationCredentials xsi:type="ns4:SessionCredentials" xmlns:ns4="http://login.ext.soap.yodlee.com"><sessionToken xsi:type="xsd:string">10122012_0:d0f5fdbed4521f52da62dd5b161885c4a6a45ecd6025a4225d026ef39c8b8e662bcf07f0db6dea2c177446e87e11915ffecf1332dbe8645a0655d9f5b4d4940b</sessionToken></conversationCredentials><valid xsi:type="xsd:boolean">true</valid><isPasswordExpired xsi:type="xsd:boolean">false</isPasswordExpired></cobrandContext><contentServiceId xmlns="">4479</contentServiceId></getLoginFormForContentService></soapenv:Body></soapenv:Envelope> 
= Out message: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns27:getLoginFormForContentServiceResponse xmlns:ns27="http://itemmanagement.accountmanagement.core.soap.yodlee.com"><getLoginFormForContentServiceReturn xmlns:ns4="http://common.soap.yodlee.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:Form"><conjunctionOp>AND</conjunctionOp><componentList><elements xsi:type="ns4:FieldInfoChoice"><fieldInfoList><elements xsi:type="ns4:FieldInfoMultiFixed"><name>TSP Account Number (13 Digit)</name><displayName>TSP Account Number (13 Digit)</displayName><isEditable>true</isEditable><isOptional>true</isOptional><isEscaped>false</isEscaped><helpText>134201</helpText><isOptionalMFA>false</isOptionalMFA><isMFA>false</isMFA><defaultValues><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></defaultValues><values><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></values><validValues><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></validValues><displayValidValues><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></displayValidValues><valueIdentifiers><elements>OP_LOGIN</elements><elements>OP_LOGIN1</elements><elements>OP_LOGIN2</elements></valueIdentifiers><valueMasks><elements>LOGIN_FIELD</elements><elements>LOGIN_FIELD</elements><elements>LOGIN_FIELD</elements></valueMasks><fieldTypes><elements>LOGIN</elements><elements>LOGIN</elements><elements>LOGIN</elements></fieldTypes><validationRules><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></validationRules><sizes><elements>20</elements><elements>20</elements><elements>20</elements></sizes><maxlengths><elements>4</elements><elements>4</elements><elements>5</elements></maxlengths><userProfileMappingExpressions><elements xsi:nil="1" /><elements xsi:nil="1" /><elements xsi:nil="1" /></userProfileMappingExpressions></elements><elements xsi:type="ns4:FieldInfoSingle"><name>OP_LOGIN3</name><displayName>User ID</displayName><isEditable>true</isEditable><isOptional>true</isOptional><isEscaped>false</isEscaped><helpText>134200</helpText><isOptionalMFA>false</isOptionalMFA><isMFA>false</isMFA><valueIdentifier>OP_LOGIN3</valueIdentifier><valueMask>LOGIN_FIELD</valueMask><fieldType>LOGIN</fieldType><size>20</size><maxlength>40</maxlength><fieldErrorCode xsi:nil="1" /></elements></fieldInfoList></elements><elements xsi:type="ns4:FieldInfoSingle"><name>PASSWORD</name><displayName>8-character Web Password</displayName><isEditable>true</isEditable><isOptional>false</isOptional><isEscaped>false</isEscaped><helpText>134205</helpText><isOptionalMFA>false</isOptionalMFA><isMFA>false</isMFA><valueIdentifier>PASSWORD</valueIdentifier><valueMask>LOGIN_FIELD</valueMask><fieldType>PASSWORD</fieldType><size>20</size><maxlength>8</maxlength><fieldErrorCode xsi:nil="1" /></elements></componentList><defaultHelpText>3043</defaultHelpText></getLoginFormForContentServiceReturn></ns27:getLoginFormForContentServiceResponse></soapenv:Body></soapenv:Envelope> 
======================================================= 

从控制台应用程序的输出是在这里:

******************** 
Choice: 9 

ITEM MANAGEMENT 
******************** 
1. View Items 
2. View Item 
3. Dump Item 
4. Add Item (Includes MFA) 
5. Edit Item 
6. Remove Item 
7. Refresh Item 
8. Refresh All 
0. Exit Sub-menu 
******************** 
Choice: 4 

Enter Content ServiceId: 4479 
Total time take to fetch the login form(in millis) - 786 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.yodlee.soap.common.FieldInfo; 
at  com.yodlee.sampleapps.helper.FormFieldsVisitor.populateQueue(FormFieldsVisitor.java:115) 
at com.yodlee.sampleapps.helper.FormFieldsVisitor.<init>(FormFieldsVisitor.java:59) 
at com.yodlee.sampleapps.helper.FormUtil.getUserInputFieldInfoList(FormUtil.java:353) 
at com.yodlee.sampleapps.item.AddItem.doAddItem(AddItem.java:97) 
at com.yodlee.sampleapps.YodleeConsole.addItem(YodleeConsole.java:314) 
at com.yodlee.sampleapps.YodleeConsole.itemManagementMenu(YodleeConsole.java:174) 
at com.yodlee.sampleapps.YodleeConsole.loop(YodleeConsole.java:529) 
at com.yodlee.sampleapps.YodleeConsole.main(YodleeConsole.java:574) 

所以,2个问题:

1)什么是这个错误的根源?没有Java示例应用程序如何与这种类型的登录表单一起工作的示例,在我们的应用程序中很难正确处理它。

2)您能否向我们提供填写此表格时应发回的XML格式示例,因为我们可以合理地认为它与提交所有其他机构填写的字段不同我们已经成功地与?

回答

0

@ ethanvizitei-

以下解答您的查询。

  1. 似乎在FormFieldsVisitor.java中的示例应用代码中存在一些问题,我建议您在方法populateQueue(Form form)中进行这些更改。

错误代码:

FieldInfo[] fieldInfoArray = null;     
       if (fieldInfos != null) { 
           fieldInfoArray = (FieldInfo[])fieldInfos.getElements(); 
       }    
       for(int j = 0; j < fieldInfoArray.length; j++) { 
           populateQueue(fieldInfoArray[j]); 
           if(j > 0) { 
               needsLittleOr.add(fieldInfoArray[j]); 
           } 
       } 

正确的代码:

 Object[] fieldInfoArray = null;      
     if (fieldInfos != null) { 
         fieldInfoArray = (Object[])fieldInfos.getElements(); 
     }    
     for(int j = 0; j < fieldInfoArray.length; j++) { 
         populateQueue((FieldInfo)fieldInfoArray[j]); 
         if(j > 0) { 
             needsLittleOr.add((FieldInfo)fieldInfoArray[j]); 
         } 
     } 

此代码应工作,来解释这个问题在这里不正确的代码,它正试图垂头丧气完整的数组,不应该这样做。相反,我们在迭代过程中一个一个地倒下来。

这种变化之后,如果你得到这个错误

java.lang.RuntimeException: Error fetching login form credentials for this ItemId

然后请评论这一部分AddItem.java文件

FormUtil.writeFormHtml(userContext, itemId, 
       getLoginFormCredentialsForItem(userContext, itemId), false, 
       "FilledForm"); 

我们将得到这个SampleApps纠正。

2以下是您需要的示例回复。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://login.ext.soap.yodlee.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://common.soap.yodlee.com" xmlns:ns3="http://itemmanagement.accountmanagement.core.soap.yodlee.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SOAP-ENV:Body> 
    <ns3:addItemForContentService1> 
    <userContext> 
    <cobrandId>xxxxxxxxxxxxxxx</cobrandId> 
    <channelId>-1</channelId> 
    <locale> 
    <country>US</country> 
    <language>en</language> 
    <variant/> 
      </locale> 
      <tncVersion>2</tncVersion> 
      <applicationId>xxxxxxxxxxxxxxxxxxxxxx</applicationId> 
      <cobrandConversationCredentials xsi:type="ns1:SessionCredentials"> 
       <sessionToken>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</sessionToken> 
      </cobrandConversationCredentials> 
      <preferenceInfo> 
       <currencyCode>USD</currencyCode> 
       <timeZone>PST</timeZone> 
       <dateFormat>MM/dd/yyyy</dateFormat> 
       <currencyNotationType>SYMBOL_NOTATION</currencyNotationType> 
       <numberFormat> 
       <decimalSeparator>.</decimalSeparator> 
       <groupingSeparator>,</groupingSeparator> 
       <groupPattern>###,##0.##</groupPattern> 
       </numberFormat> 
      </preferenceInfo> 
      <fetchAllLocaleData>false</fetchAllLocaleData> 
      <conversationCredentials xsi:type="ns1:SessionCredentials"> 
       <sessionToken>xxxxxxxxxxxxxxxxxxxxxxxxxxx</sessionToken> 
      </conversationCredentials> 
      <valid>true</valid> 
      <isPasswordExpired>false</isPasswordExpired> 
      </userContext> 
      <contentServiceId>4479</contentServiceId> 
      <credentialFields> 
      <elements xsi:type="ns2:FieldInfoMultiFixed"> 
       <name>TSP Account Number (13 Digit)</name> 
       <displayName>TSP Account Number (13 Digit)</displayName> 
       <isEditable>true</isEditable> 
       <isOptional>true</isOptional> 
       <isEscaped>false</isEscaped> 
       <helpText>134201</helpText> 
       <isOptionalMFA>false</isOptionalMFA> 
       <isMFA>false</isMFA> 
       <defaultValues/> 
       <values> 
       <elements>1234567</elements> 
       <elements>8765</elements> 
       <elements>78923</elements> 
       </values> 
       <validValues/> 
       <displayValidValues/> 
       <valueIdentifiers> 
       <elements>OP_LOGIN</elements> 
       <elements>OP_LOGIN1</elements> 
       <elements>OP_LOGIN2</elements> 
       </valueIdentifiers> 
       <valueMasks> 
       <elements>LOGIN_FIELD</elements> 
       <elements>LOGIN_FIELD</elements> 
       <elements>LOGIN_FIELD</elements> 
       </valueMasks> 
       <fieldTypes> 
       <elements>LOGIN</elements> 
       <elements>LOGIN</elements> 
       <elements>LOGIN</elements> 
       </fieldTypes> 
       <validationRules/> 
       <sizes> 
       <elements>20</elements> 
       <elements>20</elements> 
       <elements>20</elements> 
       </sizes> 
       <maxlengths> 
       <elements>4</elements> 
       <elements>4</elements> 
       <elements>5</elements> 
       </maxlengths> 
       <userProfileMappingExpressions/> 
      </elements> 
      <elements xsi:type="ns2:FieldInfoSingle"> 
       <name>OP_LOGIN3</name> 
       <displayName>User ID</displayName> 
       <isEditable>true</isEditable> 
       <isOptional>true</isOptional> 
       <isEscaped>false</isEscaped> 
       <helpText>134200</helpText> 
       <isOptionalMFA>false</isOptionalMFA> 
       <isMFA>false</isMFA> 
       <value>apoorv123</value> 
       <valueIdentifier>OP_LOGIN3</valueIdentifier> 
       <valueMask>LOGIN_FIELD</valueMask> 
       <fieldType>LOGIN</fieldType> 
       <size>20</size> 
       <maxlength>40</maxlength> 
      </elements> 
      <elements xsi:type="ns2:FieldInfoSingle"> 
       <name>PASSWORD</name> 
       <displayName>8-character Web Password</displayName> 
       <isEditable>true</isEditable> 
       <isOptional>false</isOptional> 
       <isEscaped>false</isEscaped> 
       <helpText>134205</helpText> 
       <isOptionalMFA>false</isOptionalMFA> 
       <isMFA>false</isMFA> 
       <value>09876tyqw</value> 
       <valueIdentifier>PASSWORD</valueIdentifier> 
       <valueMask>LOGIN_FIELD</valueMask> 
       <fieldType>PASSWORD</fieldType> 
       <size>20</size> 
       <maxlength>8</maxlength> 
      </elements> 
      <elements xsi:type="ns2:FieldInfoSingle"> 
       <name/> 
       <displayName>Verify 8-character Web Password</displayName> 
       <isEditable>true</isEditable> 
       <isOptional>false</isOptional> 
       <isEscaped>false</isEscaped> 
       <helpText>134205</helpText> 
       <isOptionalMFA>false</isOptionalMFA> 
       <isMFA>false</isMFA> 
       <value>09876tyqw</value> 
       <valueIdentifier>PASSWORD</valueIdentifier> 
       <valueMask>LOGIN_FIELD</valueMask> 
       <fieldType>PASSWORD</fieldType> 
       <size>20</size> 
       <maxlength>8</maxlength> 
      </elements> 
      </credentialFields> 
      <shareCredentialsWithinSite>false</shareCredentialsWithinSite> 
      <startRefreshItemOnAddition>false</startRefreshItemOnAddition> 
     </ns3:addItemForContentService1> 
     </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
+0

非常感谢!这应该非常有帮助。 – ethanvizitei