我正在为服务设置模拟并尝试将一些数据返回到我的回调页面以保存到数据库表。
这是我用来将模拟发送到回调的代码:
function checkCallback(){
$ch = curl_init("remote.domain.com/callback.php");
$jsonData = [
"success" =>true,
"error" => null,
"response"=> [
"code"=>"ad3f0db2-62b6-4cf4-9027-14829d33cfd2",
"state"=>"my-secret-state-123456789"
]
];
$jsonDataEncoded = json_encode($jsonData);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);
$result = curl_exec($ch);
var_dump($result);
echo $jsonDataEncoded;
curl_close($ch);
}
callback.php:
<?php
var_dump(get_defined_vars());
$un = 'username';
$pw = 'password';
$dsn = "mysql:host=localhost;port=3306;dbname=safelocal;charset=utf8";
$pdo_options = array(PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$db = new PDO($dsn, $un, $pw, $pdo_options);
$updateUserData = $db->prepare('INSERT into `table` (`message`, `extra`) VALUES(:msg, :extra)');
$updateUserData->execute([
':msg' =>$_POST["response"],
':extra' => $_POST["code"]
]);
所有我回来都是一个奇怪的回应:
myfile.php:77:string 'array(4) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(1) {
["{"success":true,"error":null,"response":{"code":"ad3f0db2-62b6-4cf4-9027-14829d33cfd2","state":"my-secret-state-123456789"}}"]=>
string(0) ""
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
}
' (length=291)
所以我们可以在这里看到我的数据,但是我们如何让它作为关键的值对进行操作以便我可以操纵数据?任何指导都表示赞赏。
答案 0 :(得分:1)
我不确定为什么要将数据作为json_string
传递,但显然json字符串被视为url_encoded字符串,并以您在变量中获得的内容进行解码。
如果json不是必需的 - 您可以将数组直接传递给curl_setopt
或使用http_build_query
对其进行编码:
// passing raw array:
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
// passing query string:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($jsonData));
答案 1 :(得分:0)
我不确定这是你想要做什么,或者它是否会起作用,因为它没有经过测试。有几个问题 - Content-Type
标题有多余的单引号,curl请求的url没有协议(尽管这可能不是问题),回调正在扼杀输入数据而不是来自远程脚本的任何响应,并且因为数据在发送之前是json_encoded,因此在访问远程脚本之前应该对其进行解码。希望它有所帮助。
function checkCallback(){
$ch = curl_init("http://remote.domain.com/callback.php");
$jsonData = array(
"success" =>true,
"error" => null,
"response"=> array(
"code"=>"ad3f0db2-62b6-4cf4-9027-14829d33cfd2",
"state"=>"my-secret-state-123456789"
)
);
$jsonDataEncoded = json_encode( $jsonData );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded );
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json" ) );
$result = curl_exec($ch);
curl_close($ch);
echo $result;
}
<?php
$un = 'username';
$pw = 'password';
$dsn = "mysql:host=localhost;port=3306;dbname=safelocal;charset=utf8";
$pdo_options = array(
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$data=json_decode( $_POST );
$msg=$data['response'];
$extra=$data['code'];
$db = new PDO( $dsn, $un, $pw, $pdo_options );
$updateUserData = $db->prepare('INSERT into `table` (`message`, `extra`) VALUES (:msg, :extra)');
$updateUserData->execute( array(
':msg' => $msg,
':extra' => $extra
));
/* send any response data */
print_r( $data );
?>
答案 2 :(得分:0)
您需要为curl设置CURLOPT_HTTPHEADER
选项:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
然后在您收到应使用的数据的脚本中:
$data = json_decode(file_get_contents('php://input'), true);
这种方式在$data
变量中,您将拥有与值相关联的数组。