The ApplePaySession
object is created as being associated with a certain domain which is associated with the request. When the merchant validation occurs, the merchant session you receive is associated with the URL associated with the domain that you posted when the merchant session was validated. If the top-level frame's domain does not match the one associated with your merchant session then the request will fail as is happening for you.
I would imagine this is to prevent injected frames by malicious scripts attempting to trick the user into paying for goods and services associated with the top-level domain when the merchant session is actually associated with the malicious script.
You may be able to get things to work by having the code in your frame validate the merchant session against the domain associated with the page you know you're going to place the frame in, but this isn't a scenario I've tried.
Updated 12/01/2017
As mentioned in comments below this post, use of Apple Pay with frames is not supported.