Assuming you're using Ubercart this would be super easy by using hook_order through your own module: http://www.ubercart.org/docs/api/hook_order. I do this exact same thing with one of my other sites.
I can't go into it all, but essentially it flows like:
//make sure the order is complete and payment is received:
function sitetheme_order($op, &$arg1, $arg2) {
{
// on the final update check this order
if ($op == 'update' &&
$arg1->order_status == "payment_received" &&
$arg2 == "completed")
{
In order to keep this short I can't include everything, but I have short loop written that loops through the order until it meets a condition like "Tickets". Then, I'll assign a role and do some other stuff. Like:
//If they bought tickets, assign them the role "TicketHolder"
if ($node->type == 'tickets') {
//I assign some vars, for example the ID of the user role:
$ticketUser = $node->uid;
$customerRole = 16;
//Assign this user the "TickHolder" role after the sale is complete
$data = array(
'uid' => $ticketUser,
'rid' => $customerRole,
);
drupal_write_record('users_roles', $data);
That would be it. In your case you check to see if they purchased rights to create blog content, then assign the role.