Adaptive Card is Blank
I cannot figure out why my adaptive card is blank in RE. I have used two templates from another user and updated the JSON. I have created a sky application for each flow. I know it has to be something simple, but cannot figure it out.
Any suggestions welcome.
Comments
-
@Wendy Bondeson
First thing to check as debugging your flow is to check the flow run log.in the flow (not editing), check to see when you think the adaptive card is supposed to have trigger that if there is a “run” for that date/time. If you don't see it, then you have a triggering problem, which means when you create the “URL” for the Add-in in developer application area, you made some mistake there.
if you do see run log, click on the date/time, it will take you into the flow run, and tell you where the flow may have failed or if not failed, what response was sent to RE NXT.
0 -
@Wendy Bondeson
This throws me off more times than I care to admit: copied/imported flows are turned off by default.1 -
@Glen Hutson
Oh yes, the obvious/yet not so obvious one, make sure the flow is turned on.I think we all do it from time to time
0 -
@Alex Wong there is no run available. I have tried the test, but it just spins. I don't think it will actually test if I have not been able to make the request via the adaptive card.
0 -
@Glen Hutson I did remember to turn them on.
0 -
@Glen Hutson I did remember to turn them on.
Then it means you did not config the add-in correctly in your developer application area.
send info on the add-in (i.e. URL, and extension point, etc)
0 -
Constituent Record Update - Adaptive card to request constituent record biographical changes and/or updates.
Extension point – Constituent Page Action(Preview)
Constituent Record Update Flow - This application sends the email with the constituent record updates.
Extension point - Constituent Page Action (Preview)
0 -
@Wendy Bondeson
If you wanted a custom tile to show the adaptive card on the constituent page, then you selected the wrong extension point, it should not be Constituent Page Action, it should be Constituent Tile Dashboard. Your URL is also incorrect, it should be0 -
I see what you mean as far as a tile. It is still blank. Must be something with my flow. I'll work on it.
Appreciate your insight!
0 -
@Wendy Bondeson
If you don't see your flow ran at all, then RE NXT is not triggering the flow, therefore will not get anything from the flow, you will need to make sure your flow's trigger URL is correct too.If you do see your flow has run history and nothing show up, then you can go into the run history to see what steps (action) may have failed and apply fixes.
Good Luck
0 -
This was my shared template for the address card. I asked Wendy to look at the JSON script to make sure it was kicking off the 2nd part.
I put a Read Me note in the flow that says: At the end of the "Compose-JSON Card Script" there is an "Action.Webrequest" that requires the AppID from the second flow that you need to create. I made it a variable below if you want to try to put your URL into that string called "AppID from Flow to Invoke It". At the bottom of the Compose JSON is this where I have the ApplicationID as a string variable.
"actions": [
{
"type": "Action.Webrequest",
"title": "Submit Your Updates to CA Records",
"url": "@{variables('ApplicationID')}"
}
]My real one looks like this- with some # signs I put in to disguise some of the numbers
"type": "Action.Webrequest",
"title": "Submit Your Updates to CA Records",
"url": "https://prod-155.westus.logic.azure.com:443/workflows/#########/triggers/manual/paths/invoke?api-version=2016-06-01&sp=/triggers/manual/run&sv=1.0&sig=ceF8uD4jae8RHxnTdB2PQuEHwwzxot-fKK5fYxMMVOc"Wendy- I recommend reading this blog and part 2
1 -
@Alex Wong I got the adaptive card to populate and run with no errors. But I get this error when I submit. I do get the response email with the record updates.
0 -
@Wendy Bondeson
I only build Adaptive Card for displaying custom content. I do not use Adaptive Card for submission and processing as the way Adaptive Card support is now is too limiting. I use modified version of Glen AIO that's somewhat more high code but has higher level of control.Will see if others who have done the submission help, or @Ben Lambert can help (author of the post linked by Carol).
0 -
@Wendy Bondeson- Hi Wendy- that error means there is something wrong in the 2nd part of the flow which is what gathers the address/phone/email that is currently on the record. I'm surprised that you receive an email if that error appears.
My suggestion is to go to that flow and view the latest run which will say failed. Open that last run and see the error message and see where it is failing. It may be an address type that I use that you don't have.
0 -
@Carol Grant I did figure out it was an error with the flow. The error is with validating the uit. I have watched several videos on creating adaptive cards but the Power Automate User Group Monthly Meet up - April 2023 YouTube video was just what I needed. It empowered me to start from scratch and create my own adaptive card and flow from the template ‘Create an Adaptive Card SKY Add-in' and used the template 'Trigger a flow from a SKY Add-in Adaptive Card action’. This validation error is so frustrating. It is only on the second flow.
0 -
@Wendy Bondeson- I'm sorry you had frustrations with my templates. Maybe I should remove them if it was easier for you to build your own.
I didn't expect there would be so many issues.0 -
@Wendy Bondeson
if you are failing the validation, but your flow “mostly” is working as designed, that sounds to me like you are not validating first.First NOTE: The general process for HTTP triggered flow is to validate the UIT (user identity token) before you do anything else, this is for the “just in case” situation where some malicious entity got a hold of your HTTP trigger URL and mess with your database.
2nd NOTE: the reason why your UIT validation is failing is likely b/c of timing, UIT is not valid forever. I don't know how long the validation “stays valid” though. So if someone went to the constituent page (assuming this is where you loaded your custom adaptive card tile), and left the page sitting on the browser (say 1 hour), and then use the adaptive card to submit the form, at this point the UIT is no longer valid.
Generally, what you can do is when UIT validation fail, you can send back a message telling the user to reload the page they are on and retry. But I'm not sure if Adapative card has that ability to send back a custom message.
0 -
@Carol Grant the frustration was not with your adaptive cards. Please don't take them down. Your input has been very helpful. Like I said watching the YouTube video where you went through your adaptive card is when the light turned on for me. The frustration is with my lack of knowledge and understanding, but I am learning.
1 -
@Wendy Bondeson @Alex Wong @Carol Grant
I wanted to chime in with a few clarifying points:
Regarding the UIT expiration - in the Adaptive Card Host SPA (also true for the add-in framework in general), a UIT is fetched on-demand from the host application when needed before invoking any web requests. So in Alex's 2nd note, even though the user sits on the page for a long time before clicking the Submit button on the card, the UIT will be fetched when the button is clicked. The UIT sent to the specified URL (i.e., your second flow) will be "fresh" and not expired.
Regarding UIT validation - Alex's 1st note is correct. The UIT validation step is an important protection again someone manually triggering your flow and should be done before any “real” logic in your flow. As mentioned in the docs, SKY Add-in URLs are visible in the browser including any query params (like your flow's URL which itself contains embedded keys for triggering the flow). Because of that, the add-in URLs can't be treated as sensitive (since any user can technically see them), so you have to compensate by validating on the server. The UIT is issued to "your SKY application", so the Validate UIT step protects your flow real logic from being executed if the flow were ever triggered with a UIT issued to a different SKY application.
So - Carol, you should NOT add an input to your flow to accept the application ID - that defeats the security mechanism (since anyone could call your flow with their UIT and an arbitrary application ID). Your flow should validate that it was triggered with a UIT that could only have been issued to your application. So you should hard-code the expected application ID in each flow, not allow it to be provided by the caller. The Validate UIT step validates the signature of the UIT (was it signed by Blackbaud, has it expired, does it have the right data elements), but it also compares the application ID in the UIT with application ID you expect. So this step ensures that your flow logic will only be executed if the application ID in the UIT matches the ID that you expected when authoring the flow.
(note: the application ID itself isn't sensitive, it's the OAuth client ID, which is just a guid, and is visible in the address bar of the browser).
Hope this helps!
1 -
@Ben Lambert- thanks for replying Ben- I'll remember that and update my template!
0 -
@Ben Lambert I have started over from the Trigger a flow from a SKY Add-in Adaptive Card action, added the App ID and saved the flow and tested before adding any logic. The flow is still failing due to unauthorized UIT. It validates on the first flow. I have several other flows that run and never had an issue with UIT validation.
0 -
@Wendy Bondeson Some things to check:
The initial card (returned by your first flow) should have an action defined that looks something like this:
{
"type": "Action.Webrequest",
"title": "Save",
"url": "https://prod-xxx.westus.logics.........."
}Note that the action url property needn't (and shouldn't) be encoded in any way - just paste in the exact URL for your second flow. If your card's action definition looks different, post some details so we can troubleshoot (don't paste in the full URL of your second flow since it contains the keys needed to invoke the flow).
If your first card's action definition looks correct, the next thing to check is how your second flow is defined. Make sure your second flow's trigger is When a HTTP request is received and that the request body schema is correct. The schema should look something like this:
{
"type": "object",
"properties": {
"uit": {
"type": "string"
},
"context": {
"type": "object",
"properties": {
"recordId": {
"type": "string"
}
}
},
"data": {
"type": "object",
"properties": {
"field1": {
"type": "string"
},
"field2": {
"type": "string"
},
"field3": {
"type": "string"
}
}
}
}
}Based on your notes in this thread, you're using the Constituent Tile Dashboard extension point so the flow will be triggered with a context record ID. So make sure you have the context element in your schema definition as shown above.
In the data element, make sure the fields from your card are listed (replace "field1", "field2", "field3" with your card's field identifiers).
After the trigger, the first action in your second flow should be the Validate a user identity token action. Make sure the "User identity token" field contains the uit property from the flow trigger (you'll see triggerBody()?['uit'] when you hover over the uit token in the designer).
Next, make sure the "Application ID" property is the ID of your SKY application (the application that contains the add-in you've registered). You can get the ID from the SKY Developer portal (it's also known as the OAuth Client ID). This should be a hard-coded string value and should be the same value you provided in your first flow's Validate a user identity token action. It's probably case sensitive (working from memory here) and must match exactly with no trailing spaces or other characters. If in doubt, open your first flow, copy the application ID, then paste it into your second flow.
If everything still looks correct, post some more details so we can troubleshoot (and we may need to engage Blackbaud to help troubleshoot further).
[EDIT: sorry for the ugly JSON formatting - Community mangled what I pasted in]
2 -
@Ben Lambert thank you so much!!!! The issue was not using the right "Application ID". I had created a second application for the flow and was using that Application ID.
1
Categories
- All Categories
- 6 Blackbaud Community Help
- High Education Program Advisory Group (HE PAG)
- BBCRM PAG Discussions
- Luminate CRM DC Users Group
- DC Luminate CRM Users Group
- Luminate PAG
- 186 bbcon®
- 1.4K Blackbaud Altru®
- 389 Blackbaud Award Management™ and Blackbaud Stewardship Management™
- 1K Blackbaud CRM™ and Blackbaud Internet Solutions™
- 14 donorCentrics®
- 355 Blackbaud eTapestry®
- 2.4K Blackbaud Financial Edge NXT®
- 616 Blackbaud Grantmaking™
- 542 Blackbaud Education Management Solutions for Higher Education
- 33 Blackbaud Impact Edge™
- 3.1K Blackbaud Education Management Solutions for K-12 Schools
- 909 Blackbaud Luminate Online® and Blackbaud TeamRaiser®
- 207 JustGiving® from Blackbaud®
- 6.2K Blackbaud Raiser's Edge NXT®
- 3.5K SKY Developer
- 236 ResearchPoint™
- 116 Blackbaud Tuition Management™
- 375 YourCause® from Blackbaud®
- 160 Organizational Best Practices
- 232 The Tap (Just for Fun)
- 31 Blackbaud Community Challenges
- Blackbaud Consultant’s Community
- 19 PowerUp Challenges
- 3 Raiser's Edge NXT PowerUp Challenge: Gift Management
- 4 Raiser's Edge NXT PowerUp Challenge: Events
- 3 Raiser's Edge NXT PowerUp Challenge: Home Page
- 4 Raiser's Edge NXT PowerUp Challenge: Standard Reports
- 4 Raiser's Edge NXT PowerUp Challenge #1 (Query)
- 71 Blackbaud Community All-Stars Discussions
- 47 Blackbaud CRM Higher Ed Product Advisory Group (HE PAG)
- 743 Community News
- 2.8K Jobs Board
- Community Help Blogs
- 52 Blackbaud SKY® Reporting Announcements
- Blackbaud Consultant’s Community
- 19 Blackbaud CRM Product Advisory Group (BBCRM PAG)
- Blackbaud Francophone Group
- Blackbaud Community™ Discussions
- Blackbaud Francophone Group