How sell products with Craft and secure the product viewing pages?
I can only really comment on securing content as I haven't used any ecommerce solutions with craft. But as far as that is concerned — one approach would be to add a related entries field-type on the users' field layout (called 'purchasedProducts'). When a user purchases a product you can add that entry to their purchased products via a plugin. You can then check the current entry against the related entries to determine if the user is authorized to view the content.

{% set authorized = false %}
{% if currentUser %}
    {% if entry.id in currentUser.purchasedProducts.ids() %}
        {% set authorized = true %}
    {% endfor %}
{% endif %}

{% if not authorized %}

    {% redirect 403 %} 

    // or display product teaser and purchase button

    &lt;h3&gt;{{ product.title }}&lt;/h3&gt;
    &lt;p&gt;{{ product.description }}&lt;/p&gt;
    &lt;a href="purchase/product/path?id={{ product.id }}"&gt;Purchase&lt;/a&gt;

{% else %}

     {# output entry #}

{% endif %}


To create an index page of all purchased entries, you can loop through the currentUsers purchased entries.

{% if currentUser %}
    &lt;ul&gt;
        {% for entry in currentUser.purchasedProducts %}
            &lt;li&gt;&lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;&lt;/li&gt;
        {% else %}
            &lt;li&gt;You have not purchased any products.&lt;/li&gt;
        {% endfor %}
    &lt;/ul&gt;
{% endif %}


To show all products and add a 'purchase' or 'view' button depending on whether they've purchased the product or not, you can check if the entry is in a 'purchasedProductsIds' array.

{% set purchasedProductsIds = [] %}
{% if currentUser %}
    {% set purchasedProductsIds = currentUser.purchasedProducts.ids() %}
{% endif %}

&lt;ul&gt;
    {% for product in craft.entries.section('products') %}
        &lt;li&gt;
            &lt;h3&gt;{{ product.title }}&lt;/h3&gt;
            &lt;p&gt;{{ product.description }}&lt;/p&gt;
            {% if product.id in purchasedProductsIds %}
                &lt;a href="{{ product.url}}"&gt;View&lt;/a&gt;
            {% else %}
                &lt;a href="purchase/product/path?id={{ product.id }}"&gt;Purchase&lt;/a&gt;
            {% endif %}
    {% endfor %}
&lt;/ul&gt;


Obviously you will also need to add a small plugin to respond to the purchase process (via a hook or event) and update the user's purchasedProducts. Check out usersService saveUser method for more info or search this site for many examples.

As far as ecommerce solutions, I haven't used any with craft so I can't really comment. However, I did find a tutorial on managing your craft inventory with snip cart, which should describe everything you need to create the webhook.