laravel - Laravel SaveJson 到数据库
问题描述
我是 Json 和 API 的新手,我需要你的帮助来理解这个错误。我希望将 JSON 数据保存在数据库表(MpesaStkPush)中,我得到的只是一个错误。
我尝试从 json_encode 更改为 json_decode。
laravel.log
[2021-02-12 19:13:41] local.ERROR: Symfony\Component\HttpFoundation\Response::setContent(): Argument #1 ($content) must be of type ?string, stdClass given
Mpesa控制器
public function stkPush(Request $request){
$amount = $request->totalAmount;
$url ='https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
$curl_post_data =[
'BusinessShortCode' => 174379,
'Password' => $this->lipaNaMpesaPassword(),
'Timestamp'=>Carbon::rawParse('now')->format('YmdHms'),
'TransactionType'=> 'CustomerPayBillOnline',
//'Amount' => $amount,
'Amount' => '1',
'PartyA' =>'254710909198',
'PartyB' =>174379,
'PhoneNumber'=>'254710909198',
'CallBackURL'=> 'https://375e0eb81d88.ngrok.io/api/stk/push/callback/url',
'AccountReference'=>"Wabe Digital Agency",
'TransactionDesc'=> "Lipa Na Mpesa"
];
$data_string =json_encode($curl_post_data);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:Bearer '.$this->newAccessToken()));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
$curl_response = curl_exec($curl);
return json_encode($curl_response);
}
public function mpesaRes(Request $request){
$response =json_decode($request->getContent());
if (property_exists($response, property: 'Body') && $response->Body->stkCallback->ResultCode =='0'){
$merchant_request_id=$response->Body->stkCallback->MerchantRequestID;
$checkout_request_id=$response->Body->stkCallback->CheckoutRequestID;
$trn = new MpesaStkPush;
$trn =MpesaStkPush::where('merchant_request_id', $merchant_request_id)->where('checkout_request_id', $checkout_request_id)->first();
$data=[
'result_desc'=> $response->Body->stkCallback->ResultDesc,
'result_code'=> $response->Body->stkCallback->ResultCode,
'merchant_request_id' => $merchant_request_id,
'checkout_request_id' => $checkout_request_id,
'amount' => $response->Body->stkCallback->CallbackMetadata[0]->Value,
'mpesa_receipt_number'=> $response->Body->stkCallback->CallbackMetadata[1]->Value,
//'b2c_utility_account_available_funds',
'transaction_date' => $response->Body->stkCallback->CallbackMetadata[2]->Value,
'phone_number'=> $response->Body->stkCallback->CallbackMetadata[3]->Value,
];
$trn->fill($data)->save();
. K
解决方案
更加注意日志。在您的情况下,它指出您与类型不匹配(放置一个类实例而不是字符串)
无论如何,我建议您阅读以下 php 函数文档:
https://www.php.net/manual/en/function.json-decode.php
第二个参数是一个技巧:如果它设置为 true,你将得到一个数组而不是 stdClass 实例。
更重要的是,请求实例有更雄辩的方法。
推荐阅读
- groovy - DataGrip org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:
- python - Selenium Remote Webdriver - 无效的会话 ID
- javascript - 如何通过引用而不是值传递父级的反应道具/状态?
- c# - 如何通过剃刀视图在Controller中获取相同类型的参数化值
- c - Libssh 通道请求执行在 C 中失败
- terraform - 通过 Terraform 将 AWS 托管策略附加到自定义角色
- python - Python猜数字游戏(while循环)
- reactjs - React Leaflet Routing Machine:onClick to add Marker after all the waypoints are removed 仅在第二次单击后触发
- computer-science - 我正在阅读 Diana Phelps-Terasaki 的编程语言理论书,并被我的教授提出的这个问题所困扰
- perl - 如何以特定格式重命名文件夹中的多个文件?perl 语法解释