The documentation does not specify the difference between passing a string and passing an array for the third parameter. We spent two days debugging before reading the C source code to figure out that there is a significant and undocumented difference between the two.
"a=1" and array("a" => 1) are handled very differently!
If you are making a POST/PUT request (or anything with an entity body) then you should pass that as a string.
If you are making a request with a query string, you should pass that as an associative array.
If you pass "a=1" intending that to specify the query string, the generated signature will be invalid -- it will process this as if you were POSTing the content "a=1" instead.